2022/08/04

[note][batch] 某著名程式跑分相關的batch...

真的覺得越來越瘋狂了,進業界這麼久,以為已經看很多了,結果新的案子看到更瘋狂的。
果然沒有最糟,只有更糟。
這次是為了跑某著名程式跑分特別寫了兩段batch。我真的覺得我該轉行了。
##ReadMore## 第一段batch,負責執行跑指定次數
for /f "tokens=* USEBACKQ" %%F IN (`call powershell Get-Date -Format "yyyyMMdd_HHmmss"`) do (SET tmpt=%%F)

set log_path=%~dp0TestResult_%tmpt%

echo off
If EXIST %log_path% (echo the path is exist) else (md %log_path%)
echo on

cd xxx3DM

timeout 600 /nobreak

SETLOCAL ENABLEDELAYEDEXPANSION

for /l %%x in (1, 1, 6) do (
SET TEMP_NUM=00%%x
SET TEMP_NUM=!TEMP_NUM:~-3!
3DM.exe --definition=%~dp0firestrike_no_demo.3dmdef --loop=1 --out=%log_path%\3DFS_Result_!TEMP_NUM!.3dmark-result --export=%log_path%\3DFS_Result_!TEMP_NUM!.xml
)

ENDLOCAL

:end
pause
  • 為了避免有人偷懶直接用,我故意修掉一些文字不能直接用
  • 為了要把結果存起來,開folder把結果丟進去,以好整理。又怕互相覆蓋,需要增加時間碼
  • 之前的經驗,由於command line下的用date去做日期碼會有地區造成的格式問題,臨時查到使用powershell回傳指定格式回傳時間,並用for/f做取出,這樣才不用開文件儲存。
  • 由於該軟體的bug,參數下loop存成好開的xml格式會造成覆蓋,另外一種格式是只能用該軟體開,不利於數據收集,所以改用for/l去指定執行次數,不用內建的loop執行。
  • 為了好整理格式,利用padding 0的方式
  • 前幾天嘗試,發現裡面還是有空白的老bug...唉


第二段batch,用來收集分數資訊。
@echo off

set log_path=_list_score.source.txt
set res_path=_list_score.result.csv

dir /a /b *.xml > %log_path%

echo filename,overall score,graphic score,phisics score,combined score > %res_path%

SET em=!
SET pp=%%

SETLOCAL ENABLEDELAYEDEXPANSION

for /f "usebackq delims=" %%a in ( %log_path% ) do (
	echo a=%%a
	SET score_g=-1
	SET score_p=-1
	SET score_c=-1
	SET score_o=-1
	
	SET score_text=???graphicsscorepforpass
	FOR /F "tokens=* USEBACKQ" %%g IN (`findstr /c:"!score_text!" "%%a"`) do ( 
        SET tmp_value=%%g
        SET tmp_value=!tmp_value:/=!
        call SET tmp_value=!pp!tmp_value:^=!pp!
    )
	SET score_g=!tmp_value!
	
	SET score_text=???physicsscorepforpass
	FOR /F "tokens=* USEBACKQ" %%g IN (`findstr /c:"!score_text!" "%%a"`) do ( 
        SET tmp_value=%%g
        SET tmp_value=!tmp_value:/=!
        call SET tmp_value=!pp!tmp_value:^=!pp!
    )
	SET score_p=!tmp_value!
	
	SET score_text=???combinedscorepforpass
	FOR /F "tokens=* USEBACKQ" %%g IN (`findstr /c:"!score_text!" "%%a"`) do ( 
        SET tmp_value=%%g
        SET tmp_value=!tmp_value:/=!
        call SET tmp_value=!pp!tmp_value:^=!pp!
    )
	SET score_c=!tmp_value!
	
	SET score_text=???overallscorepforpass
	FOR /F "tokens=* USEBACKQ" %%g IN (`findstr /c:"!score_text!" "%%a"`) do ( 
        SET tmp_value=%%g
        SET tmp_value=!tmp_value:/=!
        call SET tmp_value=!pp!tmp_value:^=!pp!
    )
	SET score_o=!tmp_value!
	
	echo %%a,!score_o!,!score_g!,!score_p!,!score_c! >> %res_path%
)
pause

ENDLOCAL
  • 一樣拔掉幾個關鍵字,沒辦法直接跑。
  • 很久沒看到setlocal了,這次還是要用setlocal才能把東西存起來
  • 有試過上一段換成loop指令執行,用cmd把result轉xml,但發現之後會更麻煩而作罷

沒有留言: