【问题标题】:Why does 'Run as administrator' change (sometimes) batch file's current directory?为什么“以管理员身份运行”会更改(有时)批处理文件的当前目录?
【发布时间】:2015-10-15 19:56:40
【问题描述】:

我有一个批处理文件,它与我想要xcopy 的文件位于同一目录中。但由于某种原因,找不到该文件。

我认为当前目录始终是批处理文件所在的位置。

我以管理员身份运行批处理文件。这发生在 Windows 7 64 位台式计算机上。

批处理文件:

@ECHO OFF
XCOPY /y "File1.txt" "File2.txt"
PAUSE

错误:

File not found - File1.txt
0 File(s) copied

【问题讨论】:

  • xcopy 如果我使用完整路径,但不能单独使用文件名。
  • DIR 添加到批处理文件中,在屏幕上转储了一堆文件 - 它看起来像system32 目录。
  • 试试xcopy /y "%~dp0File1.txt" "%~dp0 File2.txt"
  • 这行得通。这与提供完整路径相同。

标签: batch-file process windows-7 working-directory


【解决方案1】:

错误信息非常不言自明。找不到文件file1.txt

由于文件名不包含绝对路径,系统会尝试在当前目录中查找。您的当前目录不包含此文件。

您的误解是当前目录不是包含 bat 文件的目录。这是两个不相关的概念。

您可以通过在 bat 文件中添加这两个命令来轻松检查

echo BAT directory is %~dp0
echo Current directory  is %CD%

您会注意到它们是不同的,并且最后一个反斜杠的附加方式存在细微差别。

所以,基本上有两种方法可以解决这个问题

  1. 要么更改当前目录以匹配预期的目录

    pushd %~dp0
    XCOPY /y "File1.txt" "File2.txt"
    popd
    
  2. 或在命令中指定完整路径

    XCOPY /y "%~dp0File1.txt" "%~dp0File2.txt"
    

【讨论】:

  • 很公平,但为什么它在某些计算机上有效,而在其他计算机上无效?根据this answer,工作目录应该是启动批处理文件的目录。我通过右键单击批处理文件然后“以管理员身份运行”来启动它。
  • 好的,我刚刚发现'以管理员身份运行'是将当前目录从批处理文件的位置更改为c:\windows的罪魁祸首\system32。但是,我在另一台计算机上以管理员身份运行了相同的批处理文件,显然它并没有改变CD,因为它可以工作。所以不一致。
【解决方案2】:

使用上下文菜单项以管理员身份运行启动批处理文件时,哪个目录是当前工作目录取决于当前用户的用户帐户控制 (UAC)设置。

这可以通过以下小批量文件C:\Temp\Test.bat来演示:

@echo Current directory is: %CD%
@pause

用户帐户控制设置

中选择

默认 - 仅当程序尝试更改我的计算机时通知我

  • 当我更改 Windows 设置时不通知我

并且使用 以管理员身份运行,Windows 使用注册表项

HKEY_CLASSES_ROOT\batfile\shell\runasuser\command

此注册表项不包含用于执行批处理文件的默认字符串。取而代之的是字符串值DelegateExecute,CLSID 为{ea72d00e-4960-42fa-ba92-7792a7944c1d}

结果是打开一个对话框窗口,标题为用户帐户控制和文本:

您要允许以下程序对此计算机进行更改吗?

程序名称:Windows 命令处理器
已验证发布者:Microsoft Windows

在用户确认后,Windows 会临时打开一个新的用户会话,就像在命令行上使用 RunAs 时一样。

在这个新用户会话中,当前工作目录是%SystemRoot%\System32,现在执行 Windows 注册表中定义的命令,默认字符串为密钥

HKEY_CLASSES_ROOT\batfile\shell\runas\command

这是:

%SystemRoot%\System32\cmd.exe /C "%1" %*

因此打开一个控制台窗口,标题为 C:\Windows\System32\cmd.exe 和两行:

