批处理脚本 – 循环中的dynamic/可变path

我的要求是编写一个批处理脚本来查找和replace给定的一组目录中的所有*-spec.js文件中的一个string。 因此,我写了batch file并运行批处理脚本如下。

 <script file name> <search_string> <replace_string> <folder_path_1> <folder_path_2> <folder_path_n> 

(我相信folder_path_n不会超越7)

例如C:\CI\Scripts>replace.bat hello world C:\app\e2e C:\sppa\e2e所以我的脚本如下。

 @echo off setlocal enabledelayedexpansion set argCount=0 for %%x in (%*) do ( set /A argCount+=1 set "argVec[!argCount!]=%%~x" ) set search=%1 set replace=%2 echo Search is %search% echo Replace is %replace% for /L %%i in (3,1,%argCount%) do ( set path=!argVec[%%i]! echo path is !path! for /R !path! %%F in (*spec.js) do ( echo %%F ) ) 

这里它正确打印4个参数,即使path也按预期打印。 在接下来的步骤中,我们希望遍历给定的path,并获取所有以“spec.js”结尾的文件。

如不工作:

 for /R !path! %%F in (*spec.js) do ( echo %%F ) 

但它什么都不打印。 相反,如果variables被replace为硬编码值,则按预期工作。

例如 – 工作:

 for /RC:\app\sppa\e2e %%F in (*spec.js) do ( echo %%F ) 

您的帮助是高度赞赏!

它不起作用的原因是,当分析循环时必须知道变量内容,这意味着它只能用于可以扩展而没有延迟扩展的变量。 然而,有一个简单的解决方案,因为for /r循环正在使用当前路径( 来自ss64 )。

如果未指定[drive:]路径,则默认为当前drive:路径。

只要改变目录到!path! 然后回去:

 rem Change into !path! and remember directory coming from pushd !path! for /R %%F in (*spec.js) do ( echo %%F ) rem Change back to origin popd 

我也尝试了类似的建议@Andre Kampling如下。

 cd !path! ::echo Changed the path to !path! FOR /R %%F IN (*spec.js) DO ( echo %%F )