首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在cygwin中列出文件内容时遇到的问题

在cygwin中列出文件内容时遇到的问题
EN

Stack Overflow用户
提问于 2015-06-10 17:07:06
回答 2查看 155关注 0票数 0

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

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

msiexec /package "msi文件名“/quiet /norestart /log”日志文件名(假设为instlog.log)“

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

问题:

"type“命令在cygwin中不起作用。所以我试着用"cd {0};cat {1} |.format-5“尾巴(FileLocation,FileName)来列出文件内容,但是我得到了不同格式的输出,python脚本无法在输出中匹配上面提到的字符串。这是我想要在控制台上显示的内容:

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

我实际得到的是:

M S I(S)(6 4:74)1 8:0 3:5 1:3 6 0:w i d o w s i n s t a l l e r i n s t a l l e d t h e p r o d u c t.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 33.M a n u f a c t u r r:x y Z C o m p a n y.I s t a l l a t i o n s u c e s s o r e r r o r s t a t u s:0。

因此,在输出中的每个字符后面都引入了额外的空格。我想知道如何才能以正常的方式而不是空格分隔的格式获得输出。谢谢。

EN

回答 2

Stack Overflow用户

发布于 2015-06-10 18:08:31

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

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

cat unicode.txt

收益率:unicode chars

尾部unicode.txt

收益率:unicode chars

十六进制转储unicode.txt

收益率:

0000000 0075 006e 0069 0063 006f 0064 0065 0020 0000010 0063 0068 0061 0072 0073 000d 000a 000001e

  • Convert msiexec日志为ASCII格式。我不知道有什么本地工具可以做到这一点,但是你可以在谷歌上搜索unicode到ascii的转换器并下载这样的工具;或者正如我前面提到的,有一些能够理解unicode的编辑器是Textpad,我已经尝试过了,它能够将文件从unicode转换成ascii;或者你可以自己编写这个工具。

  • 如果你正在从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(如果字符!=‘\x00’,unicode_text中字符的字符)

text将不再包含ASCII (并且还可以处理常规的\x00文件)。

票数 1
EN

Stack Overflow用户

发布于 2015-06-10 19:00:37

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

代码语言:javascript
复制
iconv -f ucs2 -t utf8 instlog.log > instlog2.log
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/30751882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档