1

これは可能ではないと思いますが、これを行うか、別の方法を使用できるようにしたいと思います...

バッチ ファイルがあります。

for /f "usebackq tokens=*" %%a in (`wmic process get description, commandline`) do (
*Some Code*
)

各行から 2 つの回答を取得し、それらを個別に使用できるようにする必要があります (基本的に、説明を使用してプロセスが実行されているかどうかを確認し、プロセスを強制終了してファイルのクリーンアップ作業を行った後、リロードします)。コマンドラインパラメータを含む元のプロセス。

終了/再開する必要があるプロセスの出力の一例は次のようになります。

"C:\some folder\some other folder\some_application" -cmd_parameter                process_name.exe

説明は複数のスペースで明確に定義されていることに注意してください


for /f "tokens=* delims=  "    <--(The delims is TWO spaces, not space OR space)

より良いかもしれない別の方法は、複数のスペースのすべてのインスタンスを特殊文字 (つまり、プロセスまたはパスで使用されていないもの) に置き換えてから、それを区切り文字として使用することです...かどうかはわかりませんがそれも可能です..

プロセス名を取得できる限り、代替方法も受け入れます(事前に定義されたプロセスのリスト、exeへのフルパス、および指定されたコマンドラインパラメーターを確認するため.

皆さんありがとう

4

3 に答える 3

2

あなたの質問への直接の答え: いいえ、区切り文字として 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 演算子をサポートします。複雑になる場合は、式全体を二重引用符で囲む必要があると思います。

于 2012-08-14T17:23:49.767 に答える