【问题标题】:Windows batch file starting directory when 'run as admin'“以管理员身份运行”时的 Windows 批处理文件起始目录
【发布时间】:2010-10-14 22:25:42
【问题描述】:

我有一个批处理文件,它位于一个目录中,也必须从那里运行,因为它会更新此目录中的文件。
这工作得很好,除非用户以管理员身份运行批处理文件(Vista 需要)。那么起始目录是 C:\Windows\System32。

有没有办法仍然能够知道批处理文件是从哪个目录运行的?
我不希望用户手动进入目录。

【问题讨论】:

  • stackoverflow.com/q/47234901/340790 指出了这里的一般问题,有很多答案都说要修改命令脚本,而 no 答案解释了如何获得实际的快捷方式正常工作并拥有快捷方式实际显示的初始工作目录。值得注意的是,快捷方式中的这个工作目录问题不仅仅适用于脚本。它也适用于通过rundll32 调用的可执行文件和DLL。例如,在stackoverflow.com/q/18756671/340790 看到它适用于cmd

标签: windows windows-vista batch-file directory uac


【解决方案1】:

尝试像这样访问批处理文件路径:

echo %~dp0

有关详细信息,请参阅命令 for /? 中的以下引用,该引用描述了上述命令的工作原理:

您现在可以使用以下可选语法: %~I - 扩展 %I 删除任何周围的引号 (") %~fI - 将 %I 扩展为完全限定的路径名 %~dI - 仅将 %I 扩展为驱动器号 %~pI - 仅将 %I 扩展为路径 %~nI - 仅将 %I 扩展为文件名 %~xI - 仅将 %I 扩展为文件扩展名 %~sI - 扩展路径仅包含短名称 %~aI - 将 %I 扩展为文件的文件属性 %~tI - 将 %I 扩展到文件的日期/时间 %~zI - 将 %I 扩展为文件大小 %~$PATH:I - 搜索 PATH 中列出的目录 环境变量并将 %I 扩展到 找到的第一个名称的完全限定名称。 如果环境变量名不是 已定义或文件未找到 搜索,然后这个修饰符扩展为 空字符串 可以组合修饰符以获得复合结果: %~dpI - 仅将 %I 扩展为驱动器号和路径 %~nxI - 仅将 %I 扩展为文件名和扩展名 %~fsI - 将 %I 扩展为仅包含短名称的完整路径名 %~dp$PATH:I - 搜索 PATH 中列出的目录 %I 的环境变量并扩展为 找到的第一个驱动器号和路径。 %~ftzaI - 将 %I 扩展为类似 DIR 的输出线

【讨论】:

  • 太棒了,我不知道这个。非常感谢
  • 多么晦涩难懂!但正是我需要的。谢谢。
  • @stucampbell 试试命令'for /?'详细了解其工作原理(向下滚动至第 4 页)
  • Donny V 试试下面的pushd
  • @Donny V 它确实适用于 Windows 8.1 - 我试过了。请记住,这仅在您在批处理文件中运行时才有效。
【解决方案2】:

cd 更好的是pushd,它将

  • 如果从D:\... 开始,请更改驱动器号
  • 如果在 UNC 网络路径上,则分配驱动器号

所以pushd %~dp0 很好。

好的做法是在完成后致电popd

【讨论】:

  • 适用于多卷系统的出色解决方案,适用于 Windows 7、8、8.1 和 10,+1
【解决方案3】:

这应该可以通过将批处理文件的工作目录设置回当前目录来解决您的问题:

在 .bat 脚本的顶部包含这两行:

@setlocal enableextensions
@cd /d "%~dp0"

发现于:http://www.codeproject.com/Tips/119828/Running-a-bat-file-as-administrator-Correcting-cur

【讨论】:

  • 这是完美的。解决了我以管理员身份运行 bat 文件时的“找不到文件”问题。
【解决方案4】:

要解决此问题,请在 .bat 脚本的顶部包含以下两行:

@setlocal enableextensions
@cd /d "%~dp0"

【讨论】:

    【解决方案5】:

    我用:

    cd %0..

    在批处理文件的开头将目录更改为启动批处理文件的目录。

    -马修

    【讨论】:

    • 这不会改变驱动器号。
    • 这其实是最好的解决方案,直接改成cd %0/../?
    【解决方案6】:

    @setlocal 启用扩展

    @cd /d "%~dp0"

    【讨论】:

      【解决方案7】:

      您可以通过添加父文件名直接从文件名 CD(未在 Windows 8.x 中测试,但据我所知,“永远”工作)。

      CD %FILENAME%\..
      

      CD 也将使用 /D 更改驱动器,如上所示,但未明确提及,因此可能会被遗漏。 CD /D %FILENAME%\..

      (对于 /? 如果 /? 放 /? 称呼 /? 去 /? 如果您使用 cmd.exe,所有这些都提供了非常有用的阅读,我会不时重读它们。)

      【讨论】:

        【解决方案8】:

        这里有一个可行的解决方案:

        http://www.vistax64.com/vista-general/79849-run-administrator-changes-default-directory.html

        FOR /F %%I IN ("%0") DO SET BATDIR=%%~dpI

        ECHO 批处理文件位于目录 %BATDIR%

        【讨论】:

        • 您可以直接使用%~dp0。此处无需调用for
        猜你喜欢
        • 2018-04-24
        • 2013-05-29
        • 2017-11-24
        • 1970-01-01
        • 2012-10-06
        • 2013-09-16
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多