使用参数提升脚本
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
我有一个 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