仅当以管理员身份运行时,无法从.bat文件中找到powershell文件的文件路径

ruarlubt  于 2022-12-29  发布在  Shell
关注(0)|答案(1)|浏览(471)

当我从一个bat文件运行以下代码时,我收到一个错误消息,说Access is denied because I not running as administrator(访问被拒绝,因为我不是以管理员身份运行)。

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File ".\test.ps1"

not as admin
当我以管理员身份运行.bat文件时,收到一个错误消息,说找不到powershell文件。
as admin
当我不以管理员身份运行bat文件时,错误消息的第二行显示它能够找到文件路径,所以我很困惑为什么它不能以管理员身份找到路径。

rqqzpn5f

rqqzpn5f1#

您引用的PowerShell脚本文件test.ps1位于 * 当前目录 *(.\)中,除非您事先显式设置当前目录或使用绝对路径(请参阅下文),否则批处理文件将无法正常工作。
例证:

  • 通过双击批处理文件,从文件资源管理器中打开该批处理文件会使 * 该批处理文件所在的 * 目录成为当前目录,因此,如果您的.ps1脚本位于 * 相同的 * 目录中,则调用将在 * 这种情况下 * 起作用。
  • 相比之下,当您通过右键单击并选择Run as administrator来打开带有标高 * 的批处理文件 * 时,* C:\Windows\System32将成为当前目录 *,并且您的调用将失败。
    • 解决方案:**
  • 或者:显式将批处理文件自己的目录设置为当前目录:
pushd "%~dp0"
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File ".\test.ps1"
popd
  • 注:
  • 使用pushd是最可靠的解决方案,因为如果通过 * UNC路径 * 调用批处理文件,cd /d "%~dp0"将无法工作。与cd不同,pushd * 会自动将驱动器号 * Map到给定的UNC路径,这是必要的,因为cmd.exe不允许直接使用UNC路径作为工作目录; pushdZ:开始向后查找未使用的驱动器号。
  • 但是,为了再次 * 释放 * 该驱动器号,需要一个成对的popd调用,而如果将cd /d "%~dp0"setlocal组合(见下文),则不需要进一步的操作。
  • 如果您不需要支持通过UNC路径进行调用,也可以使用cd /d "%~dp0" || exit /b,如果发生这种情况,它会使用退出代码1中止执行。
  • 在任何一种情况下,建议将setlocal放在批处理文件的开头,这样工作目录中的更改 * 仅限于批处理文件 *,而不会影响调用者;例如,使用@echo off & setlocal启动批处理文件。

请注意,setlocal还使批处理文件中创建或修改的任何 * 变量 * 成为该脚本的本地变量,不过,这通常也是可取的。

  • 或者,如果当前目录并不重要,只要您指向正确的.ps1文件:
C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy Bypass -File "%~dp0test.ps1"
    • 关于%~dp0**的语法:

%~dp0扩展到批处理文件自身目录的完整路径;语法在call /?的输出中进行了解释,但简而言之:%0引用批处理文件名或路径 * 作为调用 *,~dp将其修改为(仅)报告驱动器(d)和完整目录路径(p)。

相关问题