При запуске скрипта PowerShell от имени администратора все аргументы пусты - PullRequest
1 голос
/ 22 марта 2019

У меня проблема при попытке запустить мой скрипт PowerShell (с именем autoupdateWindows.ps1) в качестве администратора ниже. Я хочу переместить / переименовать содержимое некоторых папок, например «Program Files (x86)», но, как я уже сказал, мне нужен PowerShell для администратора.

Param(
    [string]$installDir,
    [string]$appDir,
    [string]$installDirName,
    [string]$appDirName
)

#Elevate Powershell as admin it isn't
if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]"Administrator")) {
    $arguments = "& '" + $MyInvocation.MyCommand.Definition + "'"
    Start-Process powershell -Verb runAs -ArgumentList $arguments
    break
}

Write-Output $installDir
Write-Output $appDir
Write-Output $installDirName
Write-Output $appDirName

Remove-Item -path $installDir\$installDirName -recurse
Move-Item -path $appDir -destination $installDir
Rename-Item -path $installDir\$appDirName -newname $installDirName

#Pause
if ($Host.Name -eq "ConsoleHost") {
    Write-Host "Press any key to continue..."
    $Host.UI.RawUI.ReadKey("NoEcho,IncludeKeyUp") > $null
}

А вот командная строка, которую я использую в моем окне PowerShell

powershell.exe -file .\autoupdateWindows.ps1 "c:\Program Files (x86)", "c:\users\dcommun\downloads", "installDir", "appDir"

Поэтому, когда я его использую, все четыре параметра (аргументы) пусты. Но когда я удаляю первый блок if, чтобы запустить PowerShell от имени администратора, параметры заполняются правильно. Я могу сделать это только таким образом (в скрипте), чтобы иметь доступ к папкам типа «Program Files (x86)».

1 Ответ

1 голос
/ 22 марта 2019

$MyInvocation.MyCommand.Definition - это просто скрипт без аргументов, поэтому вы фактически пропускаете аргументы при возврате скрипта.Определите $arguments как массив скрипта и другие параметры.

if (-not ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole]'Administrator')) {   
    $arguments = '-File', $MyInvocation.MyCommand.Definition,
                 $installDir, $appDir, $installDirName, $appDirName
    Start-Process 'powershell.exe' -Verb RunAs -ArgumentList $arguments -NoNewWindow -Wait
    exit $LastExitCode
}
...