为什么 SET PATH= 在同一个批处理文件中不起作用?

bre*_*dan 3 windows path batch-file

我有一个带有 Dropbox 和 emacs 便携式安装的 USB 闪存驱动器。我想在emacs中运行的功能之一需要sha1sum.exe在路径中,所以我也把coreutils放在了USB上。我正在编写一个批处理文件,其中:

  1. 将 sha1sum.exe 的路径放在 PATH 中。(虽然我在做,还有 emacs 和 Dropbox 的路径)
  2. 在单独的进程中运行 Dropbox。
  3. 运行 emacs。

这是我所拥有的:

set PATH="%PATH%;%~d0\pathtocoreutils\bin;%~d0\pathtodropbox;%~d0\pathtoemacs\bin"
echo %PATH%
timeout 10
start DropboxPortableAHK.exe
timeout 10
runemacs.exe
Run Code Online (Sandbox Code Playgroud)

当我在新的命令窗口中运行它时,setecho命令给出了预期的结果,但其他一切都会给出错误,表明文件不在路径上(包括timeout为调试而添加的,不在任何新的 PATH 条目中):

'timeout' is not recognized as in internal or external command,
executable program or batch file.
The system cannot find the file DropboxPortableAHK.exe.
'timeout' is not recognized as in internal or external command,
executable program or batch file.
'runemacs.exe' is not recognized as in internal or external command,
executable program or batch file.
Run Code Online (Sandbox Code Playgroud)

如果我在同一个命令窗口中第二次运行它,那么它工作正常。从命令行单独执行相同的命令也有效。打开新终端也会导致批处理文件失败一次。我想要的行为是能够通过单击运行批处理文件,但在这种情况下,无法在cmd.exe.

我的第一个想法是在set PATH=完成之前执行其他命令,并且PATH完全无法访问。这就是我添加timeouts的原因。然而,echo %PATH%返回正确更新值的事实表明这并不是真正的问题。此外,failed 会start打开一个消息框,并且在完成之前不会执行到最后两行,但这些行仍然失败。

我能够PATH在批处理文件中找到的关于设置的所有内容都是为那些试图让更改在系统范围内持续存在的人准备的。答案都表明正常行为是set PATH=在同一个终端实例中工作,包括稍后在同一个批处理文件中。

我正在没有管理员访问权限的 Windows 7 Professional sp1 上进行测试。

这是怎么回事,我该如何解决?

MC *_* ND 5

set "PATH=%PATH%;%~d0\pathtocoreutils\bin;%~d0\pathtodropbox;%~d0\pathtoemacs\bin"
Run Code Online (Sandbox Code Playgroud)

您不应该做的是在值中包含引号,但您可以(并且在相同情况下应该)引用赋值。