Почему переменные не видны в последующих скриптовых блоках? - PullRequest
3 голосов
/ 26 февраля 2010

Кто-то знает, по какой странной причине Powershell не показывает переменную de 'tee'd' в следующем фрагменте?

# a.txt contains any text 
cat a.txt | tee -variable foovar | % { 'value of foovar: ' + $foovar } 

На практике я хотел бы выполнить только одну строку для поиска некоторого текста, а затем, основываясь на результатах, обработать текст, например отправить письмо с ним:

get-content [somefile] | select-string [somePattern] | tee [var] | ..[more processing] | .\sendmail.ps1 [var] 

Ответы [ 3 ]

2 голосов
/ 26 февраля 2010

Поскольку все выходные данные, переданные в Tee-Object, должны быть доступны в переменной, командлет кэширует свои входные данные и записывает их в переменную в конце.

Но вы также можете сделать следующее:

$var = gc a.txt
$var | your_processing_stuff
1 голос
/ 26 февраля 2010

Вы также можете использовать -OutVariable

cat c:\dev\NamingConventions.txt -OutVariable test1 | % { write-host 'value: ' $_ }
$test1
cat c:\dev\NamingConventions.txt | select-string -patt panel -OutVariable test2
$test2
0 голосов
/ 26 февраля 2010

Похоже, что в вашем скрипте все работает, но не так, как вы ожидаете. Он действительно отправляет весь массив в $ foovar, но вы не можете использовать его до следующей строки. Похоже, что это природа тройника. Вы можете увидеть, что это работает таким образом, запустив ваш скрипт два раза подряд. При втором запуске $ foovar содержит все содержимое a.txt.

Похоже, вы хотите, чтобы каждая строка файла была установлена ​​в foovar, а не весь массив (если я не ошибаюсь). Если это тот случай, когда вы отправляете все в цикл foreach, вы все равно устанавливаете его на специальный $ _ var ... т.е.

cat a.txt |%{'value of line: ' $_}

Выше также будет работать со строкой выбора.

...