web-dev-qa-db-ja.com

コマンドラインからプログラムを閉じる(Windows)

ウィンドウの隅にある "X"閉じるボタンを押すのと同じように、コマンドラインからプログラムを閉じる/終了するための適切な方法は何ですか?

ウィンドウズの3つの異なるバージョンの下でクロムを閉じようとしているIm:win7 ultimate、win7 home、winXP

UltimateとXPの下で:TSKILL chrome

ホームの下:TASKKILL /IM chrome.exe


TSKILL chrome

(それはクロムを閉じます、cmdエラーなし、
しかし、クロムエラー 復元 すると再起動します)


TASKKILL /IM chrome.exe

(再起動してもクロムは閉じられず、クロムエラーは発生しません。
しかし、cmdのエラー: "子プロセスを終了させることは不可能です(約4-5)、/Fの強制によってのみ")


再起動時にクロムでエラーが表示されない場合は、cmd childエラーを無視する必要がありますか?

47
neoDev

プログラムを閉じたり終了したりする正しい方法は、最終的にはソフトウェアによって異なります。ただし、一般的にベストプラクティスは、WindowsプログラムがWM_CLOSEメッセージを受信するたびに閉じることです。メモリを正しく解放してハンドルを閉じます。アプリケーションの終了を知らせるメッセージは他にもありますが、各メッセージの処理方法はソフトウェアの作成者に任されています。

taskkill /IM process.exe

taskkillはWM_CLOSEメッセージを送信します、そしてそれはそれから正しく閉じるべきかどうかはアプリケーション次第です。また、/Tオプションを使って子プロセスにシグナルを送ることもできます。

プロセスを強制的に終了させたい場合にのみ/Fオプションを使用してください。

他のオプションには、Alt + F4キーの送信、PowerShell、またはサードパーティ製アプリケーションの使用などがあります。

更新された質問に更新

無視、エラー。Chromeは多くのプロセスを生成します。プロセスがTASKKILLが送信するWM_CLOSEメッセージを確認しないとき、エラーが発生します。メッセージループを持つプロセスだけがメッセージを受信できます。したがって、メッセージループを持たないプロセスはそのエラーを生成します。最も可能性の高いのは、これらのプロセスがクロムの拡張機能とプラグインです。

エラーを隠すには出力をキャプチャします

taskkill /IM chrome.exe >nul

要約:TASKKILLは、WM_CLOSE実装とリンクしている Microsoft KBに従って、アプリケーションを閉じるためのコマンドライン経由の適切な方法です

41
David Ruhmann

試してください NirCmd (ダウンロード: x86x 64

それは優雅にプロセスを閉じるように設計されている "closeprocess"コマンドを持っています。その文書の通り、アプリを終了させるのではなく、ターゲットプロセスのすべてのトップレベルウィンドウにWM_CLOSEを送ります。

使用例

nircmd closeprocess chrome.exe

これがうまくいかない場合は、私はあなたのアプリケーションが異常なクリーンアップ手順を持っているに違いない。内部で何が起きているのかを見たいのですが、ターゲットアプリケーションが何であるかを教えてください。

5
Scott Rhee
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?

その質問に対する答えは、 hereMicrosoftリンク)にあります。

閉じたいウィンドウにWM_CLOSEメッセージを送ることができます。多くのウィンドウはWM_CLOSEを処理してユーザーに文書の保存を促します。

これを正しく行うツールは @Kill です。 SendMsg も見てください。


これをバッチで実行する方法はわかりませんが、これにはvbscriptを使用できます。シミュレーション Alt + F4 キー(signalWM_CLOSEに相当).

以下のスクリプトを実行してみてください。

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のリストキー名です。

スクリプトを実行すると、メモ帳が開いていくつかの単語が書き込まれ、プログラムを閉じるための信号が送信されます。下の図を参照してください。


その他の質問

最小化したプログラム、またはバックグラウンドでvbscriptを実行できますか?

はい。次のコードを使用してください。

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

詳しくは Run Method を調べてください。

クロムはvbscriptでいくつかのURLにアクセスできますか?

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

chromeがデフォルトの場合は、を使用してください。

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

Source

特定のアプリケーションに焦点を合わせる方法はありますか(chrome.exe)?

例では Here です。

私は他のウィンドウでやっているのとは無関係に、alt + f4をchromeにだけ送りたいのです。

次のコードは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}"
4
stderr

プログラムの最上位ウィンドウに適切な WM_SYSCOMMAND メッセージ(コマンドとしてSC_CLOSEを含む)を送信できるコマンドラインユーティリティがいくつかあります。少なくとも1つは間もなく言及されると確信しています。 (それから誰かがAutoItについて言及するでしょう。それからPowerShellとCloseMainWindow()でそれをする方法を示す答えがあるでしょう。)

Windows用のコマンドインタプリタおよびコマンドスクリプトプロセッサである JPソフトウェアのTCC に組み込まれたコマンドとして提供されるコマンドラインユーティリティは、 TASKENDと呼ばれます。 .

3
JdeBP

さて、うそをつくつもりはないです。私はこれをスタックオーバーフローで見て、それが挑戦的な質問だと思った。最後の2時間はコードを書くのに費やしました。そしてここに…….

以下の手順を実行した後、「スタート」を押した後に「TaskClose notepad.exe」と入力することができます。文書化されていないすべてのメモ帳ファイルをデスクトップに自動的に保存します。それはchrome.exeを自動的に閉じて、復元設定を保存します。

If条件の下で、他のアプリケーションの追加設定を追加および削除することができます。例えば:

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ファイルとバッチファイルは次の手順を実行します。

  • 実行ファイルを収集します。
  • タスクリストから実行可能アプリケーション名を問い合わせます。
  • ウィンドウが開いていることを確認するまで「Alt + TAB(x)」の手順を実行します。
  • それから、それが "Alt + F4"であるか極端な場合であってもローリングコマンドを実行します
  • Alt + F4
  • 保存を有効にする
  • 自動更新ファイル名
  • アプリケーションを終了します。

ReturnAppList.bat: "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: "C:\ windows\system32 \"および "C:\ Users\YourUserName \"にインストールします。

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

TaskClose.vbs: "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

これは書くのがとても楽しいので、実際に答えを見せるよりも完成させる方が嬉しいです。よい一週間を!

2
Rich