web-dev-qa-db-ja.com

プロセスを開始したバッチファイルを作成して、プロセスが終了するのを待つにはどうすればよいですか?

私のコンピューターは最高ではありませんが、プレイするための最小限の要件を満たしています GTA V 。ゲームをより速く実行したかったので、通常の.exeを使用する代わりに、これはゲームの起動に使用するバッチファイルです。

start Steam://rungameid/271590 
timeout 60
wmic process where name="GTA5.exe" CALL setpriority "high priority"
wmic process where name="gtavlauncher.exe" CALL setpriority "idle"
wmic process where name="subprocess.exe" CALL setpriority "idle"

したがって、基本的にゲームの起動後に優先順位が設定されるため、GTA5.exeのみが実行され、CPUはそれに付随する他のプロセスを無視します。さらにスムーズに実行したかったので、Windowsのテーマを「クラシック」に変更すると役立つので、cmdコマンドでテーマを変更できる program をダウンロードして、このスクリプトを作成しました-

START c:\ThemeSwitcher classic
start Steam://rungameid/271590 
timeout 60
wmic process where name="GTA5.exe" CALL setpriority "high priority"
wmic process where name="gtavlauncher.exe" CALL setpriority "idle"
wmic process where name="subprocess.exe" CALL setpriority "idle"
wait process where name="GTA5.exe" 
-----------------------------------------------------------
start c:\ThemeSwitcher MY PC

「----------」には、テーマを通常に変更する前に、プロセスが終了するのをファイルに待機させるものを入れたいので、手動で行う必要はありません。私はグーグルを使用したいくつかのバッチコマンドしか知りません、そして今のところそれは役に立ちません。英語が下手でごめんなさい。

3
Amitb01FUB

次のようなバッチを作成します。

title i'm waiting
start /wait /high cmd /ktitle kill me 
echo This is the end 
pause

startコマンドとwaitパラメーターがどのように機能するかを確認できます

pauseでバッチを作成できます。バッチウィンドウでスペースにヒットした後、次のコマンドを実行します。

あなたはおそらくwaiting for terminate existing processのようなものを探しています:

echo do somthing at start
:start_test
::wait ~6s -1s = 5s
::you can use TIMEOUT 5
call :sleep 6
wmic process where name="notepad.exe" get name |find "notepad.exe">nul
if %errorlevel%==0 goto :start_test
echo do somthing at the end
::pause
goto :eof

:sleep
ping 127.0.0.1 -n %1 > nul
goto :eof

テストプロセスは5秒ごとに存在し、間隔を変更できます。

1
Adam Silenko

新しいプロセスを1つだけ起動する別のアプローチは、PowerShellを使用することです。

Get-Processコマンドレットを使用して、名前でプロセスを見つけることができます。各プロセスオブジェクトにはWaitForExitメソッドがあり、予想どおり、そのプロセスが停止するまでブロックされます。したがって、このPowerShellコマンドは、GTA5.exegtavlauncher.exe、およびsubprocess.exeが終了するまでハングします。

Get-Process 'gta5', 'gtavlauncher', 'subprocess' | % {$_.WaitForExit()}

これにより、それらの名前を持つすべてのプロセスが検索され、それぞれが終了するのを待ちます。プロンプトは、すべてなくなるまで戻ってきません。

これを使用して、PowerShellを起動し、そのコマンドを指定してバッチスクリプトをブロックできます(エイリアスを使用して少し短縮しました)。

powershell -command "gps 'gta5','gtavlauncher','subprocess'|%{$_.WaitForExit()}"

プロセスが終了すると、PowerShellは終了し、バッチスクリプトに制御を戻します。

0
Ben N