【问题标题】:Batch - Set variables in for loop批处理 - 在 for 循环中设置变量
【发布时间】:2016-04-14 20:36:41
【问题描述】:

我目前正在尝试进行一些批量合并和重命名,并面临以下问题(这不是实际代码,而是演示问题的 MWE):

@echo off
set /p "arg=Input the path to target directory (defaults to current directory if left empty): "

for %%f in ("%arg%\*.mkv") do (
  echo %%~nf
  set "out=%%~nf"
  echo %out%
)

pause

我的问题是这两个回显不打印相同的值。第一个打印正确的东西(文件名),第二个打印随机的东西,比如 Echo is OFF 或目录的最后一个文件名。

经过一番搜索,我发现提到使用延迟扩展变量(setlocal EnableDelayedExpansion),但这会导致问题,因为用户输入的目录路径可能包含感叹号,如果我这样做会被删除(并且所以for循环根本不执行)。

如何在 for 循环中正确设置变量?

更新

在 Dennis 的解决方案和一些额外的试验和错误的帮助下,我终于能够修复原始代码并且它现在可以工作了。对于任何有兴趣的人,这就是我试图做的:

for %%f in ("%arg%\*.mkv") do (
  set "n=%%~nf"

  setlocal EnableDelayedExpansion
  mkvmerge -o "!n:~15,10! !n:~25!" "!n!_Track00.h264" ...
  endlocal
)

实际的命令实际上要长得多,所以我没有将其全部粘贴,只是粘贴到足以证明它作为参数所需的内容。我使用变量 n 是因为 %%~nf 在延迟扩展环境中无法正常工作(即 !s 被删除),而且我不知道如何取消引用具有延迟扩展的双百分比变量(参数?)。

另外,尝试

set "out=%n:~15,10% %n:~25%"

在设置延迟扩展然后运行之前

mkvmerge -o "!out!" ...

没有正确延迟扩展,所以上面的代码就是我最终得到的。

【问题讨论】:

标签: variables batch-file for-loop command-line command-prompt


【解决方案1】:

你应该试试这个:

@echo off
set "arg=."
set /p "arg=Input the path to target directory (defaults to current directory if left empty): "
for %%f in ("%arg%\*.mkv") do (
  echo %%~nf
  set "out=%%~nf"
  setlocal EnableDelayedExpansion
  echo !out!
  endlocal
)
pause

【讨论】:

  • 我已经更新了问题。这给了我一个关于 setlocal 递归深度的错误。
  • 已编辑,您需要 endlocal 而不是 setlocal disable
  • 好的,这个效果更好,但仍然有问题,因为它仍然会删除文件名中的感叹号(它们也可以包含!s)。有没有办法避免名称中的问号被全部删除?
  • 已编辑,这应该可以。我还修复了“如果没有输入”的情况。
  • 我已经设法在我的代码中实现了这个解决方案。我已经更新了我的问题并接受了这个答案。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-07-11
  • 2023-03-06
  • 1970-01-01
  • 1970-01-01
  • 2013-08-08
  • 1970-01-01
相关资源
最近更新 更多