如何在循环内的变量中获取文件名?
How to get filename in variable inside loop?
我想循环遍历当前目录下的所有.h文件,并为对应的.cpp文件调用一个批处理函数。实际上我已经让它工作了,但是当我尝试使用局部变量时,我得到了一些奇怪的输出。
SETLOCAL
for /R %%f in (*.h) do (
SET header=%f%
ECHO header=%header%
SET source=%%~df%%~pf%%~nf.cpp
ECHO source=%source%
)
我得到这个输出:
SETLOCAL
C:\WorkingDirectory>(
SET header=
ECHO header=
SET source=C:\WorkingDirectory\SomeFile.cpp
ECHO source=
)
header=
source=
为什么 %%~df%%~pf%%~nf.cpp
正确展开,但 ECHO %source%
什么都不打印?我怎样才能正确SET header=%f%
?
1) 您正在访问的变量不是用 %f%
而是 %%f
访问的
2) 正如@npocmaka 已经提到的那样,注释 DelayedExpansion
是必需的,因为在使用通常的 %
时,每个闭括号块都会立即解析。要消除该问题,请在 @echo off
之后将 setlocal EnableDelayedExpansion
添加到您的脚本并将 %header%
更改为 !header!
。 %source%
也是如此,但循环变量%%f
!
则不然
SETLOCAL EnableDelayedExpansion
for %%f in (*.h) do (
SET header=%%~ff
ECHO header=!header!
SET source=%%~df%%~pf%%~nf.cpp
ECHO source=!source!
)
我想循环遍历当前目录下的所有.h文件,并为对应的.cpp文件调用一个批处理函数。实际上我已经让它工作了,但是当我尝试使用局部变量时,我得到了一些奇怪的输出。
SETLOCAL
for /R %%f in (*.h) do (
SET header=%f%
ECHO header=%header%
SET source=%%~df%%~pf%%~nf.cpp
ECHO source=%source%
)
我得到这个输出:
SETLOCAL
C:\WorkingDirectory>(
SET header=
ECHO header=
SET source=C:\WorkingDirectory\SomeFile.cpp
ECHO source=
)
header=
source=
为什么 %%~df%%~pf%%~nf.cpp
正确展开,但 ECHO %source%
什么都不打印?我怎样才能正确SET header=%f%
?
1) 您正在访问的变量不是用 %f%
而是 %%f
2) 正如@npocmaka 已经提到的那样,注释 DelayedExpansion
是必需的,因为在使用通常的 %
时,每个闭括号块都会立即解析。要消除该问题,请在 @echo off
之后将 setlocal EnableDelayedExpansion
添加到您的脚本并将 %header%
更改为 !header!
。 %source%
也是如此,但循环变量%%f
!
SETLOCAL EnableDelayedExpansion
for %%f in (*.h) do (
SET header=%%~ff
ECHO header=!header!
SET source=%%~df%%~pf%%~nf.cpp
ECHO source=!source!
)