Programları komut satırından kapatın (Windows)


49

Programları pencerenin köşesindeki "X" kapat düğmesine basmaya benzer şekilde komut satırından kapatmak / kapatmak için doğru yol nedir?

3 farklı pencere sürümü altında kromu kapatmaya çalışıyorum: win7 ultimate, win7 home, winXP

Ultimate ve XP altında: TSKILL chrome

Ev altında TASKKILL /IM chrome.exe


TSKILL chrome:

(Kromu kapatır, cmd hatası olmaz,
ancak yeniden başlatıldığında krom hatası geri yükleme )


TASKKILL /IM chrome.exe:

(Kromu kapatır, yeniden başlattığında krom hatası olmaz,
ancak cmd'deki hatalar: "alt süreçleri sonlandırmak imkansızdır (yaklaşık 4-5), yalnızca zorla uygulanır /F")


Yeniden başlatma kromu hata göstermezse ?


@MosheKatz: Bana bir çıkış kodu örneği gösterebilir misiniz? X düğmesine bastığımda ne olacağını bilmek istiyorum ..
neoDev

6
Taskkill, programın kendini temizleme şansına sahip olması için / F (zorunlu sonlandırma) belirtilmediği sürece, hedef programa WM_CLOSE mesajını gönderir. Bunu Not Defteri ile test edin - bir not defteri açın ve orada bir şeyler yazın ve "taskkill / im notepad.exe" yazın. Verileri kaydetmek için bir bilgi istemi göreceksiniz.
Scott Rhee

@ScottRhee: / F'siz çalıştırmayı çoktan denedim, ancak henüz iyi bir yakın görünmüyor ... Yanlış mıyım?
neoDev

@ScottRhee: Ben de Chrome ile çalışıyorum! Bazen, yeniden başlattığımda, URL’nin altındaki sarı bir satırda "sekmeleri geri
yükle

@Roger Taskkill / IM chrome.exe ile bu mesajı alamadım garip. Neyse, doğru şeyi yaptığına inanıyorum. Aşağıya bir cevap yazdım, lütfen bunun yerine deneyin.
Scott Rhee

Yanıtlar:


43

Bir programı kapatmanın / kapatmanın doğru yolu sonuçta yazılıma bağlıdır. Ancak, genellikle en iyi uygulama, WM_CLOSE iletisini aldıklarında Windows programlarının kapanmasıdır. Hafızanın doğru şekilde boşaltılması ve tutamaçların kapatılması. Uygulamanın kapandığını işaret edebilecek başka mesajlar var, ancak her bir mesajın nasıl ele alındığı yazara bağlı.

taskkill /IM process.exe

taskkill, WM_CLOSE mesajını gönderir ve ardından uygulamanın uygun şekilde kapatılıp kapatılmayacağı size bağlıdır. /TAyrıca alt işlemleri işaret etmek için seçeneği kullanmak isteyebilirsiniz .

Bu /Fseçeneği yalnızca işlemin sonlandırılmasını zorlamak istiyorsanız kullanın.

Diğer seçenekler arasında Alt + F4 tuşlarının PowerShell veya 3. taraf uygulamalarını kullanarak gönderilmesi bulunur.

Güncellenmiş Soruyu Güncelle

Görmezden gel, hataları. Chrome birçok işlem üretir. Hatalar, bir işlem TASKKILL'in gönderdiği WM_CLOSE mesajını onaylamadığında ortaya çıkar. Yalnızca bir mesaj döngüsüne sahip işlemler mesajı alabilir; bu nedenle, bir mesaj döngüsüne sahip olmayan işlemler bu hatayı oluşturur. Büyük olasılıkla, bu işlemler krom uzantıları ve eklentileridir.

Hataları gizlemek için çıktıyı yakalamak

taskkill /IM chrome.exe >nul

Özet: TASKKILL, WM_CLOSE uygulamasına ve bağlandığım Microsoft KB'ye göre uygulamaları kapatmak için komut satırı yoluyla uygun yoldur .



@Roger cevabımı güncelledi.
David Ruhmann

nul ne demek?
neoDev

10
>cmd.exe'nin yönlendirme işlecidir ve nulişlerin bir daha asla duyulmayacağı yerin boşluğudur.
David Ruhmann

9

NirCmd'i deneyin (İndir: x86 x64 )

İşlemleri incelikle kapatmak için tasarlanmış "closeprocess" komutuna sahiptir. Belgesine göre, uygulamaları sonlandırmaz, ancak WM_CLOSEhedef işlemin tüm üst düzey pencerelerine gönderir .

kullanım örneği:

nircmd closeprocess chrome.exe

Bu işe yaramazsa, başvurunuzun olağandışı bir temizleme prosedürü olduğuna bahse girerim. İçeride ne olduğunu görmek istiyorum, lütfen hedef uygulamanızın ne olduğunu bana bildirin.



Bunu daha iyi çalışmak için buldum: nircmd "My process title"
başlıkını kapattı

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?

Bu sorunun cevabı bulunabilir here( Microsoft link ).

WM_CLOSEKapatmak istediğiniz herhangi bir pencereye mesaj gönderebilirsiniz . Birçok pencere WM_CLOSE, kullanıcıdan belgeleri kaydetmesini istemek için kullanılır.

Bunu doğru yapan bir araç @Kill. Ayrıca bakınız SendMsg .


Bunu toplu halde nasıl yapacağımı bilmiyorum, ancak bunun için vbscript'i kullanabilirsiniz. Simülasyon Alt+ F4tuşları (sinyale eşittir WM_CLOSE).

Çalıştırın ve aşağıdaki betiğin davranışına bakın.

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 SendKeys için liste anahtarı adlarıdır.

Komut dosyasını çalıştırdığınızda, not defteri açık, bazı kelimeler yazılır ve ardından programı kapatmak için bir sinyal verilir, aşağıdaki resme bakın.


Ek sorular

Küçültülmüş bir programı veya vbscript ile arka plan başlatabilir miyim?

Evet. Aşağıdaki kodu kullanın:

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

Daha fazla bilgi için kontrol edin Run Method.

Krom vbscript'te bir url'ye gidebilir mi?

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

Krom varsayılan ise, şunu kullanın:

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

Source

Odağı belirli bir uygulamaya ( chrome.exe ) getirmenin bir yolu var mı ?

Here bir örnekte.

SADECE krom + f4 göndermek istiyorum, bağımsız olarak diğer pencerelerle yapıyorum.

Aşağıdaki kod Windows 8'de çalışır .

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}"

