Windows 如何在循环内的变量中获取文件名?
我想循环遍历当前目录中的所有.h文件,并为相应的.cpp文件调用批处理函数。实际上我已经让它工作了,但是当我尝试使用局部变量时,我得到了一些奇怪的输出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
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
获得完整路径,这很好。很高兴我能帮忙!