Tutup program dari baris perintah (Windows)

49

Apa cara yang tepat untuk menutup / keluar program dari baris perintah, mirip dengan menekan tombol tutup "X" di sudut jendela?

Saya mencoba untuk menutup chrome di bawah 3 versi windows yang berbeda: win7 ultimate, win7 home, winXP

Di bawah Ultimate dan XP: TSKILL chrome

Di Bawah Rumah TASKKILL /IM chrome.exe


TSKILL chrome::

(Ini menutup chrome, tidak ada kesalahan cmd,
tetapi mengembalikan kesalahan chrome ketika meluncurkan kembali)


TASKKILL /IM chrome.exe:

(Ini menutup chrome, tidak ada kesalahan chrome ketika meluncurkan ulang,
tetapi kesalahan dalam cmd: "tidak mungkin untuk menghentikan proses anak (sekitar 4-5), hanya dengan paksa dengan /F")


Haruskah saya mengabaikan kesalahan anak cmd jika pada peluncuran ulang chrome tidak menunjukkan kesalahan ?

neoDev
sumber
@ MosheKatz: Bisakah Anda tunjukkan beberapa contoh kode keluar? Saya ingin tahu apa yang terjadi ketika saya menekan tombol X ..
neoDev
6
Taskkill mengirim pesan WM_CLOSE ke program target kecuali / F (pemutusan paksa) ditentukan, untuk memungkinkan program memiliki peluang untuk membersihkan sendiri. Uji ini dengan Notepad - buka notepad dan ketik sesuatu di sana, dan masukkan "taskkill / im notepad.exe". Anda akan melihat permintaan untuk menyimpan data.
Scott Rhee
@ScottRhee: Saya sudah mencoba menjalankannya tanpa / F, tetapi sepertinya tidak benar ... Apakah saya salah?
neoDev
@ScottRhee: Saya mencoba dengan Chrome juga! Kadang-kadang, ketika saya meluncurkan kembali ia mengatakan "mengembalikan tab" dalam garis kuning di bawah URL yang mirip dengan ini: backroom.bostonproductions.com/wp-content/uploads/2012/07/…
neoDev
@Roger Aneh karena saya tidak mendapatkan pesan itu dengan Taskkill / IM chrome.exe. Bagaimanapun, saya percaya Anda melakukan hal yang benar. Saya menulis jawaban di bawah ini jadi tolong coba itu.
Scott Rhee

Jawaban:

43

Cara yang tepat untuk menutup / keluar dari suatu program pada akhirnya tergantung pada perangkat lunaknya. Namun, umumnya praktik terbaik adalah menutup program Windows setiap kali mereka menerima pesan WM_CLOSE. Melepaskan memori dan pegangan penutup dengan benar. Ada pesan lain yang dapat memberi sinyal penutupan aplikasi, tetapi tergantung pada pembuat perangkat lunak bagaimana masing-masing pesan ditangani.

taskkill /IM process.exe

taskkill mengirim pesan WM_CLOSE dan kemudian terserah aplikasi apakah akan ditutup dengan benar. Anda mungkin juga ingin menggunakan /Topsi ini untuk juga menandakan proses anak.

Hanya gunakan /Fopsi jika Anda ingin memaksa penghentian proses.

Pilihan lain termasuk mengirim kunci Alt + F4, menggunakan PowerShell, atau aplikasi pihak ketiga.

Perbarui ke Pertanyaan yang Diperbarui

Abaikan, kesalahannya. Chrome menghasilkan banyak proses. Kesalahan ini disebabkan ketika suatu proses tidak mengakui pesan WM_CLOSE yang dikirim TASKKILL. Hanya proses dengan loop pesan yang akan dapat menerima pesan, oleh karena itu, proses yang tidak memiliki loop pesan akan menghasilkan kesalahan itu. Kemungkinan besar, proses ini adalah ekstensi dan plugin chrome.

Untuk menyembunyikan kesalahan, ambil output

taskkill /IM chrome.exe >nul

