使用参数提升脚本

Elevate a script with parameters

我有一个 Powershell 脚本,其中包含我希望能够自行提升的参数。

[CmdletBinding()]
param (
    [Parameter(ParameterSetName="cp")]
    [Switch]
    $copy = $false,
    [Parameter(ParameterSetName="mv")]
    [Switch]
    $move = $false
)
# Elevate if required
if (-not ([Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] 'Administrator')) {
  if ([int](Get-CimInstance -Class Win32_OperatingSystem | Select-Object -ExpandProperty BuildNumber) -ge 6000) {
    $Cmd = (
      '-File',
      "`"$($MyInvocation.MyCommand.Path)`"",
      $MyInvocation.BoundParameters
    )
    $ProcArgs = @{
      FilePath = 'PowerShell.exe'
      Verb = 'RunAs'
      ArgumentList = $Cmd
    }
    Start-Process @ProcArgs
    Exit
  }
}
Set-Location -LiteralPath $PSScriptRoot
Write-Host "$copy"
Pause

如果我注释掉 param 块和 运行 script.ps1 -copy,一个提升的 Powershell window 打开并打印出 Press enter to continue,即它工作。

如果我注释掉 if 语句,当前 window 输出 True,即它也有效。

如果我 运行 整个事情,提升的 windows 打开一瞬间,然后关闭忽略 Pause 没有任何输出。 我希望提升的 window 打开并打印出来 True.

我在 Linux 上测试了这个并为我工作但无法在 Windows 上测试,我没有看到其他方法必须将 $PSBoundParameters 操纵成 strings-ArgumentList.

上传递参数

以下代码专门用于测试,因此我删除了 if 条件。

[CmdletBinding()]
param (
    [Parameter(ParameterSetName="cp")]
    [Switch]$copy,
    [Parameter(ParameterSetName="mv")]
    [Switch]$move
)

$argument = @(
    "-File $PSCommandPath"    
    "-$($PSBoundParameters.Keys)"
)

$ProcArgs = @{
    FilePath = 'powershell.exe'
    Verb = 'RunAs'
    ArgumentList = $argument
}

Start-Process @ProcArgs

"Started new Process with the argument: -$($PSBoundParameters.Keys)"
[System.Console]::ReadKey()
Exit