2017-07-18 133 views
1

我的要求是编写批处理脚本来查找并替换给定目录集中所有*-spec.js文件中的字符串。因此我写了批处理文件并运行批处理脚本如下。批处理脚本 - 循环中的动态/可变路径

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

(我相信folder_path_n不会超出7)

e.g 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个参数作为预期甚至正确的路径也被打印。在接下来的步骤中,我们期望循环遍历给定的路径并获取所有以“spec.js”结尾的文件。

e.g不工作:

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

但不打印输出。相反,如果该变量被替换为硬编码值,则其按预期工作。

e.g - 工作:

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

你的帮助是非常感谢!

回答

1

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

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

是的,但是'pushd'节省的来源和使用'popd'你可以回去了。 –

+0

同意。在我的情况下,因为我保持每个目录的绝对路径,所以不会产生任何问题:) –

2

它不起作用的原因是,当解析循环时必须知道变量内容,这意味着它只适用于可以扩展而没有延迟扩展的变量。尽管如此,还是有一个简单的解决方案,因为for /r回路正在使用当前路径(from 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