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

时间:2016-07-29 12:05:30

标签: powershell shortcut

创建Windows快捷方式以启动Run as administrator脚本时,以常规用户双击并右键单击%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy "Bypass" -Command "&{& 'C:\Script.ps1'}" 时,以下工作正常:

Run as administrator

Example screenshot

但是,如果路径是相对的并且未提前知道,那么当双击普通用户而不是右键单击%SystemRoot%\System32\WindowsPowerShell\v1.0\powershell.exe -ExecutionPolicy "Bypass" -Command "&{& '.\Script.ps1'}" 时,以下工作正常:

PSScriptRoot

我的问题是,当路径相对时,我怎样才能使它工作?我尝试使用require 'openssl' key = '123' data = 'test string' digest = OpenSSL::Digest::SHA1.new # See how HMAC uses SHA1 here: result = OpenSSL::HMAC.hexdigest(digest, key, data) # => "a145f4d366e9e4e96b80bc427144ba77b3c7151a", same as your node result ,但这也无效。

感谢您的帮助。

2 个答案:

答案 0 :(得分:2)

从资源管理器以管理员身份启动时,您必须提供脚本的绝对路径。

当以管理员身份启动进程时,Explorer.exe会忽略快捷方式中的起始目录。相反,管理员级流程始终使用[Environment]::GetFolderPath('System')中的当前目录启动(通常为C:\Windows\System32

在不同目录中运行的简便方法是在脚本开头更改目录。以下行将cd到脚本所在的目录。

Set-Location $PsScriptRoot

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

答案 1 :(得分: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 }
}