Не совсем понятный заголовок, придётся здесь пояснять…
В качестве параметра к скрипту можно передавать не просто строку, но и ключ. Если ключ есть, его значение будет 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..."
- Windows 10: Уменьшить размер виртуальной машины WSL - 06.10.2024
- Windows 10: Событие EventID 63 в Журнале Приложений - 28.09.2024
- Android: Захват траффика - 07.09.2024