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

时间:2018-04-27 14:46:01

标签: batch-file path working-directory

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

感谢。

1 个答案:

答案 0 :(得分:3)

我建议先阅读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定义为用户变量,以关闭在当前目录中搜索使用此帐户的进程的脚本或应用程序。但这肯定也不是一个好主意。

但在某些用例中将环境变量NoDefaultCurrentDirectoryInExePath设置为 local 变量以关闭脚本或应用程序的当前目录中的搜索而不显式使用{{1在具有内核函数.\的Windows版本上,NeedCurrentDirectoryForExePath在搜索文件中没有反斜杠cmd.exe(或正斜杠\)的脚本文件或应用程序之前调用{}} name string。

示例:

/

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

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

第二个控制台窗口在5秒后自动关闭。

在将临时文件的目录设置为当前目录并且在堆栈上推送当前目录路径之后,使用值"%TEMP%\Test1.bat" executed successfully. 定义环境变量NoDefaultCurrentDirectoryInExePath。变量值无关紧要,因为评估只存在环境变量而不是其值。

接下来,另一个名为0的批处理文件在目录中为临时文件创建,这些文件通常不会被当前用户写保护,因为这会造成很多麻烦。

第一种在没有任何路径的情况下调用Test1.bat的方法因环境变量Test1.bat在本地环境中定义而失败。

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

命令 START 会忽略此批处理文件证明的.\

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

现在没有任何路径调用NoDefaultCurrentDirectoryInExePath的第二种方法是成功的。

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

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