我在 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>
谢谢。
我建议首先阅读堆栈溢出问题的答案:
- "开始"在哪里搜索可执行文件?
- "..."的原因是什么?无法识别为内部或外部命令、可操作程序或批处理文件?
非常感谢eryksun,因为如果没有他对上述参考答案的评论,这个答案就不会存在。
接下来,我建议阅读Microsoft开发人员网络 (MSDN) 文章:
- 命名文件、路径和命名空间
- NeedCurrentDirectoryForExePath 函数
这个问题可以回答:是的,桌面应用程序和批处理文件可以
Windows- Vista 和所有更高版本的 Windows 客户端版本和 Windows Server
- 2003 和所有更高版本的 Windows Server 版本。
必须使用任何值定义具有名称NoDefaultCurrentDirectoryInExePath
的环境变量,以防止执行存储在当前目录中的脚本(.bat,.cmd,.vbs,...)或应用程序(.com,.exe),而无需按照Unix/Linux的要求显式使用.
。
可以将环境变量NoDefaultCurrentDirectoryInExePath
定义为系统变量,以关闭在当前目录中搜索此计算机上所有帐户的脚本或应用程序。但这肯定不是好主意,因为它肯定会导致许多应用程序,包括安装程序和卸载程序将不再正确工作。
可以将环境变量NoDefaultCurrentDirectoryInExePath
定义为用户变量,以关闭在当前目录中搜索使用此帐户的进程的脚本或应用程序。但这肯定也不是一个好主意。
但是,在某些用例中,将环境变量NoDefaultCurrentDirectoryInExePath
设置为局部变量是有意义的,以关闭在当前目录中搜索脚本或应用程序,而无需在具有内核函数NeedCurrentDirectoryForExePath
的 Windows 版本上显式使用.
,在搜索文件名字符串中不包含反斜杠(或正斜杠
/
)的脚本文件或应用程序之前,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
从命令提示符窗口中执行的此批处理文件会导致当前控制台窗口的输出:
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
的批处理文件,该文件通常对当前用户没有写保护,因为这会导致很多麻烦。
第一种方法是在没有任何路径的情况下调用Test1.bat
失败的,因为环境变量NoDefaultCurrentDirectoryInExePath
在本地环境中定义。
尽管存在环境变量,但具有相对路径.
的Test1.bat
的第二次调用是成功的。
命令 START忽略此批处理文件所证明的NoDefaultCurrentDirectoryInExePath
。
然后删除环境变量NoDefaultCurrentDirectoryInExePath
以恢复原始 Windows 行为。
现在,在没有任何路径的情况下调用Test1.bat
的第二种方法已成功。
最后,删除创建的Test1.bat
,并将初始当前目录恢复为当前目录。
当然,不可能阻止执行不是脚本文件或可执行文件的命令DIR。它是cmd.exe
- Windows命令处理器 - 分别是powershell.exe
- Windows PowerShell的内部命令。