使用for循环和变量替换批量拆分文件路径

时间:2016-03-30 13:12:12

标签: windows variables batch-file cmd substitution

我已经搜索了一段时间而没有任何运气让我的脚本正常工作。我觉得我非常接近,但需要一些帮助。我试图使用FOR循环递归扫描" srcdir" (在我的脚本的开头设置),然后一旦循环返回文件/路径(%% f),那么我可以用其他东西替换部分文件路径(例如; C:\ rootpath \ src用于C:\ rootpath \ DES)。

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

VALUES(

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

所以,通过在前面的例子中使用相同的技术,我想使用FOR循环递归地找到" srcdir"中的文件的完整路径。 (%% f)并替换文件夹" src"用文件夹" des"在路径字符串中。因此,我试图设置" %% f"作为变量(subdir)并使用变量替换替换文件夹。

这是我目前的非工作脚本:

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

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

1 个答案:

答案 0 :(得分:2)

您需要启用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!