批处理脚本 - 循环

时间:2017-07-18 04:48:09

标签: windows file batch-file path

我的要求是编写一个批处理脚本来查找和替换给定目录集中所有*-spec.js文件中的字符串。因此,我编写了批处理文件并运行批处理脚本,如下所示。

<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个参数,即使路径也按预期打印。在下一步中,它应该循环遍历给定路径并获取以“spec.js”结尾的所有文件。

例如不工作:

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

但它什么都没打印。相反,如果变量被硬编码值替换,它将按预期工作。

例如 - 工作:

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

非常感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

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

  

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

只需将目录更改为!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

答案 1 :(得分:1)

我也按照下面的@Andre Kampling的建议进行了尝试。

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