【问题标题】:Removing the current working directory from the path从路径中删除当前工作目录
【发布时间】:2018-04-27 14:46:00
【问题描述】:

我在 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>

谢谢。

【问题讨论】:

  • 您基本上是在要求更改 Windows 的行为。 Windows 将始终首先搜索当前目录。然后搜索 %path% 变量,最后搜索注册表。我为您看到的唯一选择是让它在上一级目录中查找。 ..\dwk.bat
  • 是的,我正在尝试更改 Windows 的默认行为。正如我所说,在 UNIX 或 PowerShell 中这样做很简单。
  • 我很好奇,你是如何在 UNIX 中做到这一点的?和PowerShell?即更改它们的 shell 默认行为,以便 .\dwk.bat 不在当前工作目录中搜索!
  • @compo 两个 shell 都不默认在当前目录中搜索,你必须以 .\ resp. ./ 为前缀在 powershell 中你可以使用 tab 自动搜索。
  • @Tripp,您不是说在 UNIX 或 Powershell 中更改默认行为是微不足道的。默认行为是 .\ 在当前目录中搜索,所以告诉我更改默认行为是多么简单!除非您可以以编程方式这样做,否则我看不出您的问题与此处的相关性。

标签: batch-file path working-directory


【解决方案1】:

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

非常感谢eryksun,因为如果没有his comment 以上引用的答案,这个答案将不存在。

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

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

  • Windows Vista 和所有更高版本的 Windows 客户端以及
  • Windows Server 2003 和所有更高版本的 Windows Server。

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

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

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

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

例子:

@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

在命令提示符窗口中执行此批处理文件会输出当前控制台窗口:

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 . . . 

在执行此批处理文件期间,会打开第二个控制台窗口并显示输出:

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

第二个控制台窗口在 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 的内部命令。

【讨论】:

  • +1!这是很好的信息。例如,如果您将批处理文件命名为 ping.bat,然后在批处理文件中使用 ping google.com,我可以看到这将如何派上用场。
  • 非常非常感谢@Mofi!这正是我想要的!
  • 我在另一个问题中发现了来自 eryksun 的另一条评论,该评论说将变量设置为 1 也会改变其行为。变量是否只需要定义或将其设置为 0 或 1 会改变环境行为。
  • 这种混淆来自MSDN文章中关于函数NeedCurrentDirectoryForExePathRemarks部分,其中包含以下语句:NoDefaultCurrentDirectoryInExePath环境变量的值决定了这个函数的值返回。 但在下一段中写道:... 检查 NoDefaultCurrentDirectoryInExePath 环境变量的存在,而不是它的值。 我在示例中使用 0 作为值。但该值也可以是hello world。变量的存在很重要,而不是价值。
猜你喜欢
  • 1970-01-01
  • 2013-04-18
  • 2019-01-27
  • 2012-04-12
  • 2014-03-10
  • 1970-01-01
  • 1970-01-01
  • 2017-04-23
  • 2010-12-28
相关资源
最近更新 更多