PowerShell: Передать в качестве аргумента значение параметра-ключа

Не совсем понятный заголовок, придётся здесь пояснять…
В качестве параметра к скрипту можно передавать не просто строку, но и ключ. Если ключ есть, его значение будет true, если его нет, то false (если иное не указано явно). Мне нужно было вызвать скрипт повторно с принудительным повышением уровня привилегий до администратора, но для корректного его вызова нужно было вместе с ним передать значение его параметров.
За основу я взял пример отсюда:

# Check if script is running as Adminstrator and if not use RunAs
Write-Host "Checking if the script is running as Administrator"
$IsAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")
if (-not $IsAdmin){
    Write-Host "The script is NOT running as Administrator, restarting PowerShell as Administrator..."
    $cmd = $MyInvocation.MyCommand.Path + " -Parameter1 $Parameter1 -Parameter2 $Parameter2 -Parameter3 $Parameter3"
    $arguments = "-NoProfile -NoExit -Command ""& {$cmd} """ 
    Start-Process "$psHome\powershell.exe" -Verb Runas -ArgumentList $arguments -WorkingDirectory $localpath -ErrorAction 'stop'
    Break              
}
else{
    Write-Host "The script is already running as Administrator"
}

При этом мой скрипт вызывался с ключами (например ключ $Stop), их значения мне тоже необходимо было передать для повторного вызова скрипта. Со строковыми параметрами проблем не было, но значения ключей не передавались.

TestRunAs.ps1 : Cannot process argument transformation on parameter 'Install'.
Cannot convert value "System.String" to type "System.Management.Automation.SwitchParameter".
Boolean parameters accept only Boolean values and numbers, such as $True, $False, 1 or 0.
At line:1 char:98
+ ... l\TestRunAs.ps1 -Stop:$False -DeleteTask:$False -Install:True -Uninst ...
+ ~~~~
+ CategoryInfo : InvalidData: (:) [TestRunAs.ps1], ParameterBindingArgumentTransformationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,TestRunAs.ps1

Проблему я решил, передав в качестве аргумента все эти ключи и их значения. Но в этом случае мне пришлось использовать символ обратного апострофа (back tick) — это клавиша на клавиатуре слева от единицы: `
Таким образом мой скрипт с повышением уровня привилегий и передачей ключей в качестве параметра стал таким:

param (
    [switch]$DeleteTask,
    [switch]$Stop,
    [switch]$Install,
    [switch]$Uninstall,
    [string]$Parameter1
 )
# Check if script is running as Adminstrator and if not use RunAs
Write-Host "Checking if the script is running as Administrator"
$IsAdmin = ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")
if (-not $IsAdmin)
{
  Write-Host "The script is NOT running as Administrator, restarting PowerShell as Administrator..."
  $cmd = $MyInvocation.MyCommand.Path + " -Stop:`$$Stop -DeleteTask:`$$DeleteTask -Install:`$$Install -Uninstall:`$$Uninstall -Parameter `'$Parameter`'"
  $arguments = "-NoProfile -NoExit -Command ""& {$cmd} """
  Start-Process "$psHome\powershell.exe" -Verb Runas -ArgumentList $arguments -ErrorAction 'stop'
  Exit
}
Write-Host "The script is running as Administrator"

Write-Output "DeleteTask = $DeleteTask"
Write-Output "Stop = $Stop"
Write-Output "Install = $Install"
Write-Output "Parameter = $Parameter"

Read-Host "Press <Enter> to exit..."


Подписаться
Уведомление о
guest
0 Комментарий
Inline Feedbacks
View all comments