#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
только один параметр, onlycreate
будет привязан к вашему вызову скрипта из-за пробелов без кавычек.
Ответ №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
справки