Я пытаюсь передать строку в программу STDIN без каких-либо трейлинг-строк (если сама строка не заканчивается в строке). Я пробовал искать походы, но я только нашел людей, пытающихся распечатать на консоль без трейлинг-линии, и в этом случае Write-Host
принимает параметр -NoNewLine
. Однако, чтобы подключить его к другой программе, мне нужно Write-Output
или подобное, которое не имеет такого параметра. Теперь кажется, что Write-Output
не проблема:
Z:\> (Write-Output "abc").Length
3
Но как только я подключу его к другой программе и прочитаю там строку, я получаю дополнительный перевод строки. Например, я попробовал этот фрагмент Ruby:
Z:\> Write-Output "abc" | ruby -e "p ARGF.read"
"abc\n"
Я проверил, что фактическая полученная строка abc\n
. То же самое происходит и на нескольких других языках (по крайней мере, на С#, Java и Python), поэтому я считаю, что это проблема с PowerShell, а не с языком, выполняющим чтение.
В качестве дополнительного теста я заменил Write-Output
на другой Ruby script:
Z:\> ruby -e "$> << 'abc'"
abcZ:\>
(То есть в script STDOUT не существует \n
)
Но опять же, когда я подключаю его к другому script:
Z:\> ruby -e "$> << 'abc'" | ruby -e "p ARGF.read"
"abc\n"
Я уверен, что это труба, которая добавляет строку. Как этого избежать? Я действительно хочу иметь возможность контролировать, заканчивается ли вход в строке или нет (путем включения его во вход или опускания).
(Для справки, я также тестировал строки, которые уже содержат трейлинг-строку, и в этом случае труба не добавляет другой, поэтому я предполагаю, что это просто обеспечивает верный перевод строки.)
Я впервые столкнулся с этим в PowerShell v3, но теперь я использую v5 и все еще имею ту же проблему.