Rangkuman: TASKKILL adalah cara yang tepat melalui baris perintah untuk menutup aplikasi sesuai implementasi WM_CLOSE dan Microsoft KB yang saya tautkan .

David Ruhmann
sumber
Saya memperbarui pertanyaan saya, silakan melihatnya
neoDev
@Roger memperbarui jawaban saya.
David Ruhmann
apa artinya> nul?
neoDev
10
>adalah operator pengalihan untuk cmd.exe dan nulmerupakan kekosongan ruang di mana hal-hal pergi ke tidak pernah terdengar lagi.
David Ruhmann
9

Coba NirCmd (Unduh: x86 x64 )

Ini memiliki perintah "closeprocess" yang dirancang untuk menutup proses dengan anggun. Sesuai dokumennya, itu tidak menghentikan aplikasi tetapi mengirim WM_CLOSEke semua jendela tingkat atas dari proses target.

contoh penggunaan:

nircmd closeprocess chrome.exe

Jika ini tidak berhasil, saya yakin aplikasi Anda memiliki prosedur pembersihan yang tidak biasa. Saya ingin melihat apa yang terjadi di dalam jadi tolong beri tahu saya apa aplikasi target Anda.

Scott Rhee
sumber
Saya memperbarui pertanyaan saya, silakan melihatnya
neoDev
Saya menemukan ini berfungsi lebih baik: nircmd win close title "My process title"
user1495323
4
What is the proper way to close/exit programs from command line,
similar to pressing the "X" close button in the corner of the window?

Jawaban untuk pertanyaan itu dapat ditemukan here( tautan Microsoft ).

Anda dapat mengirim WM_CLOSEpesan ke jendela mana saja yang ingin Anda tutup. Banyak jendela menangani WM_CLOSEuntuk meminta pengguna untuk menyimpan dokumen.

Alat yang melakukan ini dengan benar adalah @Kill. Lihat juga SendMsg .


Saya tidak tahu bagaimana melakukan ini dalam batch, tetapi Anda bisa menggunakan vbscript untuk ini. Mensimulasikan tombol Alt+ F4(sama dengan sinyal WM_CLOSE).

Jalankan dan lihat perilaku skrip ini di bawah ini.

Set WshShell = WScript.CreateObject("WScript.Shell")

' Start Notepad.exe
WshShell.Run "%windir%\notepad.exe"

' Select, or bring Focus to a window named `Notepad`
WshShell.AppActivate "Notepad"

' Wait for 4 seconds
WScript.Sleep 4000

WshShell.SendKeys "Foo"
WshShell.SendKeys "{ENTER}"
WshShell.SendKeys "Bar"
WshShell.SendKeys "{ENTER}"
WshShell.SendKeys "{CAPSLOCK}"
WshShell.SendKeys "baz"
WshShell.SendKeys "%{F4}"

Here adalah nama kunci daftar untuk SendKeys.

Ketika Anda menjalankan skrip, notepad terbuka, beberapa kata ditulis dan kemudian sinyal untuk menutup program disampaikan, lihat gambar di bawah.


Pertanyaan tambahan

Bisakah saya memulai program yang diperkecil, atau latar belakang dengan vbscript?

Iya. Gunakan kode berikut:

WshShell.Run "%windir%\notepad.exe", 2

Untuk informasi lebih lanjut, periksa Run Method.

Bisakah chrome membuka beberapa url di vbscript?

Dim iURL  
Dim objShell iURL = "www.google.com"
set objShell = CreateObject("Shell.Application") 
objShell.ShellExecute "chrome.exe", iURL, "", "", 1

Jika chrome adalah default, gunakan:

set objShell = CreateObject("WScript.Shell")
objShell.run(iURL)

Source

Apakah ada cara untuk membawa fokus ke aplikasi tertentu ( chrome.exe )?

Here dalam sebuah contoh.

Saya ingin mengirim alt + f4 HANYA ke chrome, terlepas dari apa yang saya lakukan dengan windows lain.

Kode berikut ini berfungsi pada Windows 8 .

Dim objShell

iURL = "www.google.com.br"

