如何使用 nircmd.exe 並在批次 for 迴圈中設定檔名 %~nF

如何使用 nircmd.exe 並在批次 for 迴圈中設定檔名 %~nF

我正在嘗試編寫一個批次文件,該文件迭代每個文件名,獲取字串的一部分,並設定創建和修改日期。請注意,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(這就是enabledelayedexpansionfor - 它使變數能夠在執行時而不是在解析時擴展

從以下批次檔開始(我已經為您修復了主要錯誤):

@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

感謝大家的幫忙。

相關內容