web-dev-qa-db-ja.com

オプションの呼び出し変数を使用して関数を作成する

PowerShell関数でパラメーターを作成する方法はありますか?

コマンドレットで与えられた例(太字は私がやりたいことです):

Invoke-Command-computernameServer01-Scriptblock{...}

関数で何をしたいのかの例を示します

Function DoStuff($computername, -arg2, -domain $domain)
    Test-parameter(-domain) if (-domain -eq $true) {
        use $domain
    }
    Else {
        $domain = "Domain1"
    }
    test-parameter($arg2) {
        if ($arg2 -eq $true) {
            Do something
        }
        else {
            Do the opposite
        }
    }

要約すると:

"-arg2"が存在する場合、スクリプトで何かが発生するようにします。 「-Domain」が存在し、引数が指定されている場合、set引数ではなく、それを使用する必要があります。

19
user100541

Powershellは、必須パラメーター、オプションパラメーター、「スイッチ」(別名フラグ)パラメーター、「パラメーターセット」など、一般的なパラメーターシナリオに対して多くの組み込みサポートを提供します。

デフォルトでは、すべてのパラメーターはオプションです。最も基本的なアプローチは、それぞれの$nullを単純にチェックし、そこから必要なロジックを実装することです。これは基本的に、サンプルコードで既に示したものです。

Powershellが提供できるすべての特別なサポートについて知りたい場合は、次のリンクをご覧ください。

about_Functions

about_Functions_Advanced

about_Functions_Advanced_Parameters

29
latkin

あなたの質問は非常に明確ではないと思いますが、このコードは、-domainパラメーターを含める場合、常に「名前付き」であると想定しています(つまり、dostuff computername arg2 -domain domain);これにより、computernameパラメーターも必須になります。

Function DoStuff(){
    param(
        [Parameter(Mandatory=$true)][string]$computername,
        [Parameter(Mandatory=$false)][string]$arg2,
        [Parameter(Mandatory=$false)][string]$domain
    )
    if(!($domain)){
        $domain = 'domain1'
    }
    write-Host $domain
    if($arg2){
        write-Host "arg2 present... executing script block"
    }
    else{
        write-Host "arg2 missing... exiting or whatever"
    }
}
17
nimizen

質問を正しく理解しているかどうかわかりません。

私が収集したものから、Domainがnullの場合にDomainに値を割り当て、$ args2が提供されているかどうかを確認し、値に従って特定のコードを実行できるようにしたいですか?

上記の仮定を再構築するためにコードを変更しました。

Function DoStuff($computername, $arg2, $domain)
{
    if($domain -ne $null)
    {
        $domain = "Domain1"
    }

    if($arg2 -eq $null)
    {
    }
    else
    {
    }
}

DoStuff -computername "Test" -arg2 "" -domain "Domain2"
DoStuff -computername "Test" -arg2 "Test"  -domain ""
DoStuff -computername "Test" -domain "Domain2"
DoStuff -computername "Test" -arg2 "Domain2"

それは役に立ちましたか?

6
user983965