我想循环两个目录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
这里我试图打印文件的名称,但无法这样做。 我收到一个错误:此时回声出乎意料。 那么这个脚本有什么问题。
答案 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"
)
)