从路径中删除当前工作目录

Removing the current working directory from the path

我在 Windows 工作,想知道是否有办法从路径中删除当前工作目录?我知道这是 PowerShell 中的默认行为,但我需要它在批处理或在 Windows 命令行中工作。

在 UNIX 中,我只是确保我的 $PATH 变量不包含 .。有没有办法批量完成这个?这是当前行为:

H:\tmp>dir
 Volume in drive H has no label.
 Volume Serial Number is E29C-7B61

 Directory of H:\tmp

04/27/2018  10:39 AM    <DIR>          .
04/27/2018  10:39 AM    <DIR>          ..
04/27/2018  10:40 AM                37 dwk.bat
               1 File(s)             37 bytes
               2 Dir(s)  987,995,770,880 bytes free

H:\tmp>dwk.bat
dwk.bat has been run.

H:\tmp>

这是期望的行为:

H:\tmp>dwk.bat
'dwk.bat' is not recognized as an internal or external command,
operable program or batch file.

H:\tmp>.\dwk.bat
dwk.bat has been run.

H:\tmp>

谢谢。

我建议先阅读 Stack Overflow 问题的答案:

  • Where is "START" searching for executables?

非常感谢 eryksun because of this answer would not exist without 对上述参考答案。

接下来我推荐阅读 Microsoft Developer Network (MSDN) 文章:

问题可以这样回答:是的,桌面应用程序和批处理文件可以在

  • Windows Vista 和所有更新的 Windows 客户端版本和
  • Windows Server 2003 及所有更高版本 Windows 服务器版本。

必须使用任何值定义名称为 NoDefaultCurrentDirectoryInExePath 的环境变量,以防止执行脚本(.bat、.cmd、.vbs、...)或应用程序(.com、.exe) ) 存储在当前目录中,而没有根据 Unix/Linux.

上的要求明确使用 .\

环境变量NoDefaultCurrentDirectoryInExePath可以定义为系统变量,以关闭在当前目录中搜索本机所有帐户的脚本或应用程序。但这肯定不是一个好主意,因为它肯定会导致包括安装程序和卸载程序在内的许多应用程序不再正常工作。

环境变量 NoDefaultCurrentDirectoryInExePath 可以定义为 user 变量,以关闭在当前目录中搜索脚本或应用程序以查找使用此帐户的进程。但这肯定也不是什么好主意。

但在某些用例中将环境变量 NoDefaultCurrentDirectoryInExePath 设置为 local 变量以关闭在当前目录中搜索脚本或应用程序而不需要在 Windows 具有内核函数 NeedCurrentDirectoryForExePath 的版本上显式使用 .\cmd.exe 在搜索不包含反斜杠 \(或正斜杠)的脚本文件或应用程序之前调用文件名字符串中的斜杠 /).

示例:

@echo off
pushd "%TEMP%"
set "NoDefaultCurrentDirectoryInExePath=0"

echo @echo %%0 executed successfully.>Test1.bat

echo Calling Test1.bat ...
call Test1.bat

echo Calling .\Test1.bat ...
call .\Test1.bat

echo Starting Test1.bat ...
start /wait Test1.bat ^& timeout 5

set "NoDefaultCurrentDirectoryInExePath="

echo Calling again Test1.bat ...
call Test1.bat

del Test1.bat
popd
pause

从命令提示符 window 中执行的批处理文件导致当前控制台的输出 window:

Calling Test1.bat ...
'Test1.bat' is not recognized as an internal or external command,
operable program or batch file.
Calling .\Test1.bat ...
.\Test1.bat executed successfully.
Starting Test1.bat ...
Calling again Test1.bat ...
Test1.bat executed successfully.
Press any key to continue . . . 

并且在执行这个批处理文件的过程中,第二个控制台 window 打开并输出:

"%TEMP%\Test1.bat" executed successfully.

第二个控制台 window 将在 5 秒后自动关闭。

在将临时文件目录设置为当前目录并将当前目录路径压入堆栈后,环境变量NoDefaultCurrentDirectoryInExePath被定义为值0。变量值无关紧要,因为评估的只是环境变量的存在,而不是它的值。

接下来在临时文件目录中创建另一个名为 Test1.bat 的批处理文件,临时文件通常对当前用户没有写保护,因为这会导致很多麻烦。

由于在本地环境中定义了环境变量 NoDefaultCurrentDirectoryInExePath,因此第一种不带任何路径调用 Test1.bat 的方法失败。

尽管存在环境变量,但使用相对路径 .\Test1.bat 的第二次调用仍然成功。

命令 START 忽略了 NoDefaultCurrentDirectoryInExePath,正如这个批处理文件所证明的那样。

然后删除环境变量 NoDefaultCurrentDirectoryInExePath 以恢复原始 Windows 行为。

第二种不带任何路径调用Test1.bat的方法现在成功了。

最后创建的Test1.bat被删除,初始当前目录恢复为当前目录

当然不可能阻止命令 DIR 的执行,它不是脚本文件或可执行文件。它是 cmd.exe – Windows 命令处理器的内部命令 – 分别是 powershell.exe – Windows PowerShell。