Powershell: использование перенаправления в script приводит к выходу Unicode. Как испускать однобайтовый текст ASCII?

Я использую Sandcaple Helpfile Builder для создания файла справки (.chm). Проект представляет собой файл .shfbproj, который представляет собой формат XML, работает с msbuild.

Я хочу автоматически обновлять текст нижнего колонтитула, который появляется в сгенерированном файле .chm. Я использую этот фрагмент:

$newFooter = "<FooterText>MyProduct v1.2.3.4</FooterText>";

get-content  -Encoding ASCII $projFile.FullName | 
    %{$_ -replace '<FooterText>(.+)</FooterText>', $newFooter } > $TmpFile

move-item $TmpFile $projFile.FullName -force

Вывод, направляемый в $TmpFile, всегда является многобайтовой строкой. Но я не хочу этого. Как установить кодировку вывода в ASCII?

Кто-нибудь? Bueller? Кто-нибудь?

Ответ 1

Вы можете изменить переменную $OutputEncoding перед записью в файл. Другой вариант - не использовать > оператора, но вместо этого напрямую подключайтесь к Out-File и используйте параметр -Encoding.

Ответ 2

Оператор перенаправления > - это "ярлык" на Out-File. Out-File кодировка по умолчанию - это Юникод, но вы можете передать ее в ASCII, поэтому вместо pipe Out-File:

Get-Content -Encoding ASCII $projFile.FullName |
    % { $_ -replace '<FooterText>(.+)</FooterText>', $newFooter } |
    Out-File $tmpfile -Encoding ASCII

Ответ 3

| sc filename делает трюк (sc является псевдонимом для Set-Content)

для >> filename использовать | ac filename делает трюк (ac является псевдонимом для Add-Content)

Ответ 4

Я обнаружил, что должен был использовать следующее:

write-output "First line" | out-file -encoding ascii OutputFileName
write-output "Next line" | out-file -encoding ascii -append OutputFileName
....

Изменение выходной кодировки с использованием:

$OutputEncoding = New-Object -typename System.Text.ASCIIEncoding

не работает

Ответ 5

Просто небольшой пример использования потоков, хотя я понимаю, что это был не оригинальный вопрос.

C:\temp\ConfirmWrapper.ps1 -Force -Verbose 4>&1 6>&1 | Out-File -Encoding default -FilePath C:\temp\confirmLog.txt -Append

Выведет информацию (6) и подробные (4) потоки в поток вывода (1) и перенаправит все это в файл с кодировкой ANSI (по умолчанию).