当我从一个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文件时,错误消息的第二行显示它能够找到文件路径,所以我很困惑为什么它不能以管理员身份找到路径。
1条答案
按热度按时间rqqzpn5f1#
您引用的PowerShell脚本文件
test.ps1
位于 * 当前目录 *(.\
)中,除非您事先显式设置当前目录或使用绝对路径(请参阅下文),否则批处理文件将无法正常工作。例证:
.ps1
脚本位于 * 相同的 * 目录中,则调用将在 * 这种情况下 * 起作用。Run as administrator
来打开带有标高 * 的批处理文件 * 时,*C:\Windows\System32
将成为当前目录 *,并且您的调用将失败。pushd
是最可靠的解决方案,因为如果通过 * UNC路径 * 调用批处理文件,cd /d "%~dp0"
将无法工作。与cd
不同,pushd
* 会自动将驱动器号 * Map到给定的UNC路径,这是必要的,因为cmd.exe
不允许直接使用UNC路径作为工作目录;pushd
从Z:
开始向后查找未使用的驱动器号。popd
调用,而如果将cd /d "%~dp0"
与setlocal
组合(见下文),则不需要进一步的操作。cd /d "%~dp0" || exit /b
,如果发生这种情况,它会使用退出代码1
中止执行。setlocal
放在批处理文件的开头,这样工作目录中的更改 * 仅限于批处理文件 *,而不会影响调用者;例如,使用@echo off & setlocal
启动批处理文件。请注意,
setlocal
还使批处理文件中创建或修改的任何 * 变量 * 成为该脚本的本地变量,不过,这通常也是可取的。.ps1
文件:%~dp0
**的语法:%~dp0
扩展到批处理文件自身目录的完整路径;语法在call /?
的输出中进行了解释,但简而言之:%0
引用批处理文件名或路径 * 作为调用 *,~dp
将其修改为(仅)报告驱动器(d
)和完整目录路径(p
)。