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

Tri*_*ics 5 windows cmd path batch-file 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>
Run Code Online (Sandbox Code Playgroud)

这是期望的行为:

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>
Run Code Online (Sandbox Code Playgroud)

谢谢。

Mof*_*ofi 5

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

\n\n\n\n

非常感谢 eryksun,因为如果没有他的评论,这个答案就不会存在对上述答案的

\n\n

接下来我建议阅读 Microsoft Developer Network (MSDN) 文章:

\n\n\n\n

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

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

必须使用任意值定义具有名称的环境变量NoDefaultCurrentDirectoryInExePath,以防止在未显式使用的情况下执行存储在当前目录中的脚本(.bat、.cmd、.vbs...)或应用程序(.com、.exe).\\使用在 Unix/Linux 上。

\n\n

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

\n\n

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

\n\n

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

\n\n

例子:

\n\n
@echo off\npushd "%TEMP%"\nset "NoDefaultCurrentDirectoryInExePath=0"\n\necho @echo %%0 executed successfully.>Test1.bat\n\necho Calling Test1.bat ...\ncall Test1.bat\n\necho Calling .\\Test1.bat ...\ncall .\\Test1.bat\n\necho Starting Test1.bat ...\nstart /wait Test1.bat ^& timeout 5\n\nset "NoDefaultCurrentDirectoryInExePath="\n\necho Calling again Test1.bat ...\ncall Test1.bat\n\ndel Test1.bat\npopd\npause\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
Calling Test1.bat ...\n\'Test1.bat\' is not recognized as an internal or external command,\noperable program or batch file.\nCalling .\\Test1.bat ...\n.\\Test1.bat executed successfully.\nStarting Test1.bat ...\nCalling again Test1.bat ...\nTest1.bat executed successfully.\nPress any key to continue . . . \n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n
"%TEMP%\\Test1.bat" executed successfully.\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

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

\n\n

然后是环境变量NoDefaultCurrentDirectoryInExePath然后删除

\n\n

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

\n\n

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

\n\n

当然,不可能阻止命令DIR的执行,因为它不是脚本文件或可执行文件。cmd.exe它是\xe2\x80\x93 Windows 命令处理器 \xe2\x80\x93 和\xe2\x80\x93 Windows PowerShell的内部命令powershell.exe。

\n

  • 这种混淆来自 MSDN 文章中有关函数 [NeedCurrentDirectoryForExePath](https://msdn.microsoft.com/en-us/library/windows/desktop/ms684269.aspx) 的 __Remarks__ 部分,其中包含以下句子: *The value of the NoDefaultCurrentDirectoryInExePath 环境变量决定了该函数返回的值。* 但在下一段中写道: *... 检查 NoDefaultCurrentDirectoryInExePath 环境变量是否存在,而不是其值。* 我在示例中使用“0”作为值。但该值也可以是“hello world”。重要的是变量的存在,而不是价值。 (2认同)