Как передать несколько параметров в функцию в PowerShell? - PullRequest
375 голосов
/ 14 февраля 2011

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

Скрипт быстрого теста:

Function Test([string]$arg1, [string]$arg2)
{
    Write-Host "`$arg1 value: $arg1"
    Write-Host "`$arg2 value: $arg2"
}

Test("ABC", "DEF")

Сгенерированный вывод:

$arg1 value: ABC DEF
$arg2 value: 

Правильный вывод должен быть:

$arg1 value: ABC
$arg2 value: DEF

Это похоже на согласование между v1 и v2 на нескольких машинах, поэтомуочевидно, я делаю что-то не так.Кто-нибудь может указать, что именно?

Ответы [ 15 ]

2 голосов
/ 22 января 2014
Function Test([string]$arg1, [string]$arg2)
{
    Write-Host "`$arg1 value: $arg1"
    Write-Host "`$arg2 value: $arg2"
}

Test("ABC") ("DEF")
1 голос
/ 16 мая 2017
Function Test {
 Param([string]$arg1, [string]$arg2)
    Write-Host $arg1
    Write-Host $arg2
}

Это правильное объявление параметров https://technet.microsoft.com/en-us/library/dd347600.aspx

И оно действительно работает

1 голос
/ 08 ноября 2013

Я заявляю следующее:

Распространенной проблемой является использование формы единственного числа $arg, что неверно.
Оно всегда должно быть множественным числом как $args.

Проблема не в этом.
На самом деле, $arg может быть чем угодно.Проблема заключалась в использовании запятой и парантезов.
Я запускаю следующий работающий код, и результат выглядит следующим образом:

Код:

Function Test([string]$var1, [string]$var2)
{
    Write-Host "`$var1 value: $var1"
    Write-Host "`$var2 value: $var2"
}

Тест "ABC" "DEF"

Вывод:

$ значение var1: ABC $ значение var2: DEF

0 голосов
/ 07 июня 2019

Я не вижу здесь упомянутого, но splatting ваши аргументы - полезная альтернатива, и она становится особенно полезной, если вы строите аргументы для команды динамически (в отличие от использования Invoke-Expression).Вы можете использовать массивы для позиционных аргументов и хеш-таблицы для именованных аргументов.Вот несколько примеров:

Splat с массивами (позиционные аргументы)

Тестовое соединение с позиционными аргументами

Test-Connection www.google.com localhost

с разбросом массива

$argumentArray = 'www.google.com', 'localhost'
Test-Connection @argumentArray

Обратите внимание, что при разбивке мы ссылаемся на переменную со знаком @ вместо $.То же самое при использовании Hashtable для сплаттинга.

Splat With Hashtable (Именованные аргументы)

Тест-соединение с Именованными аргументами

Test-Connection -ComputerName www.google.com -Source localhost

С разбивкой по Hashtable

$argumentHash = @{
  ComputerName = 'www.google.com'
  Source = 'localhost'
}
Test-Connection @argumentHash

Одновременное позиционирование и именованные аргументы Splat

Тестовое соединение с позиционными и именованными аргументами

Test-Connection www.google.com localhost -Count 1

Объединение массивов и хеш-таблиц вместе

$argumentHash = @{
  Count = 1
}
$argumentArray = 'www.google.com', 'localhost'
Test-Connection @argumentHash @argumentArray
0 голосов
/ 14 мая 2016

Вы можете передать параметры в функцию , как это также.

function FunctionName()
{
    Param ([string]$ParamName);
    #Operations
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...