簡體   English   中英

將 arguments 傳遞給 Powershell 腳本

[英]Passing arguments to Powershell script

我有一個最多接受 3 個參數的腳本——用戶名、密碼和發行版。

該腳本需要以管理員身份運行,因為它會檢查某些功能是否已啟用並且只能以管理員身份運行。

# the command line is:
# linux-docker <username> <password> <distro>
# if no distro is specified then Debian is used.
param ([Parameter(Mandatory)]$username, [Parameter(Mandatory)]$password,  $distro='Debian')

# check if we are in admin mode and switch if we aren't
$currentPrincipal = New-Object Security.Principal.WindowsPrincipal([Security.Principal.WindowsIdentity]::GetCurrent())
if (-Not $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)) {
    if (!([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
        Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`"" -Verb RunAs; 
        Read-Host -Prompt "Failure: Press Enter to exit"
        exit;
    }
}

# ... rest of script

但是重新啟動腳本會提示用戶輸入用戶名和密碼。 我想將 arguments 傳遞給提升的腳本。

我首先想到的是將$username$password$distro添加到Start-Process命令。

Start-Process powershell.exe "-NoProfile -ExecutionPolicy Bypass -File `"$PSCommandPath`" $username $password $debian" -Verb RunAs;

但這會以“失敗”消息退出。

所以我查看了-ArgumentList但是死於處理該行:

Start-Process : A positional parameter cannot be found that accepts argument '-NoProfile -ExecutionPolicy Bypass -File "C:\Users\Graham Reeds\Documents\linux-docker.ps1"'.
At C:\Users\Graham Reeds\Documents\linux-docker.ps1:15 char:9
+         Start-Process powershell.exe "-NoProfile -ExecutionPolicy Byp ...
+         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidArgument: (:) [Start-Process], ParameterBindingException
    + FullyQualifiedErrorId : PositionalParameterNotFound,Microsoft.PowerShell.Commands.StartProcessCommand
 
Failure: Press Enter to exit:

這可能很簡單,但我是 Powershell 的菜鳥。

使用-ArgumentList參數應該有效,但對於發送到腳本的參數,您需要從 BoundParameters hash 中獲取它們的名稱和值:

$currentPrincipal = [Security.Principal.WindowsPrincipal] [Security.Principal.WindowsIdentity]::GetCurrent()
$isAdmin = $currentPrincipal.IsInRole([Security.Principal.WindowsBuiltInRole]::Administrator)

if (!$isAdmin) {
    $argList = '-NoLogo', '-NoProfile', '-NoExit', '-ExecutionPolicy Bypass', '-File', ('"{0}"' -f $PSCommandPath)
    # Add script arguments
    $argList += $MyInvocation.BoundParameters.GetEnumerator() | ForEach-Object {"-$($_.Key)", "$($_.Value)"}
    try {
        Start-Process PowerShell.exe -WorkingDirectory $pwd.ProviderPath -ArgumentList $argList -Verb Runas -ErrorAction Stop
        # exit the current script
        exit
    }
    catch {
        Write-Warning "Failed to restart script '$PSCommandPath' with runas"
    }
}
# rest of the script

PS 就我個人而言,我喜歡始終對參數進行類型轉換,並在可能的情況下明確說明如果不使用強制參數,則應按什么順序給出命名:

param (
    [Parameter(Mandatory = $true, Position = 0)][string] $username, 
    [Parameter(Mandatory = $true, Position = 1)][string] $password,  
    [string] $distro='Debian'
)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM