OS:Windows XP、Windows 7 64ビット。
毎日のビルドプロセスで使用されるかなり負荷の高いcmdスクリプトがいくつかあります。これらのスクリプトは、他の多数の(ウィンドウが開いた)プロセスを生成します。メインのcmdスクリプトを開始する1つの制御cmdスクリプト、小さな単純なスクリプトがあります。小さな制御スクリプトの目的は、メインスクリプトまたはその子のいずれかが失敗した場合にクリーンアップすることです。これはかなり簡単に実行できます。メインスクリプトとそのすべての子には、一意の識別子で始まるウィンドウタイトルがあります。制御スクリプトは、メインスクリプトとそのすべての子が完了しているはずであると判断すると、タスクリストを使用して、ハングしたプロセスのウィンドウを次のように検索します。
tasklist.exe/FI "WINDOWTITLE eq UniqueIdentifier *"
これはすべてXPで非常にうまく機能しました。次に、Windows7 64ビットを入力します。ここで、メインの.cmdスクリプトまたはその他の.cmd Shellウィンドウがウィンドウタイトルを設定しようとすると、
title UniqueIdentifier Followed By Descriptive Text
Windows 7 64ビットは、タイトルに他のテキストを付加します(具体的には、「Administrator:」など)。先頭に追加されたテキストは信頼できません。だから今私たちは使いたい
tasklist.exe /FI "WINDOWTITLE eq *UniqueIdentifier*"
しかしTHIS FAILSエラーメッセージ「検索フィルタを認識できません」が表示されます。 UniqueIdentifierをポストフィックスとして使用するルートに進んでも機能しません。コマンド
tasklist.exe /FI "WINDOWTITLE eq *UniqueIdentifier"
また、同じエラーメッセージが表示されます。 Microsoftのフィルターでの「ワイルドカード」の概念は、「*」を終端文字として持つことを超えたものではないようです。痛い。
誰かが何か回避策を持っていますか? Pslistはウィンドウタイトルでのフィルタリングを許可していないようです。
/ Vオプションを使用してウィンドウタイトルを出力に含め、結果をFIND(またはFINDSTR)にパイプして結果をフィルター処理できます。
tasklist /v | find "UniqueIdentifier"
tasklist /v | findstr /c:"UniqueIdentifier"
FINDSTRを使用する場合は、/ Cオプションを使用して、検索文字列にスペースを含めることができるようにすることをお勧めします。
/I
オプション。大文字と小文字を区別しない検索が必要な場合。
私の実験によると、taskkillのワイルドカードは文字列の末尾でのみ機能し、他の位置では機能しないようです。これに関する何らかの方法で、Microsoftからのドキュメントが見つかりません。ただし、ドキュメント内のすべての例はこの形式に従います
Successful: notepad*
Fails: notepad*.exe
Fails *notepad*
他の回答で述べたように、taskkillのやや壊れた動作に依存するのではなく、tasklistの出力を解析して必要なものを正確に取得するのが最善です。
私はこれがWindows 10で動作すると思います。これが私のスニペットです
set PROCNAME="Foobar"
tasklist /FI "IMAGENAME eq %PROCNAME%*" 2>NUL | find /I /N %PROCNAME%>NUL
if "%ERRORLEVEL%"=="0" (
echo it is running
)
フィルターのアスタリスクに注意してください。