Назад | Перейти на главную страницу

Сценарии оболочки и типы вывода текстовых файлов RE: msinfo32

Я запустил следующий сценарий в командной строке Windows 10 msinfo32 /report mysystem.txt, который сохраняет все системные данные машины в одном текстовом файле.

Однако, когда я запускал строки в выходном текстовом файле, я не получал никаких результатов. findstr /c:"System Name" mysystem.txt должен отображать имя системы, но ничего не вернул. Я открыл файл, и весь текст был там, но findstr не распознал его.

В конце концов, я изменил расширение файла на .csv, открыл его в Excel и сохранил как текстовый (MS-DOS) .txt файл. Не спрашивайте, почему я подумал об этом, я просто цеплялся за соломинку. Затем я смог успешно запустить строки в файле, сохраненном как текстовый (MS-DOS) .txt файл.

Кто-нибудь может объяснить такое поведение? Я думал, что текстовый файл - это текстовый файл, если это простой текст. Как заставить командную строку выводить прямой вывод в формате Text (MS-DOS) .txt. Я не мог найти варианты для этого в findstr, и поиск в Google ничего не дал.

Спасибо заранее за любую помощь.

Причина, по которой вы столкнулись с этой проблемой, заключается в том, что msinfo32 кодирует текстовый файл в формате UCS-2 Little Endian, а findstr не поддерживает кодировку UCS-2. Когда вы открываете текстовый файл в Excel и повторно сохраняете документ, он кодирует файл в UTF-8, который поддерживается findstr. Обходной путь к этой проблеме заключается в следующем:

msinfo32 /report mysystem.txt
type mysystem.txt > utf8.txt
findstr /c:"System Name" utf8.txt

Команда type отобразит текстовый файл на экране, но при использовании символа> он перенаправит этот вывод в текстовый файл, который будет закодирован в UTF-8.

Если вы просто пытаетесь получить имя машины, вы можете выполнить следующую команду:

hostname

Более элегантный способ получения системной информации - через PowerShell, который позволит вам получить все, что вы можете, с помощью msinfo32, а также многое, многое другое. Просто выполните поиск в Google предмета инвентаря, который вы ищете, и PowerShell. Например, выполните поиск по запросу PowerShell получить имя хоста.

Это может быть потому, что в результате mysystem.txt закодирован в UTF-16. В системе Unix файл утилиту можно использовать, чтобы показать, что:

$ file mysystem.txt 
mysystem.txt: Little-endian UTF-16 Unicode text, with very long lines, with CRLF, CR line terminators

Итак, для утилиты с открытым текстом, например findstr файл mysystem.txt действительно выглядит примерно так:

$ cat -v mysystem.txt | head -1 | cut -c-80
M-^?M-~S^@y^@s^@t^@e^@m^@ ^@I^@n^@f^@o^@r^@m^@a^@t^@i^@o^@n^@ ^@r^@e^@p^@o^@r^@t

Другие инструменты могут понимать UTF-16:

$ head -1 mysystem.txt | cut -c-80
��System Information report written at: 0

Я не знаю почему msinfo32 решает записать файлы UTF-16, возможно, он хочет убедиться, что действительно вся (системная) информация фиксируется для всех установок Windows в различных частях мира (где UTF-8 недостаточно), и я не нашел переключателя заставить msinfo32 использовать другой набор символов.

Может быть инструмент командной строки Windows для преобразования файлов в разные наборы символов, но я не знаю ни одного. Итак, вот фрагмент Linux, чтобы сделать это:

$ iconv -f UTF16LE -t UTF8 mysystem.txt -o mysystem_8.txt

И в результате mysystem_8.txt файл теперь может быть загружен в findstr:

$ findstr /c:"System Name" mysystem_8.txt
System Name: WIN11
System Name     WIN11

В Windows файл можно было открыть с помощью notepad.exe, сохраните файл еще раз («Сохранить как») и в Save file диалоговое окно выберите другую кодировку (UTF-8 или ANSI). Но я не знаю инструмента командной строки Windows, который делал бы то же самое. GnuWin32 делает свое дело, но сначала нужно установить его.