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

Windows 如何在循环内的变量中获取文件名?,windows,batch-file,filenames,Windows,Batch File,Filenames,我想循环遍历当前目录中的所有.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:\WorkingDi

我想循环遍历当前目录中的所有.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%%
什么也不打印?如何正确设置标题=%f%?

1)您正在访问的变量不是通过
%f%
访问的,而是通过
%f

2) 正如@npocmaka已经作为注释提到的那样,
DelayedExpansion
是需要的,因为在批处理中,当使用通常的
%
时,每个封闭括号块都会立即被解析。要解决此问题,请在
@echo off
之后向脚本添加
setlocal EnableDelayedExpansion
,并将
%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!
)

您需要
%f%
实际阅读
%f
,或者更好的是,
%%~f
来删除潜在的周围引号。。。要阅读
标题
,您需要使用
!头球而不是
%header%
;为了使这个延迟扩展工作,请将参数
enabledayedexpansion
添加到
setlocal
命令中……我允许自己添加工作示例。我使用
%%~ff
获得完整路径,这很好。很高兴我能帮忙!