具有相对路径的PowerShell脚本的Windows快捷方式

ctzwtxfj  于 2023-04-12  发布在  Shell
关注(0)|答案(3)|浏览(156)

当创建Windows快捷方式来启动PowerShell脚本时,当作为普通用户双击并右键单击Run as administrator时,以下内容可以正常工作:

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

然而,当路径是相对的并且不预先知道时,以下内容在作为常规用户双击时可以正常工作,但右键单击Run as administrator则不行:

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

我的问题是,当路径是相对路径时,如何在两种情况下都能工作?我尝试使用PSScriptRoot,但也不起作用。
谢谢你的帮助。

pcww981p

pcww981p1#

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

Set-Location $PsScriptRoot

如果脚本需要在不同的路径中启动,那么您可能必须编写一个函数来发现该路径在本地机器上的位置(例如enumerating USB drives)。

3zwjbxry

3zwjbxry2#

您可以将当前解决方案用于非管理员提升的快捷方式,然后在内部自动提升脚本:

# ========================================= 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 }
}
6uxekuva

6uxekuva3#

我找到的唯一解决方案是:
1.使用以下两行创建CMD脚本:

cd %~dp0
powershell.exe -noexit "& .\your-script.ps1"

1.创建此CMD的快捷方式并编辑属性以管理员身份执行
现在,您可以使用快捷方式以管理员身份使用相对路径执行PowerShell脚本。
如果你改变了cmd文件的位置,或者如果你重命名了包含你的脚本的文件夹,windows似乎并不关心它(快捷方式的属性被更新)。

相关问题