我有一个 USB 闪存驱动器,里面装有 Dropbox 和 emacs 的便携式安装。我想在 emacs 中运行的其中一个函数需要sha1sum.exe
在路径中,所以我还在 USB 上安装了 coreutils。我正在编写一个批处理文件,它:
- 将 sha1sum.exe 的路径放入 PATH 中。(我这样做时,也把 emacs 和 Dropbox 的路径也放进去)
- 在单独的进程中运行 Dropbox。
- 运行 emacs。
以下是我所拥有的:
set PATH="%PATH%;%~d0\pathtocoreutils\bin;%~d0\pathtodropbox;%~d0\pathtoemacs\bin"
echo %PATH%
timeout 10
start DropboxPortableAHK.exe
timeout 10
runemacs.exe
当我在新命令窗口中运行它时,set
和echo
命令给出了预期的结果,但其他所有命令都给出了错误,表明文件不在路径上(包括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.
如果我在同一命令窗口中第二次运行它,那么它就可以正常工作。从命令行单独执行相同的命令也可以。打开新终端也会导致批处理文件失败一次。我想要的行为是能够通过单击来运行批处理文件,但在这种情况下,无法在同一个实例中第二次运行它cmd.exe
。
set PATH=
我的第一个想法是,在完成之前执行了其他命令,并且PATH
完全无法访问。这就是我添加timeout
s 的原因。然而,返回正确的更新值这一事实echo %PATH%
表明这并不是真正的问题。此外,失败start
会打开一个消息框,并且执行不会传递到最后两行直到完成,但这些行仍然失败。
我所能找到的所有关于PATH
批处理文件中的设置的信息都是针对那些试图让更改在系统范围set PATH=
内持续存在的人。所有答案都表明,正常行为是在同一个终端实例中工作,包括稍后在同一个批处理文件中工作。
我正在 Windows 7 Professional sp1 上进行测试,没有管理员权限。
这是怎么回事?我该如何解决?
答案1
set "PATH=%PATH%;%~d0\pathtocoreutils\bin;%~d0\pathtodropbox;%~d0\pathtoemacs\bin"
您不应该做的是在值中包含引号,但您可以(在相同情况下应该)引用分配。
答案2
我找到了答案:行中不应有引号set PATH=
。它在同一个窗口中第二次运行成功了,因为开头的引号数量是偶数。