在cygwin

时间:2015-06-10 09:07:06

标签: python linux windows cygwin

上下文:我想安装" .msi"远程Windows机器上的文件通过python脚本。

我在远程Windows机器上安装了cygwin,ssh服务正在运行。我使用python脚本从Linux主机远程Windows机器上通过ssh执行命令。对于安装msi文件,我使用了以下命令:

msiexec / package" msi文件名" / quiet / norestart / log"日志文件名(比如instlog.log)"

现在,为了验证安装是否成功,我列出了日志文件(instlog.log)的内容并检查字符串"安装成功或错误状态:0"。

问题:

"类型"命令在cygwin中不起作用。所以我试过" cd {0};猫{1} | tail -5" .format(FileLocation,FileName)列出文件内容,但我得到不同格式的输出,python脚本无法匹配输出中的上述字符串。这是希望我想在控制台上显示:

MSI(s)(64:74)[18:03:51:360]:Windows Installer安装了该产品。产品名称:pkg-name。产品版本:0.2.24-10891。产品语言:1033。制造商:XYZ Company。安装成功或错误状态:0。

我实际得到的是:

M S I(s)(6 4:7 4)[1 8:0 3:5 1:3 6 0]:我不知道我是不是想要一个人。 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。打印机:1 0 3 3。 M a n u f a r t r r:X Y Z C o m p a n y。我不知道如何处理:0。

所以不知何故在输出中的每个字符之后引入了额外的空格。我想知道如何以正常方式而不是空格分隔格式获得输出。谢谢。

2 个答案:

答案 0 :(得分:1)

问题是msiexec以Unicode格式保存了其日志文件。在Windows中,Unicode由2个字符组成(意味着您看到的每个字符都以2个字节或字符形式存储在内存中):第一个是代码页编号,第二个是该代码页中字符的条目(即字符本身) )。由于您使用的是英文版,因此代码页编号为0(或\0\x00NULL)。一些流行的编辑器足够聪明,可以计算出编码,只显示字符(将交错的NULL字符放在一边)。现在有一些方法可以解决这个问题。

  • 升级cygwin。在我的电脑上(我也安装了Cygwin)我没有遇到这个问题(我的Cygwin正在使用:GNU coreutils 8.15 - 例如可以通过输入tail --version来看到)。以下是一些输出(我在末尾包含hexdump以显示文件是unicode格式):

    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格式。我不知道有任何原生工具可以做到这一点,但你可以谷歌搜索 unicode到ascii转换器并下载这样的工具;或者正如我之前提到的,有些编辑理解unicode,我已经尝试过并且能够将文件从unicode转换为ascii Textpad;或者你可以自己编写工具。

  • 如果您正在从python中读取msi日志文件,则可以从脚本中处理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(并且还可以使用常规ASCII文件)。

答案 1 :(得分:1)

日志文件应转换为8位宽格式,如UTF8。这可以使用iconv命令来实现。您应该使用cygwin安装程序安装它,然后使用以下命令:

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