Запретить завершение новой строки в команде 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 предполагает ее введение) будет неизменно возвращать завершающие символы новой строки.