
我正在嘗試編寫一個批次文件,該文件迭代每個文件名,獲取字串的一部分,並設定創建和修改日期。請注意,dirpath 是實際路徑的佔位符。
@echo off
setlocal enabledelayedexpansion
FOR /R dirpath %F in (*.*) DO (SET FNAME=%~nF SET MM=%FNAME:~0,2% SET DD=%FNAME:~2,2% SET YY=%FNAME:~4,2% nircmd.exe setfiletime %F "%DD% %MM%-20%YY% 00:00:00" "%DD%-%MM%-20%YY% 00:00:00")
我不確定如何對腳本正在執行的操作進行故障排除 - 循環後暫停不會暫停程式。如何將其重寫為函數?
答案1
如何將其重寫為函數?
您的批次檔存在許多問題:
- 它不是
%f
。你需要用它%%f
來代替。%f
用於命令列,至少需要修復 3 個地方。 - 我會將命令放在
do ( ... )
單獨的行中。 - 您可以在結束前暫停
)
- 您可以註解掉第一行以
rem
查看批次檔正在做什麼。 - 新增
echo
到有效負載行nircmd
。 echo
當您認為它有效時將其刪除。- 您需要在某些地方使用
!
而不是在循環%
內部for
(這就是enabledelayedexpansion
for - 它使變數能夠在執行時而不是在解析時擴展
從以下批次檔開始(我已經為您修復了主要錯誤):
@echo off
setlocal enabledelayedexpansion
for /r dirpath %%F in (*.*) DO (
set FNAME=%%~nF
SET MM=!FNAME:~0,2!
SET DD=!FNAME:~2,2!
SET YY=!FNAME:~4,2!
echo nircmd.exe setfiletime %%F "!DD!-!MM!-20!YY! 00:00:00" "!DD!-!MM!-20!YY! 00:00:00"
pause
)
endlocal
進一步閱讀
- Windows CMD 命令列的 AZ 索引- 與 Windows cmd 行相關的所有內容的絕佳參考。
- 啟用延遲擴展- 延遲擴展將導致變數在執行時而不是在解析時擴展。
- 對於/r- 循環檔案(遞歸子資料夾)。
- 放- 顯示、設定或刪除 CMD 環境變數。使用 SET 所做的變更將僅在目前 CMD 會話期間保留。
- 設定本地- 設定選項來控制批次檔中環境變數的可見性。
答案2
我透過簡單地呼叫函數找到了另一種解決方案。
FOR /R dirname %%F in (*.*) DO call :Setfiletime %%F
goto End
:Setfiletime
SET FNAME=%~n1
echo %FNAME%
SET MM=%FNAME:~0,2%
SET DD=%FNAME:~2,2%
SET YY=%FNAME:~4,2%
nircmd.exe setfiletime %1 "%DD%-%MM%-20%YY%" "%DD%-%MM%-20%YY%"
:goto :eof
:End
感謝大家的幫忙。