Batch でプロセスを強制終了し、成功を報告する
-
19-09-2019 - |
質問
次のバッチファイルがあります。これは iTunes プログラムを終了するため、iPod を接続しても同期されません。(iTunes で設定できることは知っています。)
@echo off
:kill
cls
taskkill /F /IM itunes.exe >nul
if %errorlevel%==1 {
echo iTunes not found.
} else {
echo iTunes is killed.
}
goto kill
しかし >nul
コマンドに応答しません。したがって、デフォルトのコマンドテキストが与えられるだけです。そうそう、私がやりたいことは:
コマンドで指定したように iTunes が見つからない場合は、次のように表示されます。
iTunesが見つかりません
見つかって終了した場合は、
iTunesが死んだ
ヘルプ?エラーレベルは機能しません。これは、 nul
機能していない。
解決
少なくとも私にとってはうまくいきます:
> taskkill /f /im powershell.exe && echo worked || echo not worked SUCCESS: The process "powershell.exe" with PID 3228 has been terminated. worked > taskkill /f /im powershell.exe && echo worked || echo not worked ERROR: The process "powershell.exe" not found. not worked
それで taskkill
は 適切な終了コードを返します。出力のリダイレクトはこれとは何の関係もありません。ただし、失敗のエラー レベルは 128 です。エラーのチェックには適切なイディオムを使用する必要があります。
また、 taskkill
に印刷しています stderr
そのため、リダイレクトするだけでも出力が表示されます。 stdout
. 。上記のコードを次のように書き直すことを検討してください。
taskkill /F /IM itunes.exe >nul 2>&1
if errorlevel 1 (echo iTunes not found.) else (echo iTunes is killed.)
の 2>&1
標準エラー出力を広大な無にリダイレクトします。 if errorlevel 1
をチェックします errorlevel
いる 少なくとも1つ この時点ではこれが機能するはずです:
エラーレベル番号 最後のプログラム実行で、指定された数値以上の終了コードが返された場合に true 条件を指定します。—
help if
一般的なチェック errorlevel
と if %errorlevel%==
0 と比較する場合を除き、これはかなり悪い考えです。終了コードのセマンティクスは次のとおりです。 anything
ゼロ以外の信号の失敗。ここでのあなたの仮定はまさに次のようなものでした taskkill
戻るだろう 1
失敗について。
なぜこれを無限ループで行うのかお伺いしてもよろしいでしょうか? taskkill
すでに殺している 全て の例 itunes.exe
. 。また、遅延のないタイトなループで実行されているため、バッチ ファイルは実行中におそらく 1 つの CPU コアを消費します。
到着予定時刻: あなたの編集を見落としました:いったいなぜ中括弧なのでしょうか?バッチ ファイル内のブロックは丸括弧で区切られます。
他のヒント
別の解決策は、VBScriptで、mykill.vbsとしてコード下に保存
Set objArgs = WScript.Arguments
strProcess = objArgs(0)
strComputer = "."
Set objWMIService = GetObject("winmgmts:{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colProcesses = objWMIService.ExecQuery("Select * from Win32_Process Where Name ='" & strProcess & "'")
If colProcesses.Count = 0 Then
Wscript.Echo strProcess & " is not running."
Else
Wscript.Echo strProcess & " is running."
'Kill the process
For Each objProcess in colProcesses
r=objProcess.Terminate()
WScript.Echo "r is " & r
If r = 0 Then
WScript.Echo strProcess & " killed"
End If
Next
End If
コマンドラインで
c:\test> cscript //nologo mykill.vbs "itunes.exe"
なぜあなたはPowerShellを使用していない?
try
{
Stop-Process -Name itunes -ErrorAction Stop
"iTunes is killed"
}
catch
{
"iTunes not found"
}