あなたの質問への直接の答え: いいえ、区切り文字として 2 つのスペースを指定することはできません。SET 検索と置換を使用して 2 つのスペースを一意の文字に変更できますが、説明やコマンド ラインに表示されない一意の文字を特定するのは、言うよりも簡単です。
より良い代替手段は、WMIC の出力形式を LIST に変更することです。つまり、1 行に 1 つの値をpropertyName=Value
. 各プロパティ値は変数に格納でき、プロセスの最後のプロパティが記録されると、変数値を使用してアクションを実行できます。WMIC 出力は Unicode を使用するため、各変数割り当ての末尾に CarriageReturn 文字が追加されます。正しい結果を得るには、CarriageReturn を取り除く必要があります。
@echo off
setlocal
for /f "tokens=1* delims==" %%A in ('"wmic process get description, commandline /format:list"') do (
if "%%A"=="CommandLine" (
set "cmd=%%B"
) else if "%%A"=="Description" (
set "desc=%%B"
setlocal enableDelayedExpansion
set "desc=!desc:~0,-1!"
set "cmd=!cmd:~0,-1!"
echo(
echo Do whatever you need to do with the description and command line.
echo description=!desc!
echo command line=!cmd!
endlocal
)
)
注意が必要なことがいくつかあります。
1) 同じイメージ名に対して複数のプロセスが存在する可能性があります。イメージ名 (説明) を使用してプロセスを強制終了すると、すべてのプロセスが削除されます。コマンドラインに基づいて再起動すると、同じ名前の次のプロセスが強制終了されたときに再び強制終了されます。プロセス ID を使用してプロセスを強制終了する方がよいでしょう。
2) プロセスのイメージ名 (説明) がわかっている場合は、WMIC WHERE 句を使用して出力を制限できます。
3) WMIC によって報告されるコマンド ラインは常に信頼できるとは限りません。プロセスは、コマンド ラインとして報告される値を変更できます。
特定の説明のプロセス ID とコマンド ラインを取得するソリューションを次に示します。
編集 - 以下のコードを修正しました
@echo off
setlocal
for /f "tokens=1* delims==" %%A in ('"wmic process where description='MyApp.exe' get processId, commandline /format:list"') do (
if "%%A"=="CommandLine" (
set "cmd=%%B"
) else if "%%A"=="ProcessId" (
set "id=%%B"
setlocal enableDelayedExpansion
set "id=!id:~0,-1!"
set "cmd=!cmd:~0,-1!"
echo(
echo Do whatever you need to do with the process id and command line.
echo process Id=!id!
echo command line=!cmd!
endlocal
)
)
注 - WMIC WHERE 句は SQL 構文を使用します。AND および OR 条件を使用して複雑にすることができ、% および _ をワイルドカードとして使用する LIKE 演算子をサポートします。複雑になる場合は、式全体を二重引用符で囲む必要があると思います。