使用相对路径的批处理文件中的 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 进程中更改目录。
我有一个批处理文件,它以提升的权限启动 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 进程中更改目录。