В моем пакетном файле я вызываю EXE и хочу, чтобы вывод был перенаправлен в файл. В командной строке PowerShell это будет выглядеть примерно так:
prog.exe file.txt | Out-File results\results.txt -Encoding ascii
Вышеупомянутое работает в командной строке. В моем пакетном файле я написал это так:
prog.exe file.txt | powershell -Command "Out-File results\file.txt -Encoding ascii"
Когда я запускаю пакетный файл, файл результатов создается, но содержит нулевое содержимое. Как написать это, чтобы вести себя так, как будто мне это тоже нужно?
В пакетном файле должно работать следующее:
prog.exe file.txt > results\results.txt
Если вы хотите перенаправить как stdout
, так и stderr
, используйте:
prog.exe file.txt > results\results.txt 2>&1
Что с кодировкой?
Проверьте chcp
и/или cmd /u
и cmd /a
.
ASCII используется по умолчанию для cmd.exe. Вы можете использовать /A для ASCII и /U для Unicode при вызове cmd.exe или использовать chcp 65001
, чтобы установить его в Unicode в верхней части пакетного файла.
@StephenP: кодовая страница cmd.exe по умолчанию — это активная кодовая страница OEM, которая в случае однобайтовых кодовых страниц представляет собой суперсет ASCII. /A
выбирает кодовую страницу ANSI, а не ASCII, и только для внутренние команды cmd.exe; аналогично, /U
для «Unicode» (читай: UTF-16LE) также применяется только к внутренним командам. chcp 65001
выбирает кодовую страницу UTF-8; UTF-8 — это кодировка Unicode с переменной шириной, которая является надмножеством ASCII.
полезный ответ кичика показывает вам эффективное решение, использующее только функции пакетного файла.
Если вам не нужно создавать файлы с кодировкой Кроме как ASCII или активной кодовой страницей OEM, нет необходимости использовать PowerShell — это только замедлит работу.
Тем не менее, вы можете выбрать другую кодовую страницу через chcp
в cmd.exe
, но для вывода в файл только 65001
для UTF-8 действительно имеет смысл, но обратите внимание, что результирующий файл будет иметь спецификацию нет - в отличие от того, когда вы используете Out-File -Encoding utf8
в Windows PowerShell. .
Если вам нужно использовать PowerShell, например, для создания файлов UTF-16LE («Unicode») или файлов UTF-8 со спецификацией, вам придется использовать $Input
с внутренним каналом PowerShell в вашей команде PowerShell, чтобы получить доступ к поток stdin (т. е. то, что было передано):
prog.exe file.txt | powershell -c "$Input | Out-File results\file.txt -Encoding ascii"
Обратите внимание, что только символы, представленные в активной кодовой странице (как указано в chcp
), будут распознаваться PowerShell и могут быть переведены в потенциально разные кодировки.
Выбор -Encoding ascii
фактически приведет к транслитерации символов за пределами (7-битного) диапазона ASCII в символы буквальный?
, что приведет к потеря информации.
А как насчет
PowerShell -Command "prog.exe file.txt | Out-File results\results.txt -Encoding ascii"
?