如何使用 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

感谢大家的帮助。

相关内容