Подтвердить что ты не робот

Создайте функцию с необязательными переменными вызова

Есть ли способ создать параметр в функции PowerShell, где вы должны называть его, чтобы он считался?

Пример, заданный commandlet (жирным существом, что я хочу сделать):

Invoke-Command -computername Server01 -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", я хочу, чтобы что-то произошло в script. Если "-Domain" присутствует и имеет с ним аргумент, я хочу, чтобы это использовалось, а не заданный аргумент.

4b9b3361

Ответ 1

Powershell предоставляет много встроенной поддержки общих сценариев параметров, включая обязательные параметры, необязательные параметры, параметры "switch" (aka flag) и "наборы параметров".

По умолчанию все параметры являются необязательными. Самый простой подход - просто проверить каждый из них на $null, а затем реализовать любую логику, которую вы хотите оттуда. Это в основном то, что вы уже указали в своем примере кода.

Если вы хотите узнать обо всех специальных предложениях, которые может предоставить вам Powershell, ознакомьтесь с этими ссылками:

about_Functions

about_Functions_Advanced

about_Functions_Advanced_Parameters

Ответ 2

Я не думаю, что ваш вопрос очень ясен, этот код предполагает, что если вы собираетесь включить параметр -domain, он всегда будет "named" (т.е. 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"
    }
}

Ответ 3

Не уверен, что я правильно понял вопрос.

Из того, что я собираю, вы хотите иметь возможность присвоить значение Domain, если оно равно null, а также, что нужно проверить, задан ли $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"

Помогло ли это?

Ответ 4

Я наткнулся на этот вопрос в поисках ответа на ту же проблему. Я нашел великолепный обзор/учебник, который я хочу поделиться с вами, будущие путешественники:

PowerShell ABC - P для параметров