
Предположим, у меня есть простое test.ps1
:
Write-Host "access input for the 1st time: $input"
Write-Host "access input for the 2nd time: $input"
Тогда я делаю'foo' | .\test.ps1
Выведет:
доступ к вводу в первый раз: foo
доступ к вводу во второй раз:
После $input
одного обращения значение исчезает. Почему?
Докговорит, что это потому, что $input — это перечислитель:
Поскольку $input является перечислителем, доступ к любому из его свойств делает $input недоступным. Вы можете сохранить $input в другой переменной, чтобы повторно использовать свойства $input.
Но я не понимаю, что значит быть переписчиком.
Насколько я знаю, если я передам список вещей, список не будет перечислен, потому что у меня нет блока process{}
. Например, если я это сделаю @(1,2,3) | .\test.ps1
, мой код будет запущен только один раз, а массив будет рассматриваться как один объект.
вход доступа в первый раз: 1 2 3
вход доступа во второй раз:
Поэтому я не понимаю, что именно перечисляется и почему $input является перечислителем.
решение1
Вам нужно рассмотреть остальное, что есть в этом описании, и, возможно, проверитьabout_Functions_Advancedиabout_Functions_Advanced_Methods.
Ваш пример просто не имеет большого смысла. Вызов скрипта работает как анонимная функция. Поскольку вы позволяете ему использовать только $input
первый случай, вот что происходит:
В функции без блока begin, process или end переменная $input перечисляет совокупность всех входных данных функции.
Write-Host
принимает перечисление и итерирует его. Таким образом, вы, по-видимому, получаете только одно значение. По сути, он вызывает ".toString()" для него.
Используя цикл, вы обнаружите, что получаете отдельные значения.
$counter = 0;
$input | ForEach-Object {
Write-Host "access input for the $counter time: $_"
$counter = $counter + 1
}
Если вам действительно нужна эта функциональность, то, вероятно, лучше использовать блок процесса. Проверьте расширенную справку по функциям для получения дополнительной информации о том, что это значит.
begin {
$counter = 0
}
process {
Write-Host "access input for the $counter time: $_"
$counter = $counter + 1
}
Имейте в виду, что в этом случае принцип $input
работы немного изменится.
В соответствии синформация о переписчикахНаличие обычных параметров функции с подходящим определением обычно предпочтительнее, чем прямая работа с $input
.
решение2
Итерация по «списку вещей» путем передачи по конвейерусписоккforeach-object
цикл с вызовом скрипта/функции внутри его scriptblock
.
Внутри этого scriptblock
передайте итерируемое значение в вызов функции каквходдля получения ожидаемого значения для возвращаемого выходного значения за вызов.
Это решение PowerShell содержит логику скрипта, заключенную впростая функцияблок операторов, и вам не придется повторять Write-Output
код более одного раза — стандартный, простой и базовый.
Поэтому нет необходимости особенно беспокоиться по поводу блока process{}
.
PowerShell Test.ps1
-скрипт
Function Test {
Write-Output "Access to your mom's: $input"
};
PowerShellисточник точкисценарий и назовите его
. "$Env:USERPROFILE\Desktop\test.ps1"
@("car","house","bank account") | % { $_ | test }
Выход
Access to your mom's: car
Access to your mom's: house
Access to your mom's: bank account
Логический сбой
Но я не понимаю, что значит быть переписчиком.
Кроме того, согласно$input
заявлениессылается и цитирует ниже, это означает, что это будет плейсхолдер для входного значения, переданного как вход, поэтому он перечисляет это переданное значение. Вы используете $input
в скрипте, и он содержит значение, полученное им как вход. Проблема, с которой вы столкнулись, заключается в том, что все значения были переданы как одна длинная конкатенированная строка для этих методов.
-
Содержит перечислитель, который перечисляет все входные данные, переданные функции. Переменная
$input
доступна только функциям и блокам скриптов (которые являются неименованными функциями).
Также, то другое утверждение, которое вы не поняли, просто говоритон [ $input
] сохраняет это значение только в том случае, когда он вызван. Вы не можете использовать его $input
для получения какого-либо значения до или после вызова, он только устанавливается в качестве входного значения при вызове.
Наконец, вы можете установить переменную при вызове функции.чтобы дать вам вывод, который $input
"перечислен" при вызове (т.е. $var = "jewelry box" | test
). Это означает, что переменная доступна вне вызова впоследствии со значением, $input
которое было при ее выполнении.
Другие потенциальные бонусные решения
## Input piped to script function call
@("car","house","bank account").ForEach( {$_ | test} );
## Uses "$_" as the placeholder to contain the value iterated right to the command no script or function needed
@("car","house","bank account").ForEach( { Write-Output "Access to your mom's: $_" } );
Поддерживающий ресурс
.
(источник или оператор точки)- ForEach-Объект
СтандартПсевдонимыдля Foreach-Object:
%
символ ' ', ForEach - Метод ForEach