Передача аргументов функции, вызываемой внутри коммутатора в PowerShell

#powershell

#powershell

Вопрос:

При запуске моего сценария PowerShell я хочу вызвать функцию в зависимости от первого переданного аргумента. Для этого я использую переключатель.

 function veeamScript([string]$command) {
    switch($command)
    {
        install
        {
            install #calls a function which doesn't need arguments
        }
        create
        {
            create($name, $server, $username, $password)
        }
        Default
        {
            echo "The help text"
        }
    }
}

scriptName($command)
 

Если я вызову скрипт следующим образом

 scriptName.ps1 create myname myserver theusername thepassword
 

Он должен вызывать эту функцию

 function create($name, $server, $username, $password) {
    $check=checkIfInstalled # This calls another function which works and is either true or false

    if ($check -eq $true)
    {
        echo "Name: $name"
        echo "Server: $server"
        echo "Username: $username"
        echo "Password: $password"
        ...
    } else
    {
        echo "ERROR ..."
    }
}
 

Однако все эхо-сигналы «пустые» (например, после имени: ).

Похоже, что аргументы не передаются через коммутатор, а тем более функции. Я добавил echo в коммутатор перед вызовом функции, и echo также пусто.

 create
        {
            echo "$name" # Also tried it without the double quotation marks, didn't work
            create($name, $server, $username, $password)
        }
 

Кто-нибудь знает, как я могу вызвать свой скрипт, позволить коммутатору решить, какая функция вызывается (в зависимости от первого аргумента), и передать остальные аргументы?

Комментарии:

1. Правильный способ вызова функции — использовать пробел в качестве разделителя между функцией и ее параметромr. Это позволяет правильно анализировать элементы —> create $name $server $username $password . Вам понадобится, чтобы ваша функция была определена в коде до того, как произойдет вызов функции. С учетом сказанного, поскольку имеет VeeamScript только один параметр, only create будет привязан к вашему вызову скрипта из-за пробелов без кавычек.

Ответ №1:

Используйте $args автоматическую переменную и оператор @ splat:

 # scriptName.ps1

# split arguments into first,rest
$command,$actualArguments = $args

# check that command name is valid
if($command -in 'create','install')
{
  # user provided a valid command name, let's execute it with the remaining args
  amp; $command @actualArguments
}
else
{
  # throw an error or show usage text
  "Usage: ..."
}
 

Теперь он будет работать как с именованными, так и с позиционными аргументами параметров, и вам даже не понадобится switch 🙂

Дополнительные сведения о разделении см. в разделе about_Splatting справки