如何在循环内的变量中获取文件名?

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!
)