Current directory is: C:\Windows\System32
Press any key to continue . . .

按任意键后,批处理执行完成,导致关闭cmd.exe,从而关闭用户会话。


但是在用户帐户控制设置

中进行了选择

从不通知我

  • 程序尝试安装软件或对我的计算机进行更改

  • 我对 Windows 设置进行了更改

行为有所不同,因为用户已经提升了权限。

现在 Windows 直接使用命令

%SystemRoot%\System32\cmd.exe /C "%1" %*

根据key的默认字符串

HKEY_CLASSES_ROOT\batfile\shell\runas\command

在当前用户会话中。

结果是打开一个标题为C:\Windows\System32\cmd.exe的控制台窗口,但在窗口中显示的是:

Current directory is: C:\Temp
Press any key to continue . . .

父进程的当前工作目录(Windows Explorer 作为桌面)用于执行批处理文件,因为在这种情况下不需要切换到不同的用户会话。


PA 在他的回答中已经发布了 2 个可能的解决方案,我在这里复制了一个小的改进(pushd,目录用双引号括起来)并添加了第三个。

  1. 使用 pushdpopd 将当前目录更改为批处理文件的目录:

    pushd "%~dp0"
    %SystemRoot%\System32\xcopy.exe "File1.txt" "File2.txt" /Y
    popd
    

    这也适用于 UNC 路径。在命令提示符窗口pushd /? 中运行以解释为什么这也适用于 UNC 路径。

  2. 在源和目标规范中使用批处理文件的目录:

    %SystemRoot%\System32\xcopy.exe "%~dp0File1.txt" "%~dp0File2.txt" /Y
    
  3. 使用 cd 将工作目录更改为批处理文件的目录:

    cd /D "%~dp0"
    %SystemRoot%\System32\xcopy.exe "File1.txt" "File2.txt" /Y
    

    这不适用于 UNC 路径,因为默认情况下命令解释器 cmd 不支持将 UNC 路径作为当前目录,请参阅例如 CMD does not support UNC paths as current directories 了解详细信息。

【讨论】:

    【解决方案3】:

    为了完整和模糊,我添加了另一种解决方法,确认在 Windows 8.1 下工作并预计在其他地方工作,因为它依赖于记录的功能:

    您可以将runas命令定义键
    HKEY_CLASSES_ROOT\batfile\shell\runas\command
    HKEY_CLASSES_ROOT\cmdfile\shell\runas\command改为

    %SystemRoot%\System32\cmd.exe /S /C "(for %%G in (%1) do cd /D "%%~dpG") & "%1"" %*
    

    这会导致batcmd 文件在使用runas 动词启动时从其包含目录开始,分别是“以管理员身份运行”菜单项。

    添加到原始命令的确切作用:

    • cmd /S/C 之后去除命令字符串中的第一个和最后一个(双)引号
    • for %%G in (%1) do 枚举其单个条目,%1 参数, 使其可在循环体中以%%G 的形式扩展;这封信是任意的,但有些可能是“保留的”
    • %%~dpG 扩展到 %%Gdrive 和 path,~ 波浪号去掉引号 if 存在,这就是我们明确添加它们的原因
    • cd /Ddrive 和 directory 都更改为其参数,最后
    • & 运行第二个命令 "%1" %* 而不管第一个命令是否成功。

    可以使用pushd,它甚至支持UNC 路径,但是一个流浪的popd 会将任何脚本放在system32 目录中,这不是我喜欢的行为。

    应该也可以为 exefile 条目执行此操作,但坦率地说,我宁愿忍受这种不一致,也不愿在我的系统上尝试这样做,因为那里可能出现任何错误打破很多。

    享受打败你的操作系统的安全机制:)

    【讨论】:

      猜你喜欢
      • 2017-11-24
      • 1970-01-01
      • 2010-10-14
      • 2012-10-06
      • 2013-05-29
      • 2013-09-16
      • 1970-01-01
      相关资源
      最近更新 更多