0

コードのセクションがあります。

:check
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!"
    if /i !desc! == %1         (
      echo !cmd! >>C:\test.txt
    )
    endlocal
  )
)
goto:eof

これはほとんど機能します(これは実際にはバッチファイル内から呼び出される関数です。

call:check processname1.exe
call:check processname2.exe
call:check processname3.exe
etc...

私がやりたいこと (可能であれば) は、ファイルにエコーする代わりに、2 つの変数を作成できるようにしたいということです。何かのようなもの;

processname1.exe processname3.exe   <-- (for each process 'checked' if it IS running, append its name to this variable)
commandlinepath1 commandlinepath2   <-- (for each process 'checked' if it IS running, append its path to this variable)

これが可能で、後でスクリプトでこれらの変数を呼び出すことができる場合は、実行中のプロセスを tskill できるようにしたいと思います (上記の変数を作成できれば十分に簡単です)。プロセス (元のパスにあったコマンド ライン パラメータを使用します。ここで迷子になります。

上記の私のコード(ファイルへの書き込み)。次のような結果が得られます。

"C:\somefolder\someexe.exe" -some_parameter
"C:\some therfolder\someotherexe.exe"
"C:\another older\anotherexe.exe" param1 param2

しかし、私がする必要があるのは、このファイル(または可能であれば変数)の各行を取得して実行することです(各行をWindowsのRUNコマンドにコピーすると機能しますが、CMDを介して実行すると機能しません) .

for ループを使用してファイルを開くことを試みましたが、スクリプトが続行する前にプロセスが終了するのを待機することを除いて、そうです (これらのプロセスはアプリケーションであるため、終了しません)。START .. を使用しようとすると、新しい CMD ウィンドウが読み込まれますか??

私がする必要があるのは(より良いオプションがある場合)です

  • 事前に決定された一連のプロセスについて、それらが実行されているかどうかを確認します
  • あるものを殺します(そうでない場合は無視してください)
  • いくつかのファイルを削除します(私はこれを行うことができます。プロセスを強制終了する理由は、プロセスがファイルを開いたままにし、削除を妨げているためです)
  • 最初に実行していたすべてのプログラムを再度開きます

ありがとう..

4

1 に答える 1

1

直接的な答えではありませんが、すでに wmic を使用しているため、組み込みの機能 (クエリ、開始、停止) を使用すると、目標を達成しやすくなるでしょうか?

私は次のことを思いつきます:

@echo off
setlocal
for %%C in (notepad.exe) do (
    for /f "skip=1 tokens=2 delims==" %%F in ('wmic process where description^="%%C" get commandline /format:list') do (
    REM required to normalize unicode output from WMIC 
    set commandline=%%F
    REM '\=\\' required as wmic treats \ as escape char in query
    call wmic process where commandline='%%commandline:\=\\%%' terminate

    REM do your work here

    call wmic process call create '%%commandline%%'

    )
)

機能: 最初forにプロセス名を提供します。私の例では、それは単純ですがnotepad.exe、 list: で呼び出すか、ファイルから値を提供するfor (process1 process2 process3)ためにそれを置き換えることができます。for /f引用符付きの名前を使用する場合は、次の行から引用符を削除する必要があります ( description^="%%C")。
2 番目forは実際の作業を行います。説明に一致するすべてのプロセスのリストを取得し、それぞれのプロセスを順番に停止および開始します。

試すには、単にbatfile.batメモ帳に入れて実行します。
注: ファイルでメモ帳を開く場合は、絶対パスを指定するか、エクスプローラー (ダブルクリック) を使用して実行します。ここでの問題は現在のディレクトリの問題です。プロセスのいずれかが相対パスを参照している場合にも遭遇する可能性があります (可能性は低いですが、不可能ではありません)。

最後になりましたが、powershell でそれを行うのが最も簡単で、最短で、最も信頼できるものです。

于 2012-08-15T14:52:03.320 に答える