【问题标题】:Batch script - dynamic/variable paths in loop批处理脚本 - 循环中的动态/可变路径
【发布时间】:2017-07-18 04:48:08
【问题描述】:

我的要求是编写一个批处理脚本来查找和替换给定目录集中所有*-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&gt;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
)

非常感谢您的帮助!

【问题讨论】:

    标签: windows file batch-file path


    【解决方案1】:

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

    如果未指定 [drive:]path,则默认为当前 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
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是的,但是pushd 保存了原点,使用popd 您可以返回。
      • 同意。在我的情况下,因为我保留每个目录的绝对路径,它不会产生任何问题:)
      猜你喜欢
      • 2013-11-25
      • 2011-02-05
      • 2020-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-05-22
      • 1970-01-01
      • 2017-02-03
      相关资源
      最近更新 更多