Küçültülmüş bir programı veya vbscript ile arka plan başlatabilir miyim?
neoDev

1
@Roger Eğer ilgileniyorsanız, Batch + JScript'in tek bir dosyada nasıl birleştirileceği konusundaki cevabımı görün . JScript, VBScript'in yapabileceği her şeyi ve daha yapısal bir C stilinde yapabilir.
David Ruhmann

ve krom vbscript'te bir url'ye gidebilir mi?
neoDev

Odağı belirli bir uygulamaya (chrome.exe) getirmenin bir yolu var mı?
neoDev

Evet bununla çalışıyorum, ancak bazı gecikmelerden sonra (WScript.Sleep 5000) varsa (WshShell.AppActivate "google chrome") varsa, bu süre zarfında başka bir pencereye tıklarsam, google chrome öne çıkmazsa , odağını sadece araç çubuğunda görebiliyorum ....
neoDev

3

Bir programın üst düzey penceresine WM_SYSCOMMAND( SC_CLOSEkomutla birlikte) uygun bir mesaj gönderebilen bazı komut satırı yardımcı programları vardır . Eminim en az bir taneden kısa bir süre bahsedecek. (Sonra birisi AutoIt'ten bahsedecektir. Sonra PowerShell ve ile nasıl yapılacağını gösteren bir cevap olacaktır CloseMainWindow().)

JP Yazılım'ın TCC'sinde , Windows için bir komut yorumlayıcısı ve komut dosyası işlemcisi olan yerleşik bir komut olarak gelen komut satırı yardımcı programı çağrılır TASKEND.



2

Tamam, yalan söylemeyeceğim. Bunu yığın akışında gördüm ve zorlu bir soru olduğunu düşündüm. Soooo Sadece son 2 saatimi kod yazarak geçirdim. Ve işte burada ....

Aşağıdaki adımları uyguladıktan sonra, "Başlat" ı tıkladıktan sonra "TaskClose notepad.exe" yazabilirsiniz ve otomatik olarak tüm belgelenmemiş not defteri dosyalarını masaüstüne kaydeder. Chrome.exe dosyasını otomatik olarak kapatır ve geri yükleme ayarlarını kaydeder.

If koşulları altında diğer uygulamalar için ek ayarlar ekleyebilir veya kaldırabilirsiniz. Örneğin:

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

Vbs ve toplu iş dosyaları aşağıdaki işlemleri gerçekleştirir:

  • Yürütülebilir dosyayı toplar.
  • Yürütülebilir uygulama adlarını görev listesinden sorgular.
  • Pencerenin açık olduğunu doğrulayana kadar "Alt + TAB (x)" prosedürünü gerçekleştirir.
  • Sonra yuvarlanma komutlarını "Alt + F4" veya aşırı durumlarda bile çalıştırır
  • Alt + F4
  • Kaydet'i etkinleştir
  • AutoIncrememnt Dosya Adı
  • Çıkış uygulaması.

ReturnAppList.bat: "C: \ windows \ system32 \" içine kurun

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

TaskClose.bat: "C: \ windows \ system32 \" VE "C: \ Users \ Kullanıcı Adınız \" içine kurun

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

TaskClose.vbs: "C: \ windows \ system32 \" içine kurun

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

Bu yazı yazmak çok eğlenceliydi ve onu bitirmekten mutluyum, cevabı göstermekten çok. İyi haftalar!

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.