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


49

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

3つの異なるバージョンのWindowsでChromeを閉じようとしています:win7 ultimate、win7 home、winXP

UltimateおよびXPの場合: TSKILL chrome

ホームの下TASKKILL /IM chrome.exe


TSKILL chrome::

(クロームを閉じますが、cmdエラーはありません
が、再起動するとクロームエラーが復元されます)


TASKKILL /IM chrome.exe

(これは、クロムを閉じ、何のクロムそれを再起動エラー、
CMDでなく、エラー:「終了した子プロセス(4-5程度)、のみと力ですることは不可能では/F」)


私にエラーを示さないCHROMEリニューアルの場合、私はCMD子エラーを無視してはなりません?


@MosheKatz:終了コードの例を教えてください。Xボタンを押したときに何が起こるかを知りたい。
neoDev14年

6
/ kill(強制終了)が指定されていない限り、TaskkillはWM_CLOSEメッセージをターゲットプログラムに送信し、プログラムが自身をクリーンアップできるようにします。これをメモ帳でテストします-メモ帳を開いてそこに何かを入力し、「taskkill / im notepad.exe」と入力します。データを保存するプロンプトが表示されます。
スコットリー14年

@ScottRhee:私はすでに/ Fなしで実行しようとしましたが、不適切な終了のようです...私は間違っていますか?
neoDev 14年

@ScottRhee:私もChromeを試しています!時々 、私はそれがこのようなURLの下に黄色の線で「タブを復元する」と言う再起動したとき:backroom.bostonproductions.com/wp-content/uploads/2012/07/...
neoDev

@Roger Taskkill / IM chrome.exeでそのメッセージが表示されないのは奇妙です。とにかく、私はあなたが正しいことをしたと信じています。以下に答えを書いたので、代わりに試してみてください。
スコットリー14年

回答:


43

プログラムを閉じる/終了する適切な方法は、最終的にソフトウェアに依存します。ただし、一般的にベストプラクティスは、WM_CLOSEメッセージを受信するたびにWindowsプログラムを閉じることです。メモリを適切に解放し、ハンドルを閉じます。アプリケーションの終了を通知できる他のメッセージもありますが、各メッセージの処理方法はソフトウェアの作成者次第です。

taskkill /IM process.exe

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

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

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

更新された質問への更新

エラーは無視してください。 Chromeは多くのプロセスを生成します。エラーは、TASKKILLが送信するWM_CLOSEメッセージをプロセスが確認しない場合に発生します。メッセージループのあるプロセスのみがメッセージを受信できます。そのため、メッセージループのないプロセスはそのエラーを生成します。ほとんどの場合、これらのプロセスはChrome拡張機能とプラグインです。

エラーを非表示にするには、出力をキャプチャします

taskkill /IM chrome.exe >nul

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


私は、それを見てください、私の質問を更新しました
neoDev

@Rogerが私の答えを更新しました。
デビッドルーマン14年

> nulはどういう意味ですか?
neoDev 14年

10
> cmd.exeのリダイレクト演算子でありnul、物事が二度と聞かれないスペースが空いています。
デビッドルーマン14年

9

NirCmdをお試しください(ダウンロード:x86 x64

プロセスを適切に閉じるように設計された「closeprocess」コマンドがあります。そのドキュメントによると、アプリを終了するのではなくWM_CLOSE、ターゲットプロセスのすべてのトップレベルウィンドウに送信します。

使用例:

nircmd closeprocess chrome.exe

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


私は、それを見てください、私の質問を更新しました
neoDev

これがうまくいくことがわかりました: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?

その質問への回答が見つかりますhereMicrosoftリンク)。

WM_CLOSE閉じたいウィンドウにメッセージを送信できます。多くのウィンドウWM_CLOSEは、ドキュメントの保存をユーザーに促すために処理します。

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


これをバッチで行う方法はわかりませんが、これにはvbscriptを使用できます。Alt+ F4キーのシミュレーション(signalに相当WM_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

クロムがデフォルトの場合、次を使用します。

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

最小化されたプログラム、またはvbscriptを使用してバックグラウンドで起動できますか?
neoDev 14年

1
@Roger興味があれば、バッチ+ JScriptを単一のファイルに結合する方法に関する私の回答を参照しください。JScriptは、VBScriptができることのほとんどすべてを、より構造化されたCスタイルで実行できます。
デビッドルーマン14年

そして、クロムはvbscriptのいくつかのURLに行くことができますか?
neoDev 14年

特定のアプリケーション(chrome.exe)にフォーカスを移す方法はありますか?
neoDev 14年

はい、試していますが、しばらくして(WScript.Sleep 5000)(WshShell.AppActivate "google chrome")がある場合、この期間中に他のウィンドウをクリックしても、Google chromeが前面に表示されません。 、私は....唯一のツールバー上の焦点を見ることができます
neoDev

3

適切なWM_SYSCOMMANDメッセージ(SC_CLOSEコマンドとして)をプログラムのトップレベルウィンドウに送信できるコマンドラインユーティリティがいくつかあります。少なくとも1つは間もなく言及されると思います。(その後、誰かがAutoItについて言及します。PowerShellおよびでそれを行う方法を示す回答がありますCloseMainWindow()。)

JP SoftwareのTCC(Windows用のコマンドインタープリターおよびコマンドスクリプトプロセッサ)に組み込まれているコマンドラインユーティリティはと呼ばれTASKENDます。


私は、それを見てください、私の質問を更新しました
neoDev

2

わかった、嘘をつかない。私はstackoverflowでこれを見て、それは挑戦的な質問だと思った。すっごくコードを書いて最後の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
  • 保存を有効にする
  • AutoIncrememntファイル名
  • アプリケーションを終了します。

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

これは書くのがとても楽しかったし、答えを実際に見せることよりも、それを仕上げることに満足している。よい一週間を!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.