Powershell: отправить Pipe в качестве аргумента команде - PullRequest
0 голосов
/ 11 сентября 2018

Я работаю над командой, которая выглядит примерно так:

$command="Path to Command / Bat file"  
$delim = [RegEx]::Escape("|")

(Get-ChildItem -Path .\ -Force).Name | % { &"$command"
".\$_" "$delim" "..\<SomePath>\$_.html"}

Проблема, с которой я столкнулся, связана с передачей значения delim, в данном случае это Pipe. Delim - второй аргумент в моей команде.

Что происходит, так это то, что ".. \\ $ _. Html" выполняется как исполняемый файл, но его нужно передать в качестве третьего аргумента.

Ответы [ 2 ]

0 голосов
/ 11 сентября 2018

Просто кавычка символ | для передачи его во внешнюю программу. Цитирование необходимо для PowerShell , что | следует интерпретировать буквально , а не как оператор конвейера.

PS> 'a|b' | & findstr /L '|'  # findstr.exe sees a literal | char.; & is optional here
a|b  # Literal '|' was found in input string 'a|b'

Единственная необходимая дополнительная работа - это если целевая программа сама рассматривает без кавычек | [1] как имеющее особое значение, особенно при вызове cmd.exe или пакетный файл:

PS> cmd /c echo '"|"'
"|"

Обратите внимание на встроенные двойные кавычки , которые гарантируют, что cmd.exe видит "|" в качестве аргумента и, следовательно, не интерпретирует | как его оператор конвейера.
(Это странная особенность внутренней команды echo, что в этом случае двойные кавычки сохраняются .)


[1] Несмотря на то, что '|' указан в командной строке PowerShell выше, за кадром PowerShell передает его без кавычек , что он делает всякий раз, когда аргумент не имеет встроенных пробелов .

0 голосов
/ 11 сентября 2018

Получил ответ на мою проблему. Нам нужно использовать его следующим образом вместо регулярного выражения. Это связано с тем, что механизм 'c' не поддерживает разделители регулярных выражений.

$command="Path to Command / Bat file"  

(Get-ChildItem -Path .\ -Force).Name | % { &"$command"
".\$_" `"`|`" "..\<SomePath>\$_.html"}
...