Come scrivere uno script PowerShell che accetta l’input della pipeline?

Sto provando a scrivere uno script PowerShell che possa ricevere input dalla pipeline (e ci si aspetta che lo faccia), ma provare qualcosa del genere

ForEach-Object { # do something } 

in realtà non funziona quando si utilizza lo script dalla riga di comando come segue:

 1..20 | .\test.ps1 

C’è un modo?

Nota: conosco funzioni e filtri. Questo non è quello che sto cercando.

Funziona e ci sono probabilmente altri modi per farlo:

 foreach ($i in $input) { $i } 

17:12:42 PS> 1..20 | . \ Cmd-input.ps1
1
2
3
– snip –
18
19
20

Cerca “powershell $ input variable” e troverai ulteriori informazioni ed esempi.
Una coppia è qui:
Funzioni e filtri di PowerShell PowerShell Pro!
(vedere la sezione “Uso della variabile speciale di PowerShell” $ input “”)
“Script, funzioni e blocchi di script hanno tutti accesso alla variabile $ input, che fornisce un enumeratore sugli elementi nella pipeline in ingresso.”
o
$ input gotchas «Dmitry PowerBlog PowerShell e oltre
“… fondamentalmente $ input in un enumeratore che fornisce l’accesso alla pipeline che hai.”

Per la riga di comando di PS, non la riga di comando di Windows , Windows Command Processor.

In v2 puoi anche accettare l’input della pipeline (per propertyName o byValue), aggiungere alias di parametri ecc:

 function Get-File{ param( [Parameter( Position=0, Mandatory=$true, ValueFromPipeline=$true, ValueFromPipelineByPropertyName=$true) ] [Alias('FullName')] [String[]]$FilePath ) process { foreach($path in $FilePath) { Write-Host "file path is: $path" } } } # test ValueFromPipelineByPropertyName dir | Get-File # test ValueFromPipeline (byValue) "D:\scripts\s1.txt","D:\scripts\s2.txt" | Get-File - or - dir *.txt | foreach {$_.fullname} | Get-File 

Puoi scrivere un filtro che è un caso speciale di una funzione come questa:

 filter SquareIt([int]$num) { $_ * $_ } 

oppure puoi creare una funzione simile in questo modo:

 function SquareIt([int]$num) { Begin { # Executes once before first item in pipeline is processed } Process { # Executes once for each pipeline object $_ * $_ } End { # Executes once after last pipeline object is processed } } 

Quanto sopra funziona come una funzione intertriggers o se in uno script può essere puntato nella sessione globale (o in un altro script). Ad ogni modo il tuo esempio indica che vuoi uno script, quindi qui è in uno script che è direttamente utilizzabile (non è richiesta alcuna punteggiatura):

  --- Contents of test.ps1 --- param([int]$num) Begin { # Executes once before first item in pipeline is processed } Process { # Executes once for each pipeline object $_ * $_ } End { # Executes once after last pipeline object is processed } 

Con PowerShell V2, questo cambia un po ‘con le “funzioni avanzate” che incorporano le funzioni con le stesse funzionalità di collegamento ai parametri che hanno i cmdlet compilati. Vedi questo post sul blog per un esempio delle differenze. Si noti inoltre che in questo caso di funzioni avanzate non si usa $ _ per accedere all’object pipeline. Con funzioni avanzate, gli oggetti pipeline vengono associati a un parametro proprio come fanno con un cmdlet.

Di seguito sono riportati gli esempi più semplici di script / funzioni che utilizzano l’input con pipe. Ognuno si comporta come piping per il cmdlet “echo”.

Come script:

# Echo-Pipe.ps1

  Begin { # Executes once before first item in pipeline is processed } Process { # Executes once for each pipeline object echo $_ } End { # Executes once after last pipeline object is processed } 

# Echo-Pipe2.ps1

 foreach ($i in $input) { $i } 

Come funzioni:

 Function Echo-Pipe { Begin { # Executes once before first item in pipeline is processed } Process { # Executes once for each pipeline object echo $_ } End { # Executes once after last pipeline object is processed } } Function Echo-Pipe2 { foreach ($i in $input) { $i } } 

Per esempio

 PS > . theFileThatContainsTheFunctions.ps1 # This includes the functions into your session PS > echo "hello world" | Echo-Pipe hello world PS > cat aFileWithThreeTestLines.txt | Echo-Pipe2 The first test line The second test line The third test line