Set WshShell = WScript.CreateObject("WScript.Shell")

WshShell.Run(iURL)

' Select, or bring Focus to Google Chrome
WshShell.AppActivate "Google Chrome"

' Wait for 5 seconds
WScript.Sleep 5000

WshShell.SendKeys "%{F4}"
stderr
sumber
Bisakah saya memulai program yang diperkecil, atau latar belakang dengan vbscript?
neoDev
1
@Roger Jika tertarik, lihat jawaban saya di sini tentang cara menggabungkan Batch + JScript menjadi satu file. JScript dapat melakukan hampir semua hal yang dapat dilakukan VBScript dan dengan gaya C yang lebih terstruktur.
David Ruhmann
dan dapatkah chrome membuka beberapa url di vbscript?
neoDev
apakah ada cara untuk membawa fokus ke aplikasi tertentu (chrome.exe)?
neoDev
Ya saya mencoba dengan itu, tetapi jika setelah beberapa penundaan (WScript.Sleep 5000) saya miliki (WshShell.AppActivate "google chrome"), jika selama periode ini saya klik pada jendela lain, google chrome tidak datang ke depan , saya dapat melihat fokusnya hanya pada bilah alat ....
neoDev
3

Ada beberapa utilitas baris perintah yang dapat mengirim WM_SYSCOMMANDpesan yang sesuai (dengan SC_CLOSEsebagai perintah) ke jendela tingkat atas program. Saya yakin bahwa setidaknya satu akan disebutkan segera. (Kemudian seseorang akan menyebutkan AutoIt. Maka akan ada jawaban yang menunjukkan bagaimana melakukannya dengan PowerShell dan CloseMainWindow().)

Utilitas baris perintah yang datang sebagai perintah bawaan di JP Software TCC , sebuah interpreter perintah dan prosesor skrip perintah untuk Windows, disebut TASKEND.

JdeBP
sumber
Saya memperbarui pertanyaan saya, silakan melihatnya
neoDev
2

Baiklah, tidak akan berbohong. Saya melihat ini di stackoverflow dan berpikir itu adalah pertanyaan yang menantang. Soooo Saya hanya menghabiskan 2 jam terakhir menulis beberapa kode. Dan ini dia ....

Setelah mengikuti langkah-langkah di bawah ini, Anda dapat mengetik "TaskClose notepad.exe" setelah menekan "Start" dan itu akan secara otomatis menyimpan semua file notepad tidak berdokumen ke desktop. Ini akan menutup chrome.exe secara otomatis dan menyimpan pengaturan pemulihan.

Anda dapat menambah dan menghapus pengaturan tambahan untuk aplikasi lain dalam kondisi if. Misalnya:

If InStr(SINGLECLOSEAPPS, WScript.arguments(0)) Then
    SmartSendKeys strOutput,"bypass","%{F4}"

ElseIf InStr(AUTOCLOSEAPPS, WScript.arguments(0)) Then
    SmartSendKeys strOutput,"","%{F4}|%s|{autoname}.txt|%s"

'Example 1: =============================================
ElseIf InStr(WScript.arguments(0), "outlook") Then
    SmartSendKeys strOutput,"","%{F4}" 'Activate Alt+4
'========================================================

'Example 2: =============================================
ElseIf InStr(WScript.arguments(0), "notepad") Then 'I know, already in my autoapps
    SmartSendKeys strOutput,"","%{F4}|%s|{autosave}.txt" 'Activate Alt+4 + Save File + {AutoSave} = autoincrement filename
'========================================================

Else
    SmartSendKeys strOutput,"bypass","%{F4}"
End If

File vbs dan batch melakukan prosedur berikut:

  • Mengumpulkan executable.
  • Permintaan nama aplikasi yang dapat dieksekusi dari daftar tugas.
  • Lakukan prosedur "Alt + TAB (x)" hingga memverifikasi bahwa jendela terbuka.
  • Kemudian Jalankan perintah bergulir apakah itu "Alt + F4" atau bahkan dalam kasus yang ekstrim
  • Alt + F4
  • Aktifkan Simpan
  • Nama File AutoIncrememnt
  • Keluar dari aplikasi.

