2014-03-11 20:25:46 +0000 2014-03-11 20:25:46 +0000
50
50

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

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

3つの異なった版の窓の下でクロムを閉めることを試みている私: win7究極の、win7家、winXP

究極とXPの下で: TSKILL chrome

家の下で: TASKKILL /IM chrome.exe

TSKILL chrome.

(それはそれを再起動するときクロム、cmd のエラー、 しかしクロム エラー リストア を閉じます)

TASKKILL /IM chrome.exe:

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

再起動時にchromeがエラーを表示しない場合、cmdの子プロセスのエラーは無視した方がいいのでしょうか?

回答 (5)

45
45
45
2014-03-11 21:51:34 +0000

プログラムを閉じる/終了する適切な方法は、最終的にはソフトウェアに依存します。しかし、一般的には、WM_CLOSEメッセージを受信したときはいつでもWindowsプログラムを閉じるのが最善の方法です。適切にメモリを解放し、ハンドルを閉じる。アプリケーションの終了を知らせるメッセージは他にもありますが、それぞれのメッセージをどのように扱うかはソフトウェアの作者次第です。また、子プロセスにシグナルを送るために、/Tオプションを使用することもできます。

その他のオプションとしては、Alt+F4キーを送信する、PowerShellを使用する、サードパーティアプリケーションを使用する、などがあります。

更新された質問への更新

**エラーは無視してください。エラーは、TASKKILLが送信するWM_CLOSEメッセージをプロセスが認識しない場合に発生します。メッセージループを持っているプロセスだけがメッセージを受け取ることができるので、メッセージループを持っていないプロセスがそのエラーを発生させます。

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

taskkill /IM process.exe

概要: TASKKILLはコマンドラインを使ってWM_CLOSEの実装とリンク先のMicrosoftのKBを参考にするのが正しい方法だと思います。

9
9
9
2014-03-11 21:21:03 +0000

試しに NirCmd (ダウンロード: x86 x64 )

優雅にプロセスを閉じるための「closeeprocess」コマンドを持っています。そのドキュメントによると、アプリを終了させるのではなく、対象プロセスのすべてのトップレベルのウィンドウに WM_CLOSE を送信します。

使用例:

nircmd closeprocess chrome.exe

これが動作しない場合は、アプリケーションに異常なクリーンアップ手順があるのではないでしょうか。中身を見てみたいので、対象のアプリケーションを教えてください。

4
4
4
2014-03-11 23:22:09 +0000
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?

その答えは here (Microsoft link) にあります。

閉じたいウィンドウに `WMCLOSE_ メッセージを送ることができます。多くのウィンドウでは、文書の保存を促すために _WMCLOSE` を扱っています。


バッチでこれを行う方法を知りませんが、このために vbscript を使うことができます。Alt + F4キーのシミュレーション(シグナル@Killに相当)。

実行して以下のスクリプトの動作を見てみましょう。

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

WM_CLOSE はSendKeysのリストキー名です。


追加の質問

**vbscriptでプログラムを最小化したり、バックグラウンドで起動することはできますか?

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

詳細については Here を参照してください。 exe_)? ** Dim iURL Dim objShell iURL = "www.google.com" set objShell = CreateObject("Shell.Application") objShell.ShellExecute "chrome.exe", iURL, "", "", 1 Run Method の例です。

**他のウィンドウとは関係なく、クロームにのみ alt+f4 を送信したいのですが。

3
3
3
2014-03-11 21:18:50 +0000

適切な WM_SYSCOMMAND メッセージを(SC_CLOSEをコマンドとして)プログラムのトップレベルウィンドウに送ることができるコマンドラインユーティリティがいくつかあります。少なくとも一つは間もなく言及されると思います。(そして、誰かがAutoItについて言及するでしょう。)

Windows用のコマンドインタプリタおよびコマンドスクリプトプロセッサである JP Software’s TCC に内蔵されているコマンドラインユーティリティは CloseMainWindow() と呼ばれています。

2
2
2
2014-03-12 01:37:30 +0000

さてさて、嘘をつくつもりはありません。stackoverflowでこれを見て、挑戦的な質問だと思いました。2時間かけてコードを書いてみました。そして、それはここにあります…

以下のステップに従った後、"Start “を押した後に "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+F4 "であろうと、極端な場合には "Alt+F4 "であろうと、ローリングコマンドを実行します
  • Alt+F4
  • 保存を有効にします
  • ファイル名を自動更新します
  • アプリケーションを終了します。

ReturnAppList.bat : install in "C:\windowss\system32” for /f "tokens=10 delims=," %%F in ('tasklist /v /fi "imagename eq %1" /fo csv') do @echo %%~F >>result.txt

TaskClose.bat : install in “C:\windowssystem32” C:\windows\system32\wscript.exe c:\windows\system32\taskclose.vbs %1

TaskClose.bat : install in “C:\windowss\system32” AND “C:\UsersYourUserName”

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

TaskClose.vbs : install in “C:\windowssystem32” &001

これは、書いていて楽しかったし、実際に答えを見せるよりも、書き終えた時の方が嬉しいよ。では、良い一週間を