5

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

4

3 に答える 3

11

少なくとも私のために働く:

> taskkill / f / impowershell.exe&&エコーが機能しました|| エコーが機能しません
成功:PID3228のプロセス「powershell.exe」が終了しました。
働いた

> taskkill / f / impowershell.exe&&エコーが機能しました|| エコーが機能しません
エラー:プロセス「powershell.exe」が見つかりません。
動作しません

したがって、適切な終了コード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リダイレクトは、標準エラー出力を広大な無にリダイレクトします。この時点で機能するはずの少なくとも1であるif errorlevel 1かどうかをチェックします。errorlevel

ERRORLEVELnumber最後に実行されたプログラムが指定された数以上の終了コードを返した場合に真の条件を指定します。— <code> help if

0と比較しない限り、通常、 errorlevelwithをチェックすることは非常に悪い考えです。終了コードのセマンティクスは、ゼロ以外のシグナルが失敗することです。ここでのあなたの仮定は、失敗すると戻ってくるということでした。if %errorlevel%==anythingtaskkill1

なぜあなたがこれを無限ループでやっているのか、私は親切に尋ねてもいいですか?taskkillすでにのすべてのインスタンスを強制終了しますitunes.exe。また、遅延なしでタイトループで実行しているため、バッチファイルの実行中にCPUコアが1つ消費される可能性があります。

ETA:あなたの編集を見落としました:なぜ地球上で中括弧ですか?バッチファイル内のブロックは、丸括弧で囲まれています。

于 2009-12-13T11:50:32.540 に答える
0

別の解決策は、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"
于 2009-12-13T11:53:15.387 に答える
0

PowerShellを使用してみませんか?

try
{
    Stop-Process -Name itunes -ErrorAction Stop
    "iTunes is killed"
}
catch
{
    "iTunes not found"
}
于 2016-12-12T16:51:51.447 に答える