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

Batch file 从路径中删除当前工作目录,batch-file,path,working-directory,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

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

谢谢。

我建议先阅读关于堆栈溢出问题的答案:

非常感谢,因为如果没有上面提到的答案,这个答案将不存在

接下来,我建议阅读Microsoft开发者网络(MSDN)文章:

问题的答案是:是的,桌面应用程序和批处理文件在

  • Windows Vista和所有更高版本的Windows客户端和
  • Windows Server 2003和所有更高版本的Windows Server
必须使用任何值定义名为NODEFAULTCurrentDirectoryInExPath的环境变量,以防止执行当前目录中存储的脚本(.bat、.cmd、.vbs、…)或应用程序(.com、.exe),而不按照Unix/Linux上的要求显式使用
\

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

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

但在某些使用情况下,可以将环境变量
nodefaultCurrentDirectoryInDepath
设置为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秒后自动关闭

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

接下来,将在目录中为临时文件创建另一个名为
Test1.bat
的批处理文件,该临时文件通常对当前用户不具有写保护,因为这将导致很多问题

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

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

命令START忽略
nodefaultcurrentdirectoryinepath
,该批处理文件证明了这一点

然后删除环境变量nodefaultcurrentDirectoryinePath,以恢复Windows的原始行为

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

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


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

您基本上要求更改Windows的行为。Windows将始终首先搜索当前目录。然后搜索%path%变量,最后搜索注册表。我为您看到的唯一选择是让它在上面一级的目录中查找
。\dwk.bat
是的,我正在尝试更改Windows的默认行为。正如我所说的,在UNIX或PowerShell中这样做很简单。我很好奇,您是如何在UNIX中这样做的?还有动力地狱?i、 e.更改它们的shell默认行为,以便
\dwk.bat
不会在当前工作目录中搜索@compo两个shell都不是当前目录中的默认搜索,您必须以
\resp.作为前缀/
在powershell中,您使用tab自动执行此操作。@Tripp,您不是说在UNIX或powershell中更改默认行为很简单吗。默认行为是。\r在当前目录中搜索,所以告诉我更改默认行为是多么简单!除非你能以编程的方式这样做,否则我看不出你的问题在这里有什么关联。+1!这是很好的信息。例如,如果您将批处理文件命名为ping.bat,然后在批处理文件中使用
ping google.com
,我可以看出这是多么有用。非常感谢@Mofi!这正是我要找的!我在另一个问题中发现了来自eryksun的另一条评论,该评论说将变量设置为1也会改变其行为。那么,是否只需要定义变量