使用相对路径的批处理文件中的 PowerShell

PowerShell from a batch file using relative path

我有一个批处理文件,它以提升的权限启动 PowerShell 脚本并绕过执行策略:

PowerShell -NoProfile -ExecutionPolicy Unrestricted -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Unrestricted -File ""C:\Users\Bob\Desktop\New folder\Server.ps1""' -Verb RunAs}";

这行得通耶!我希望能够使用相对路径作为文件路径。

PowerShell -NoProfile -ExecutionPolicy Unrestricted -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Unrestricted -File "".\Server.ps1""' -Verb RunAs}";

由于某种原因,这失败了。 我究竟做错了什么?

如果您的 PowerShell 脚本不在 cmd 指向的位置,您将在该目录中搜索相对路径时收到错误消息。如果 PS 脚本出现在批处理脚本的相同位置,您可以从批处理中调用 PS 脚本,如下所示:

Powershell "%~dp0Server.ps1"

如果 PowerShell 和批处理脚本位置不同,首先您需要在调用 PowerShell 脚本之前更改批处理中的目录,如下所示:

cd /d "C:\Users\Bob\Desktop\New Folder\"
Powershell -NoProfile .\Server.ps1
PowerShell -NoProfile -ExecutionPolicy Unrestricted -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Unrestricted -Command "Set-Location \"%~dp0\"; \".\Server.ps1\"' -Verb RunAs}"

-Verb RunAs 强制新的 Powershell 进程将目录更改为系统目录。您可以使用 set-location 将其更改为使用 %~dp0.

的批处理文件脚本目录

当使用 -Verb RunAs 时参数 -WorkingDirectory 似乎被忽略,因此对于此任务似乎已过时。

您可以查看此示例以了解 Powershell 进程对新提升的 Powershell 进程没有影响之前的当前目录或更改目录:

cd /d "%~dp0"
PowerShell -NoProfile -ExecutionPolicy Unrestricted -Command "& {Start-Process PowerShell -ArgumentList '-NoProfile -ExecutionPolicy Unrestricted -Command \"Get-Location; Start-Sleep 10\"' -Verb RunAs}"

输出:

Path
----
C:\Windows\system32

因此您可能需要在提升的 Powershell 进程中更改目录。