Подтвердить что ты не робот

Как написать PowerShell script, который принимает вход конвейера?

Я пытаюсь написать PowerShell script, который может получить вход для конвейера (и, как ожидается, сделает это), но попробуйте что-то вроде

ForEach-Object {
   # do something
}

фактически не работает при использовании script из командной строки следующим образом:

1..20 | .\test.ps1

Есть ли способ?

Примечание. Я знаю о функциях и фильтрах. Это не то, что я ищу.

4b9b3361

Ответ 1

Это работает, и, возможно, есть другие способы сделать это:

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

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

Найдите "переменную $powershell $input variable", и вы найдете больше информации и примеров.
Пара здесь:
Функции и фильтры PowerShell PowerShell Pro!
(см. раздел "Использование специальной переменной PowerShell" $input ")

" Скрипты, функции и script блоки имеют доступ к переменной $input, которая предоставляет перечислитель по элементам входящего конвейера".
или
$input gotchas "Dmitrys PowerBlog PowerShell и за его пределами
"... в основном $input в счетчике, который предоставляет доступ к вашему конвейеру".

Для командной строки PS, а не в командной строке командной строки DOS. Командный процессор Windows.

Ответ 2

В v2 вы также можете принять ввод конвейера (по свойству propertyName или byValue), добавить псевдонимы параметров и т.д.:

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

Ответ 3

Вы можете либо написать фильтр, который является особым случаем такой функции:

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

или вы можете создать аналогичную функцию:

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
  }
}

Вышеуказанное работает как функция определения определенной функции или если в script может быть помечена на ваш глобальный сеанс (или другой script). Однако в вашем примере указано, что вам нужен script, так что он находится в script, который можно использовать напрямую (без необходимости точки):

  --- 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
  }

В PowerShell V2 это немного изменилось с помощью "расширенных функций", которые реализуют функции с теми же функциями привязки параметров, что и скомпилированные командлеты. См. Этот пост в блоге для примера различий. Также обратите внимание, что в этом случае с расширенными функциями вы не используете $_ для доступа к объекту конвейера. С помощью расширенных функций объекты конвейера привязаны к параметру так же, как и с командлетом.

Ответ 4

Ниже приведены простейшие примеры сценариев/функций, которые используют входной канал. Каждый из них ведет себя так же, как и конвейер, в командлет "эхо".

Как скрипты:

# 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
}

Как функции:

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
    }
}

например.

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