使用批处理脚本循环遍历两个目录

时间:2013-12-20 09:21:15

标签: windows batch-file if-statement for-loop command-prompt

我想循环两个目录A和B,并且存在具有相同名称的文件。一旦我获得了两个相同名称文件的路径,我想做一些操作。这是我的批处理脚本:

setlocal ENABLEDELAYEDEXPANSION 
for /r "A" %%o in (*.c,*.cpp,*.h) do (
for /r "B" %%l in (*.c,*.cpp,*.h) do (      
            set x = %%~nxo
            set y = %%~nxl
            if %x% == %y% ( echo %x% )
    )
)
endlocal

这里我试图打印文件的名称,但无法这样做。 我收到一个错误:此时回声出乎意料。 那么这个脚本有什么问题。

2 个答案:

答案 0 :(得分:1)

问题是空间。试试这段代码

set x=something_1
set x = something_2

echo %x%
echo %x %

如您所见,在变量名称后面放置一个空格会改变变量的名称。您正在为名称中包含空格的变量赋值,但尝试从名称中没有空格的变量中检索值。

一旦空格得到解决,下一个问题就是:延迟扩张。

当执行到达一个代码块(在这种情况下是你的两个for命令,括号内的内容)和之前代码被执行时,内容被解析并且在所有变量被引用的地方,变量引用都被变量值替换。

在开始执行块之前之前的值

然后块执行所需的时间(如for命令中所述)没有新的替换,因为现在,代码中没有对变量的读取。

变量的值已更改(执行相应的set命令时),但此更改未反映在执行的代码中。它不包含任何变量,它们被替换为它们的值。

此行为的例外是for命令(代码中为%%o%%l)的变量/可替换参数,这些参数旨在更改其值,并且在延迟扩展时已启用(setlocal enabledelayedexpansion)变量,引用为!var!而不是通常的%var%

考虑到这一点,您的代码将按照

编写的方式执行
setlocal ENABLEDELAYEDEXPANSION 
for /r "A" %%o in (*.c,*.cpp,*.h) do (
for /r "B" %%l in (*.c,*.cpp,*.h) do (      
            set x=%%~nxo
            set y=%%~nxl
            if == ( echo )
    )
)
endlocal

没有读取变量的值。所有都已更改为其初始值(在此示例中,假定为emtpy值)

如何解决:两个选项

1 - 没有延迟扩展:使用for命令的变量

for /r "A" %%o in (*.c,*.cpp,*.h) do for /r "B" %%l in (*.c,*.cpp,*.h) do (      
    if "%%~nxo"=="%%~nxl" ( echo "%%~nxo" )
)

2 - 启用延迟扩展

for /r "A" %%o in (*.c,*.cpp,*.h) do for /r "B" %%l in (*.c,*.cpp,*.h) do (
    set "x=%%~nxo"
    set "y=%%~nxl"
    if "!x!"=="!y!" ( echo "!x!" )
)

答案 1 :(得分:0)

了解这为您提供的内容:

@echo off
for /r "A" %%o in (*.c,*.cpp,*.h) do (
for /r "B" %%l in (*.c,*.cpp,*.h) do (      
   if "%%~nxo"=="%%~nxl" echo."%%~nxo"
    )
)