以管理员身份运行PowerShell脚本,所有参数均为空

时间:2019-03-22 15:21:22

标签: powershell administrator

当我尝试以下面的管理员身份运行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 个答案:

答案 0 :(得分:1)

$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
}