搜索PATH时是否扩展了环境变量?

时间:2015-06-04 23:28:16

标签: windows batch-file

此问题扩展了对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版本和/或其他因素而异?

1 个答案:

答案 0 :(得分:1)

这个问题有两种截然不同的观点:

  • 问:如何扩展嵌入另一个变量的值?这一点并非特定于PATH变量,但适用于任何人。

答:在感叹号中包含变量的名称,并在要扩展此类值时启用延迟扩展:

@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查找可执行文件时是否会延迟扩展?

答:不会.cmd.exe在出现时使用PATH变量中的值,无需进一步处理。任何可能出现在PATH中的特殊字符,如百分比或感叹号,都是字面上的。