Запретить завершение новой строки в команде Out-File PowerShell

Как я могу предотвратить команду PowerShell Out-File при добавлении новой строки после выводимого текста?

Например, запуск следующей команды создает файл с содержимым "TestTest\r\n", а не только "TestTest".

"TestTest" | Out-File -encoding ascii test.txt

Ответы

Ответ 1

В PowerShell 5.0+ вы должны использовать:

"TestTest" | Out-File -encoding ascii test.txt -NoNewline

Но в более ранних версиях вы просто не можете с помощью этого командлета.

Попробуйте следующее:

[System.IO.File]::WriteAllText($FilePath,"TestTest",[System.Text.Encoding]::ASCII)

Ответ 2

Чтобы дополнить бриантистский полезный ответ re -NoNewline:

Следующее относится не только к Out-File, но также аналогично Set-Content/Add-Content; как указано, -NoNewline требует PSv5 +.

Обратите внимание, что -NoNewline означает, что с несколькими объектами для вывода это не только завершающая новая строка (прерывание строки), но и любые новые строки.

Иными словами: строковые представления входных объектов непосредственно связаны друг с другом без разделителя (терминатора).

Следовательно, следующие команды приводят к тому же содержимому файла (TestTest без конечной новой строки):

# Single input string
"TestTest" | Out-File -encoding ascii test.txt -NoNewline

# Equivalent command: 2-element array of strings that are directly concatenated.
"Test", "Test" | Out-File -encoding ascii test.txt -NoNewline

Чтобы разместить новые строки только между, но не после выходных объектов, вы должны присоединиться к объектам с символами новой строки явно:

"Test", "Test" -join "`r`n" | Out-File -encoding ascii test.txt -NoNewline

Чтобы создать только строки новой строки в стиле Unix, используйте "`n" вместо "`r`n".

Caveat

Вышеупомянутое решение -join неявно преобразует входные объекты в строки, если они еще не созданы, и делает это, вызывая метод .NET .ToString() для каждого объекта, что часто дает другое представление, отличное от того, которое Out-File будет непосредственно создавать, потому что Out-File использует форматирование вывода PowerShell по умолчанию; например, сравнить выходы (Get-Date).ToString() и просто Get-Date.

Если ваш ввод содержит только строки и/или не строки, представление .ToString() удовлетворительное, это решение работает, но обратите внимание, что тогда обычно предпочтительнее использовать Set-Content cmdlet, который неявно применяет ту же строфайку.
Для полного обсуждения различий между Out-File и Set-Content см. этот ответ.

Если на вашем входе нет строк, которые вы хотите отформатировать, так как они будут печатать на консоли, на самом деле нет простого решения: в то время как вы можете использовать Out-String для создания представлений строк для каждого объекта с форматом форматирования по умолчанию, Out-String отсутствие -NoNewline (начиная с версии 5.1, эта проблема GitHub предполагает ее введение) будет неизменно возвращать завершающие символы новой строки.