簡體   English   中英

顯示默認值的 powershell 強制參數

[英]powershell mandatory parameter with default value shown

我正在尋找一種方法讓 PowerShell 腳本請求一個參數,該參數需要是強制性的,但顯示一個默認值,例如:

    .\psscript
    Supply values for the following parameters:
    parameter1[default value]:
    parameter2[1234]:

我想要求輸入但提供一些默認值。

如果我使用強制選項,它會很好地要求值,但不會顯示默認值或處理給定值。 如果我沒有強制要求,那么 PowerShell 根本不會要求該值。

這是我嘗試過的一些腳本示例:

    [CmdletBinding()]
    Param(
        [parameter(Mandatory=$true)] $SqlServiceAccount = $env:computername + "_sa",
        [parameter(Mandatory=$true)] $SqlServiceAccountPwd
    )

如果我只是在第一個參數上按 Enter 鍵,此腳本會詢問參數,但不會顯示或處理默認值。

    [CmdletBinding()]
    Param(
        [parameter(Mandatory=$false)] $SqlServiceAccount = $env:computername + "_sa",
        [parameter(Mandatory=$true)] $SqlServiceAccountPwd
    )

這個腳本不要求第一個參數,而是處理默認值。

根據定義:強制參數沒有默認值。 即使您提供了一個,除非在調用命令時指定,否則 PowerShell 也會提示輸入值。 然而,有一種“hacky”的方式來獲得你所要求的東西。 由於變量(以及因此 - 參數)可以具有您希望的任何名稱,因此使用與您希望看到的提示匹配的參數來定義命令就足夠了:

function foo {
    param (
        [Parameter(Mandatory = $true)]
        [Alias('Parameter1')]
        [AllowNull()]
        ${Parameter1[default value]},
        [Parameter(Mandatory = $true)]
        [Alias('Parameter2')]
        [AllowNull()]
        ${Parameter2[1234]}
    )
    $Parameter1 = 
        if (${Parameter1[default value]}) {
            ${Parameter1[default value]}
        } else {
            'default value'
        }
    $Parameter2 = 
        if (${Parameter2[1234]}) {
            ${Parameter2[1234]}
        } else {
            1234
        }
    [PSCustomObject]@{
        Parameter1 = $Parameter1
        Parameter2 = $Parameter2
    }
}

當調用不帶參數時,函數將向用戶顯示匹配參數名稱的提示。 當使用-Parameter1 notDefaultValue和/或使用-Parameter2 7 ,別名將啟動並將傳遞的值分配給所選參數。 由於這樣命名的變量使用起來並不有趣 - 將值(默認值或由用戶傳遞)分配給與我們的別名/假參數名稱匹配的變量是有意義的。

這是一個可能有幫助的簡短示例:

    [CmdletBinding()]
    Param(
        $SqlServiceAccount = (Read-Host -prompt "SqlServiceAccount ($($env:computername + "_sa"))"),
        $SqlServiceAccountPwd = (Read-Host -prompt "SqlServiceAccountPwd")
    )
    if (!$SqlServiceAccount) { $SqlServiceAccount = $env:Computername + "_sa" }
    ...

沒有辦法通過強制參數和 powershell 提示來做你想做的事。

相反,您必須將其設為可選(刪除強制性),然后自己實現提示代碼( Read-Host ,但將空白響應作為默認值;類似的東西)。

我會這樣做

param(
    [Parameter(Mandatory)][string]$aString
)

if([string]::IsNullOrWhiteSpace($aString))
{
   $aString = "A Default Value"
}

在我看來,如果您在param()塊中使用Read-Host ,那么您就做錯了。 那時,使用param()的意義何在?

暫無
暫無

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

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