gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 13:18:19 26 4
gpt4 key购买 nike

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

谢谢。

最佳答案

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

  • Where is "START" searching for executables?
  • What is the reason for '...' is not recognized as an internal or external command, operable program or batch file?

  • 非常感谢 eryksun因为没有 his comment,这个答案就不会存在在上面引用的答案上。

    接下来我推荐阅读微软开发者网络(MSDN)的文章:
  • Naming Files, Paths, and Namespaces
  • NeedCurrentDirectoryForExePath function

  • 这个问题可以这样回答:是的,桌面应用程序和批处理文件可以在
  • Windows Vista 和所有更高版本的 Windows 客户端和
  • Windows Server 2003 和所有更高版本的 Windows Server。

  • 一个名为 NoDefaultCurrentDirectoryInExePath 的环境变量必须用任何值定义,以防止执行存储在当前目录中的脚本(.bat、.cmd、.vbs、...)或应用程序(.com、.exe),而无需明确使用 .\根据 Unix/Linux 的要求。

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

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

    但是设置环境变量 NoDefaultCurrentDirectoryInExePath 是有意义的。作为 本地 在某些用例中使用变量来关闭在当前目录中搜索脚本或应用程序而不显式使用 .\在具有内核功能的 Windows 版本上 NeedCurrentDirectoryForExePath其中 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的第二次电话相对路径 .\尽管存在环境变量,但仍然成功。

    命令 开始 忽略 NoDefaultCurrentDirectoryInExePath正如这个批处理文件所证明的那样。

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

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

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

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

    关于batch-file - 从路径中删除当前工作目录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50064901/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com