cpuの空きを確認してから処理を行うbatファイル
test.exe がコマンドライン引数 1 2 3 4 5 を取るとする。
この実行ファイルを最大で100回繰り返したいときに、
cpuの空きを確認して空きがあれば実行、空きがなければ600秒待機するバッチファイルを作成した。
今回はcpuが小数点切り捨て70%以下の使用率で実行とした。
cpuの使用率を確認する部分は64bit用のものなので
typeperf -sc 1 -si 1 "\processor(_Total)\%% Processor Time" | find ":" >cpu.csv
だが、32bitの場合は
typeperf -sc 1 -si 1 "\processor(_Total)\% Processor Time" | find ":" >cpu.csv
と変更する必要がある。
なお、test.exeのコマンドライン引数は文字列として扱っているため、
実際は小数を入れることも可能。
このように実行する。
testbat.bat test.exe 100 1 2 3 4 5
呼び出し先のtestbat.batは以下の通り。
@echo off @setlocal enabledelayedexpansion set exefile=%1 set /a loop_max=%2 set arg1=%3 set arg2=%4 set arg3=%5 set arg4=%6 set arg5=%7 set /a counter=1 for /l %%i in (0,1,1000000) do ( call :Check_Termination typeperf -sc 1 -si 1 "\processor(_Total)\%% Processor Time" | find ":" >cpu.csv powershell sleep 1 call :Check_CPU call :RunCalc ) pause exit /b :Check_Termination if %counter% gtr %loop_max% ( exit ) else ( ) exit /b :Check_CPU for /f "tokens=1-5 delims=," %%a in (cpu.csv) do ( set v=%%~b ) call :GetINT call :CheckVacancy exit /b :RunCalc rem echo vacancy=%vacancy% if %vacancy%==1 ( set /a counter=counter+1 rem echo %counter% echo 計算%counter%を実行中 start %exefile% %counter% %arg1% %arg2% %arg3% %arg4% %arg5% > output%counter%.txt ) else ( echo cpuの空きに余裕がないので計算実行を待機しています powershell sleep 600 ) exit /b :GetINT for /f "tokens=1* delims=." %%a in ("!v!") do ( set /a cpu=%%~a ) exit /b :CheckVacancy echo cpu=%cpu% %%の使用率 if %cpu% lss 70 ( set /a vacancy=1 ) else ( set /a vacancy=0 ) exit /b :fin exit /b
cpuの使用率を一度cpu.csvに書き出している。