4

ここ数日、かなり簡単だと思っていたスクリプトに取り組んでいましたが、そうではないようで、その理由がわかりました。私の問題は、それをどのように回避するかです。

私が説明する必要があるバッチ スクリプト:

膨大な量のファイルをある場所から別の場所に移動するなど、さまざまなことを行う cmd.exe で実行されるスクリプトがあります。と呼びましょう movefile.cmd。このスクリプトは機能しますが、時々停止することがあります (非常にまれです - 理由とそのスクリプトには立ち入らないでください)。このスクリプトは常に実行することが重要であるため、cmd.exe を終了し、約 1 時間ごとにスクリプトを再度開くバッチを作成することを考えました。このスクリプトを呼び出しましょうrestartcmd.bat

私がこれを行うことができるので、完全に簡単に聞こえます:

@echo off

:loop

start c:\script\movefile.cmd 

Timeout /nobreak /t 3600

Taskkill cmd.exe

goto loop

しかし、私の新しいスクリプトも cmd.exe で実行されるため、明らかにこれは機能しません。したがって、このプロセスも強制終了されます。

私が試したこと:

そこで、cmd.exe のコピーを作成し、名前を dontkillthis.exe に変更しました。dontkillthis.exe を実行してから、dontkillthis.exe から restardcmd.bat を開きます。これは完全に機能します。しかし、それを行う代わりに、スクリプトをダブルクリックできるようにする必要があります。なんで?できるだけ簡単にする必要があり、restartcmd.bat をスタートアップ フォルダーに入れたいからです。

私は cmd.exe の正確なプロセス ID を取得し、それを閉じて dontkillthis.exe が残るようにするというアイデアを見てきましたが、それを釘付けにすることはできません。現在実行中のバッチファイルを除くすべてのバッチファイルを強制終了する方法について、ここに書かれているすべてのことを試しましたが、動作しません。

混乱しているのか、それとも実際にこれを行うのが少し難しいのかはわかりません。

ここで助けていただければ幸いです。

よろしくお願いします

4

6 に答える 6

1

通常、次のコマンドを使用すると、PID を見つけることができるはずです。残念ながら、そうではありません。

title exclude &tasklist /NH /v /fo csv /FI "WINDOWTITLE ne exclude*" /FI "IMAGENAME eq cmd.exe" /FI "STATUS eq running"

したがって、目標を達成するために、次のコマンドを使用しました。 FIND /I "exclude" 1>NUL

@echo off
TITLE exclude
(for /f "usebackq  tokens=*" %%a in (`tasklist /NH /v /fo csv /FI "IMAGENAME eq cmd.exe" /FI "STATUS eq running"`) do (
  (
    echo %%a | FIND /I "exclude" 1>NUL
  ) || ( 
    for /f "usebackq tokens=2 delims=," %%i in (`echo %%a`) do (
      echo TASKKILL /PID %%~i /f
    )
  )
)
)>_output-taskill.txt
TYPE _output-taskill.txt

1 行ですべてのプロセスを強制終了する別の方法は、コマンドtaskkillでフィルターを使用することです。フィルターは次のようになります。

TASKKILL /F /FI "PID ne XXXX" /FI "IMAGENAME eq cmd.exe" /IM cmd.exe

eq (等しい)

ne (等しくない)

gt (より大きい)

lt (未満)

@echo off
TITLE exclude
(for /f "usebackq tokens=2 delims=," %%a in (`tasklist /NH /v /fo csv /FI "IMAGENAME eq cmd.exe" /FI "STATUS eq running" ^| FIND /I "exclude"`) do (
    echo TASKKILL /F /FI "PID ne %%~a" /FI "IMAGENAME eq cmd.exe" /IM cmd.exe
  )
)>_output-taskill.txt
TYPE _output-taskill.txt
于 2015-09-13T18:15:16.887 に答える
0

また、他の人のための情報のためだけに。タイトルに基づいて他のcmdファイルを停止および開始できることがわかりました。これは、私の質問の解決策の代替手段になります。したがってmovefile.cmd、スクリプトに次の行があるとしましょう: Title "movefile"(" " は重要です)。それから私taskkill /F /FI "WindowTitle eq Administrator: \"movefile"" /Trestartcmd.bat:)に書くことができます

于 2015-04-14T07:30:13.603 に答える
0

の PID を取得する方がはるかに良いでしょうmovefile.cmd。編集できる場合は、を追加してtitle MyMoveFileProcessPID を取得します

for /f "tokens=2" %%i in ('tasklist /v ^|find "MyMoveFileProcess"') do set PID=%%i

次に、それを殺すことができますtaskkill /pid %pid%

を変更する代わりにmovefile.cmd、タイトルから始めることもできます:

start "MyMoveFileProcess" c:\script\movefile.cmd 
于 2015-04-01T11:08:37.417 に答える