使用相对路径的Windows快捷方式到PowerShell脚本

3

当创建一个Windows快捷方式来启动PowerShell脚本时,以下内容在普通用户双击和右键选择以管理员身份运行时都可以正常工作:

%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy "Bypass" -Command "&{& 'C:\Script.ps1'}"

示例截图

然而,当路径是相对路径且未知时,以下内容在普通用户双击时正常工作,但在右键单击 以管理员身份运行 时不起作用:

%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy "Bypass" -Command "&{& '.\Script.ps1'}"

我的问题是,当路径为相对路径时,如何使其在两种情况下都可用?我尝试使用PSScriptRoot,但也没有起作用。

谢谢你的帮助。


相对于什么?在截图中,您的“起始位置”框为空。您是在填写该框,还是使用其他路径启动? - Ryan Bemrose
这是我对这个问题的解决方案:https://dev59.com/4n3aa4cB1Zd3GeqPhb_g#35054677 - Mica
3个回答

2
从资源管理器以管理员身份启动时,您必须提供脚本的绝对路径。
当以管理员身份启动进程时,资源管理器忽略快捷方式中的起始目录。相反,管理员级别的进程始终在[Environment]::GetFolderPath('System')(通常为C:\Windows\System32)中使用当前目录启动。
在不同的目录中运行的简单方法是在脚本开头更改目录。以下行将cd到脚本所在的目录。
Set-Location $PsScriptRoot

如果脚本需要在不同路径启动,则可能需要编写一个函数来查找本地机器上该路径的位置(例如枚举USB驱动器)。

感谢你的帮助,Ryan。问题在于脚本启动器和脚本可以在USB存储设备或网络共享位置上。因此,它们所在的位置是不同的。这可以通过 Set-Location 来解决吗?而且,由于我们事先不知道 Start in 的位置,因此它保持为空白。 - DarkLite1
更新了答案,让它更简单一些。顺便说一句,Set-Locationcd 是一样的。后者只是前者的别名。 - Ryan Bemrose

0
我找到的唯一解决方案是:
  1. 创建一个包含以下两行的CMD脚本:
cd %~dp0
powershell.exe -noexit "& .\your-script.ps1"
  1. 创建此CMD的快捷方式并编辑属性,以管理员身份执行它

现在您可以使用快捷方式以相对路径的形式以管理员身份执行您的PowerShell脚本。

如果您更改了cmd文件的位置,或者重命名包含脚本的文件夹,Windows似乎不会关心它(快捷方式的属性已更新)...


0

您可以使用当前的解决方案来创建非管理员推广快捷方式,然后在内部自动推广脚本:

# ========================================= Admin Rights =======================================================
# Usage: asAdmin $PSCommandPath
function asAdmin
{
    [string]$cmdPath = $args[0]
    if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) { Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$cmdPath`"" -Verb RunAs; exit }
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接