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