2015-06-10 2 views
0

Контекст: Я хочу установить файл «.msi» на удаленном компьютере Windows с помощью скрипта python.Облицовочная проблема при отображении содержимого файла в cygwin

Я установил cygwin на удаленном компьютере Windows и работает служба ssh. Я выполняю команду через ssh на удаленном компьютере Windows с хоста Linux, используя скрипт python. Для установки MSI-файла я использовал следующую команду:

Msiexec/пакет «имя файла МСИ»/тихий/Norestart/Журнал «имя файла журнала (например instlog.log)»

Теперь, чтобы проверить, что установка Успешно я перечисляю содержимое файла журнала (instlog.log) и проверяет строку «Успех установки или состояние ошибки: 0».

Проблема:

команда

"типа" не работает в Cygwin. Поэтому я попробовал «cd {0}; cat {1} | tail -5" .format (FileLocation, FileName), чтобы отобразить содержимое файла, но я получаю вывод в другом формате, и скрипт python не может сопоставить вышеупомянутую строку с выходом. Это хочу, чтобы я отобразил на консоли:

MSI (s) (64:74) [18: 03: 51: 360]: установщик Windows установил продукт. Наименование продукта: pkg-name. Версия продукта: 0.2.24-10891. Язык продукта: 1033. Производитель: компания XYZ. Успех Установка или состояние ошибки: 0.

И то, что я на самом деле получаю:

MSI (s) (6 4: 7 4) [1 8: 0 3: 5 1: 3 6 0]: W indows I nstallerinstalledthep roduct. P r o d u c t N a m e: p k g - n a m e. P r o d u c t V e r s i o n: 0. 2. 2 4 - 1 0 8 9 1. P r o d u c t L a n g u a g e: 1 0 3 3. M a n u f a c t u r e r: X Y Z C o m p a n y. I n s t a l l a t i o n s u c c s s o r e r r o r s t a t u s: 0.

Так как-то дополнительное пространство вводится после каждого символа на выходе. Я хочу знать, как я могу получить вывод в обычном виде, а не в формате, разделяемом пространством. Спасибо.

+0

можете ли вы рассказать нам, что является результатом работы - 'cd {0}; cat {1} ' –

+0

Вывод команды: MSI (ы) (64:74) [18: 03: 51: 360]: установщик Windows установил продукт. Наименование продукта: pkg-name. Версия продукта: 0.2.24-10891. Язык продукта: 1033. Производитель: компания XYZ. Успех установки или состояние ошибки: 0. === Регистрация остановлена: 6/9/2015 18:03:51 === – Luminos

+0

Вы хотите избежать окончательного '=== Регистрация остановлена: 6/9/2015 18 : 03: 51 === - '? Если да, то это в новой строке? или той же линии? –

ответ

1

Проблема в том, что msiexec сохранил свой файл журнала в формате Unicode. В Windows Unicode состоит из 2 символов (это означает, что каждый символ, который вы видите, хранится в памяти как 2 байта или символа): первый - это номер кодовой страницы, а второй - это символ символа в этой кодовой странице (то есть сам символ). Поскольку вы работаете на английской версии, номер кодовой страницы равен 0 (или \0 или \x00 или NULL). Некоторые популярные редакторы достаточно умны, чтобы отобразить кодировку и отображать только символы (оставляя чередующиеся символы NULL в стороне). Теперь есть некоторые способы преодолеть это.

  • Обновление cygwin. На моем компьютере (у меня также установлен Cygwin) я не испытываю этой проблемы (мой Cygwin использует: GNU coreutils 8.15 - это можно увидеть, например, набрав tail --version).Вот некоторые результаты (я включил hexdump в конце, чтобы показать вам, что файл в формате Юникод):

    cat unicode.txt 
    

    Урожайность: unicode chars

    tail unicode.txt 
    

    Урожайность: unicode chars

    hexdump unicode.txt 
    

    выдает:

    0000000 0075 006e 0069 0063 006f 0064 0065 0020 
    0000010 0063 0068 0061 0072 0073 000d 000a 
    000001e 
    
  • Преобразование журналов msiexec в формат ASCII. Я не знаю какого-либо собственного инструмента, который это делает, но вы можете искать Google для unicode для конвертера ascii и загрузить такой инструмент; или, как я уже упоминал ранее, есть редакторы, которые понимают unicode, тот, который я уже пробовал и могу конвертировать файлы из unicode в ascii, - Textpad; или вы можете написать инструмент самостоятельно.

  • Если вы читаете файл журнала msi из python, вы можете обрабатывать файлы Unicode из сценария. Я предполагаю, что у вас есть код, который считывает содержимое файла, как (!!! Я не включал обработку исключений !!!):

    f = open("some_msi_log_file.log", "rb") 
    text = f.read() 
    f.close() 
    

    и вы делаете обработку на text. Если изменить код выше:

    f = open("some_msi_log_file.log", "rb") 
    unicode_text = f.read() 
    f.close() 
    text = "".join([char for char in unicode_text if char != '\x00']) 
    

text не будет содержать \x00 S больше (и также будет работать с обычными файлами ASCII).

+0

Хорошее объяснение CristiFati ... Спасибо. Я заметил, что когда я запускаю «cat instlog.log> file.log» ..... я отлично работаю. Труба после «кошки» вызывает эту проблему. Поэтому, когда я выполняю «cat instlog.log | tail -5> file.log» ... file.log содержит дополнительные нулевые символы. – Luminos

1

Файл журнала должен быть преобразован в формат 8 бит в ширину, такой как UTF8. Этого можно достичь с помощью команды iconv. Вы должны установить его с помощью установщика cygwin, после чего используйте следующую команду:

iconv -f ucs2 -t utf8 instlog.log > instlog2.log 
+0

Спасибо szkj. Это сработало. Я выполнил команду «iconv -f ucs-2 -t utf-8 instlog.log> instlog2.log». – Luminos

Смежные вопросы