此问题扩展了对this deleted answer的评论。我声称在搜索可执行文件时,PATH中的未扩展变量引用不会被扩展,但Ken说他没有看到我所做的相同行为。
请注意,普通情况是微妙但严重不同的:在某些条件下,当根据注册表中的信息构建PATH环境变量时,环境变量会自动扩展。我正在谈论由于某种原因,这种情况并未发生的情况,因此cmd.exe
进程的实际环境块包含一个仍包含环境变量引用的PATH。
以下是我为测试此行为而构建的代码:
md test1
echo echo hello! > test1\test1.cmd
set TESTPATH=%cd%\test1
set percent=%%
set PATH=c:\windows\system32;c:\windows;c:\windows\system32\Wbem;%percent%TESTPATH%percent%
set PATH
set TESTPATH
test1
cmd /c test1
start test1.cmd
这是我机器上的结果:
C:\working\testpath>test
C:\working\testpath>md test1
C:\working\testpath>echo echo hello! 1>test1\test1.cmd
C:\working\testpath>set TESTPATH=C:\working\testpath\test1
C:\working\testpath>set percent=%
C:\working\testpath>set PATH=c:\windows\system32;c:\windows;c:\windows\system32\
Wbem;%TESTPATH%
C:\working\testpath>set PATH
Path=c:\windows\system32;c:\windows;c:\windows\system32\Wbem;%TESTPATH%
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC;.py;.pyw
C:\working\testpath>set TESTPATH
TESTPATH=C:\working\testpath\test1
C:\working\testpath>test1
'test1' is not recognized as an internal or external command,
operable program or batch file.
C:\working\testpath>cmd /c test1
'test1' is not recognized as an internal or external command,
operable program or batch file.
C:\working\testpath>start test1.cmd
The system cannot find the file test1.cmd.
预期的行为是什么?是否会因Windows版本和/或其他因素而异?
答案 0 :(得分:1)
这个问题有两种截然不同的观点:
答:在感叹号中包含变量的名称,并在要扩展此类值时启用延迟扩展:
@echo off
setlocal EnableDelayedExpansion
set TESTPATH=%cd%\test1
set "PATH=c:\windows\system32;c:\windows;c:\windows\system32\Wbem;^!TESTPATH^!"
set PATH
echo PATH=%PATH%
答:不会.cmd.exe在出现时使用PATH变量中的值,无需进一步处理。任何可能出现在PATH中的特殊字符,如百分比或感叹号,都是字面上的。