批处理 - 在for循环中设置变量

时间:2016-01-10 13:57:38

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

我目前正在尝试进行一些批量合并和重命名,并面临以下问题(这不是实际的代码,而是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为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!" ...

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

1 个答案:

答案 0 :(得分:3)

你应该试试这个:

@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