【问题标题】:Splitting file path in batch using for loop and variable substitution使用for循环和变量替换批量拆分文件路径
【发布时间】:2016-03-30 13:12:11
【问题描述】:

我已经搜索了很长一段时间,但没有让我的脚本正常工作。我觉得我很接近,但需要一点帮助。我正在尝试使用 FOR 循环递归扫描“srcdir”(在我的脚本开头设置),然后一旦循环返回文件/路径(%%f),然后我可以用其他东西替换文件路径的一部分(例如:C:\rootpath\src 代表 C:\rootpath\des)。

我可以通过使用这样的脚本来做这样的事情:

set subdir=C:\rootpath\src
set subdir=%subdir:src=des%
echo %subdir%

然而,让这变得困难的是,我的“srcdir”的根路径可能会改变(例如,C:\roothpath)并且“srcdir”之后的所有递归都可能会改变(例如,C 中文件夹“src”之后的任何内容:\rootpath\src)。文件夹 src 和文件夹 des 的唯一常量路径(位于我运行批处理文件的同一目录中)。

因此,通过使用前面示例中的相同技术,我想使用 FOR 循环递归地查找“srcdir”(%%f)中文件的完整路径,并将文件夹“src”替换为文件夹路径字符串中的“des”。因此,我尝试将“%%f”设置为变量(子目录)并使用变量替换替换文件夹。

这是我当前无法运行的脚本:

set srcdir=C:\rootpath\src
for /r "%srcdir%" %%f in (*.txt) do (
set subdir=%%f
set subdir=%subdir:src=des%
echo %subdir%
)

任何帮助将不胜感激!谢谢!

【问题讨论】:

  • for 循环之类的代码块中设置和读取变量后,您将需要delayed expansion...
  • 所以我应该在 for 循环开始之前使用“Setlocal EnableDelayedExpansion”?
  • 是的,这会启用它;要实际使用它,您需要扩展像!variable! 这样的变量而不是%variable%;这也适用于子字符串替换语法...
  • 感谢您迄今为止的帮助。我以前也见过这个,但不知道我是否理解如何在上下文中使用它。我将如何在我的脚本上下文中使用它,以便可以在变量“a”中设置 (%%F)?
  • 参见下面的my answer,它演示了在您的脚本中使用延迟扩展...您在说哪个变量a??

标签: windows variables batch-file cmd substitution


【解决方案1】:

您需要启用delayed expansion,因为您正在像for 循环这样的代码块中分配和读取变量:

setlocal EnableDelayedExpansion
set "srcdir=C:\rootpath\src"
for /R "%srcdir%" %%F in ("*.txt") do (
    set "subdir=%%~fF"
    set "subdir=!subdir:\src\=\des\!"
    echo(!subdir!
)
endlocal

setlocal EnableDelayedExpansion 命令启用延迟扩展;它还本地化环境,这意味着对环境变量的更改仅在执行endlocal 或终止批处理文件之前可用。

要实际使用延迟扩展,您需要将百分号替换为感叹号,因此%subdir% 变为!subdir!

【讨论】:

  • 非常感谢。这更有意义。我能够让脚本正常工作并更好地理解延迟扩展。 :)
  • 虽然变量在 "endlocal" 之后似乎不再存在,那么有没有办法做到这一点并保留变量以供以后在批处理文件中使用?
  • 是的,有,只需将endlocal 替换为endlocal & set "subdir=%subdir%" 行(尽管当值包含! 时会失败)...
猜你喜欢
  • 1970-01-01
  • 2012-03-21
  • 1970-01-01
  • 2018-09-17
  • 2013-08-08
  • 1970-01-01
  • 2012-05-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多