Поддерживающий ресурс

Поддерживающий ресурс

Предположим, у меня есть простое 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

Логический сбой

enter image description here

Но я не понимаю, что значит быть переписчиком.

Кроме того, согласно$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: $_" } );

Поддерживающий ресурс

Связанный контент