ReturnAppList.bat: instal di "C: \ windows \ system32 \"

for /f "tokens=10 delims=," %%F in ('tasklist /v /fi "imagename eq %1" /fo csv') do @echo %%~F >>result.txt

TaskClose.bat: instal di "C: \ windows \ system32 \" AND "C: \ Users \ YourUserName \"

C:\windows\system32\wscript.exe c:\windows\system32\taskclose.vbs %1

TaskClose.vbs: instal di "C: \ windows \ system32 \"

Set WshShell = CreateObject("WScript.Shell")
Const SINGLECLOSEAPPS = "chrome.exe|iexplore.exe|firefox.exe"
Dim DEFAULTSAVELOCATION : DEFAULTSAVELOCATION = wshshell.SpecialFolders("Desktop")
Const AUTOCLOSEAPPS = "notepad.exe"

Const WshFinished = 1
Const WshFailed = 2
strCommand = "returnapplist.bat "
Set WshShellExec = WshShell.Exec(strCommand & WScript.Arguments(0))

WScript.sleep 2000

Select Case WshShellExec.Status
    Case WshFinished
    strOutput = LoadStringFromFile("result.txt")
    Case WshFailed
    strOutput = LoadStringFromFile("result.txt")
End Select


'SmartSendKeys(application_name_array, bypassclause, additionalcommands)
'========================
If InStr(SINGLECLOSEAPPS, WScript.arguments(0)) Then
    SmartSendKeys strOutput,"bypass","%{F4}"
ElseIf InStr(AUTOCLOSEAPPS, WScript.arguments(0)) Then
    SmartSendKeys strOutput,"","%{F4}|%s|{autoname}.txt|%s"
Else
    SmartSendKeys strOutput,"bypass","%{F4}"
End If




'SmartSendKeys(application_name_array, bypassclause, additionalcommands)
'========================
Function SmartSendkeys(fArr, LoopCount, RollCommands) 
    Dim x 
    Dim splt : splt = Split(farr, vbCrLf)
    If loopcount = "bypass" Then 
        x = 0
    Else
        x = UBound(splt)
    End If
    a = 0
    For s=0 To x
        If Len(splt(s)) > 1 Then
            Set objShell = WScript.CreateObject("WScript.Shell")
            c = 1 : tabs = ""
            Success = False
            Do Until Success = True
                Success = objShell.AppActivate(Trim(splt(s)))
                If success <> True Then
                    If c = 1 Then 
                        tabs = "{TAB}"
                    Else
                        tabs = "{TAB " & c & "}"
                    End If
                    'wscript.echo "Activating: " & "%" & tabs
                    WshShell.SendKeys "%" & tabs
                    WScript.Sleep 5000
                    c = c + 1
                    If c = 100 Then 
                        WScript.echo "App not found"
                        Exit Function
                    End If
                End If
            Loop
            Dim cmds : cmds = Split(rollcommands, "|")

            For Each cm In cmds
                If InStr(cm, "{autoname}") Then
                    Dim file_ext : file_ext = Split(cm, ".") 
                    cm = DEFAULTSAVELOCATION & "autosave" & a & "." & file_ext(1)
                    a = a + 1
                End If
                WshShell.SendKeys cm
                WScript.sleep 500

            Next
        End If
    Next
End Function

Function LoadStringFromFile(filename)
    Const fsoForReading = 1
    Const fsoForWriting = 2
    Dim fso, f
    Set fso = CreateObject("Scripting.FileSystemObject")
    Set f = fso.OpenTextFile(filename, fsoForReading)
    Dim fulltext : fulltext = f.ReadAll
    LoadStringFromFile = fulltext
    f.Close
    fso.DeleteFile(filename)
End Function

Ini sangat menyenangkan untuk ditulis dan saya lebih senang menyelesaikannya daripada benar-benar menunjukkan jawabannya. Semoga minggu Anda menyenangkan!

Kaya
sumber