CMD как-то пишет китайский текст в качестве вывода

У меня какие-то проблемы с cmd.exe, я иногда использую его для создания файлов и записи туда выходных данных. Но если я попробую это:

wmic logicaldisk get name, freespace >> output.txt
echo %date% >> output.txt

И я запускаю его 2-3 раза, я получаю output.txt, как:

FreeSpace    Name  
17990881280  C:    
             D:    
㠱〮⸴〲㈱ഠ䘊爀攀攀匀瀀愀挀攀    一愀洀攀  ഀ਀㄀㜀㤀㤀 㠀㠀㄀㈀㠀   䌀㨀    ഀ਀             䐀㨀    ഀ਀㄀⸸㐰㈮㄰′਍

Ну, этот китайский текст там выглядит забавно, но я бы хотел увидеть дату. Я думаю, что как-то кодировка меняется с датой. Потому что, если я делаю эхо%date% >> output.txt, все в порядке, я получаю дату. Что мне делать, я хотел бы получить вывод wmic и дату. Есть идеи? Спасибо

3 ответа

Решение

У WMIC есть какой-то странный вывод. Я видел дискуссию, где говорилось, что WMIC использует Unicode, но я думаю, что ситуация сложнее, чем это. Если я записываю вывод WMIC в файл и использую шестнадцатеричный редактор, я вижу дополнительный возврат каретки в конце каждой строки. Я полностью в растерянности относительно того, как содержимое даты преобразуется в тарабарщину при вводе output.txt. (проблема с кодовой страницей? но как?) На моей машине я получаю знаки вопроса, где должна быть дата.

Я смог решить проблему с помощью

wmic logicaldisk get name, freespace | more >>output.txt
echo %date%>>output.txt 

Причина в том, что WMIC выводит данные в UNICODE. В то время как пакетные команды выводятся в ANSI по умолчанию. Поскольку кодовая страница ANSI меньше UNICODE и отображается по-разному, преобразование между ними становится проблемой. Есть несколько способов решить эту проблему.

A. Запустите командную оболочку с ключом /U или, если она уже есть в командной строке, просто введите cmd /U.

Справка из команды "Help cmd": /U Вызывает вывод внутренних команд в канал или файл в формате Unicode.

Таким образом, вы получите текстовый файл UNICODE, и ваш исходный код не нуждается в модификации. Однако вам нужно помнить, чтобы всегда использовать ключ /U. Также правильный способ сделать это:

    wmic /OUTPUT:output.txt logicaldisk get name, freespace
    echo %date% >> output.txt

B. Преобразовать вывод WMIC в ANSI (рекомендуется. Однако зависит от того, что вам нужно. Просто облегчает жизнь, когда вы решите добавить в текстовый файл. Однако вам придется использовать 2 выходных файла.).

   wmic /OUTPUT:output.tmp logicaldisk get name, freespace
   TYPE output.tmp > output.txt
   echo %date% >> output.txt

Надеюсь, это кому-нибудь поможет.

Я обнаружил, что пакетный скрипт, используемый для создания выходного txt-файла с использованием stdout ">>" для создания txt-файла, совместим с выходным форматом powershell ascii, utf8 и utf7, все остальные выходные форматы приводят к появлению в файле дополнительных пробелов.

Если выходной файл создается с помощью stheout powershells ">>", то любые добавления stdout в файл из пакетного сценария будут отображаться в виде китайских символов.

Обходной путь в моем случае состоял в том, чтобы воссоздать выходной файл с помощью пакетного сценария, и он будет в правильном формате, и последующие добавления PowerShell должны использовать "| out-file -encoding ascii/utf8/utf7"

Другие вопросы по тегам