2010-02-25 14 views
3

Quelqu'un sait pour quelle raison étrange Powershell n'affiche pas la variable de 'tee'd' dans l'extrait suivant?Pourquoi les variables tee'd ne sont pas visibles dans les scripblocks plus récents?

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

Dans la pratique, je voudrais faire, en une seule ligne, la recherche d'un texte, puis, en fonction des résultats, le processus texte, par exemple envoyer un mail avec elle:

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

dupliquer http://stackoverflow.com/questions/2338177/why-teed-variables-arent-visible-in-later-scripblocks –

+0

Voulez-vous supprimer cette question? – stej

Répondre

2

Étant donné que toutes les sorties passées dans Tee-Object doivent être disponibles dans la variable, l'applet de commande met en cache son entrée et l'écrit dans la variable à la fin.

Mais vous pouvez tout aussi bien faire ce qui suit:

$var = gc a.txt 
$var | your_processing_stuff 
1

Vous pouvez utiliser -OutVariable ainsi

cat c:\dev\NamingConventions.txt -OutVariable test1 | % { write-host 'value: ' $_ } 
$test1 
cat c:\dev\NamingConventions.txt | select-string -patt panel -OutVariable test2 
$test2 
0

Il ressemble fonctionne tee dans votre script, mais pas la façon dont vous attendez . Il envoie en effet le tableau entier à $ foovar, mais vous ne pouvez pas l'utiliser jusqu'à la ligne suivante. On dirait que c'est la nature du tee. Vous pouvez voir que cela fonctionne de cette façon en exécutant votre script deux fois de suite. Au second tour, $ foovar a tout le contenu de a.txt.

Il semblerait que vous vouliez que chaque ligne du fichier soit foovar, pas tout le tableau (à moins que je ne me trompe). Si tel est le cas lorsque vous envoyez tout à une boucle foreach vous définissez au $ _ var de toute façon spéciale ... à savoir

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

ci-dessus travaillera avec select-string aussi.