質問

次のバッチファイルがあります。これは 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

一般的なチェック errorlevelif %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"
}
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top