Shell Scripting и типы вывода текстовых файлов RE: msinfo32

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

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

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

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

Заранее благодарим за любую помощь.

1
задан 24 January 2019 в 05:08
2 ответа

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

$ 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 , снова сохранить файл («Сохранить как») и в Сохранить файл выберите другую кодировку (UTF-8 или ANSI). Но я не знаю инструмента командной строки Windows, который делал бы то же самое. GnuWin32 делает свое дело, но сначала нужно установить его.

0
ответ дан 4 December 2019 в 03:18

Причина, по которой вы столкнулись с этой проблемой, заключается в том, что 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 получить имя хоста.

0
ответ дан 4 December 2019 в 03:18

Теги

Похожие вопросы