以前MSI每次都在创建新的日志文件,而且一切都运行顺畅。现在我们有一个要求,我们需要附加到现有文件,而不是创建新的日志文件。我们使用的命令是msiexec file.msi /l*v+ logfile.log /passive
,因为msdn建议“+”应该用于附加到现有文件。在此之后,我在日志文件中的每个字符后面看到一个额外的空格。
示例日志文件:
= = = V e r o e g o n g s t a r t d d:2/1 5/2 0 1 7 8:4 9:5 4 B u i l d t y p e:S H I P U N I C O D E 5。 0 0 9 6 0 0。 0 0 C a l l g g s s:C:\ W i n d o w s \ S y s t e m 3 2 \ m s e e c e c。 e x e = = =
* * * * * * * P r o d u c t : m y f i l e . m s i * * * * * * * A c t i o n : * * * * * * * C o m m a n d L i n e : * * * * * * * * * *
我做错了什么?
答案 0 :(得分:1)
MSI日志文件似乎将自己写为UTF-16(LE)。这些文件可以正确查看,并且可以使用更强大(免费)的文本编辑器(例如Notepad ++,Vim等)轻松地将其转换回UTF-8。
在Notepad ++中,打开文件后,文件通常会正确显示。使用该应用程序,您只需要转到“编码”菜单并将其更改为UTF-8,然后保存它,以便其他人可以正确查看它。在Vim中,您需要运行以下命令才能正确查看它:
:e ++enc=utf-16le
然后您可以使用来更改其编码
:set fileencoding=utf-8
之后,您可以使用UTF-8编码保存文件,以供其他人正常查看。
答案 1 :(得分:1)
操作系统版本 :此处的不同操作系统之间可能存在差异-我尚未测试。以下内容适用于Windows10。我的猜测是Windows 7可能会有所不同,或者可能不会。我在Windows 7中看到了一些命令行工具输出的问题。
Windows 10 :为了创建文本文件以保存MSI日志,您可以按 Unicode LE格式编写它,如下所示(您可能将其创建为UTF-8):
using System;
using System.IO;
using System.Text;
namespace Test
{
class Program
{
static void Main(string[] args)
{
// Sample path:
// "C:\Users\UserName\Desktop\test.log";
// Actual path constructed:
var path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.log");
File.WriteAllText(path, "This is a string", Encoding.Unicode);
}
}
}
msiexec.exe :接下来,按如下所示运行安装并将其追加到指定的日志文件中:
msiexec.exe /i Setup.msi /l*v+ "C:\Users\UserName\Desktop\test.log"
答案 2 :(得分:0)
在C#中,从Windows可执行文件读取标准时,我遇到了类似的问题。我最终在读取的输出中使用了 df = pd.read_parquet('test.parquet')
,然后我以标准编码写入了自己的文件(UTF8)。
我不确定您的情况如何。但是我认为这是您需要做的事情。我不是编码专家。
也许是这样的:
File "_parquet.pyx", line 734, in pyarrow._parquet.ParquetReader.read_all
File "error.pxi", line 79, in pyarrow.lib.check_status
pyarrow.lib.ArrowIOError: Arrow error: IOError: GZipCodec failed: incorrect header check
因此,MSI日志是用(真实)Unicode编写的。
尽管与您正在做的事情无关,这里是代码摘录:
System.Text.Encoding.Unicode
也许先尝试 File.WriteAllText(fileName, msilog, Encoding.Unicode);
,然后尝试其他编码方式,看看哪种对您有用?因此,我假设您不应该不编写为UTF8,而是(真实的)Unicode。不确定在不同的OS版本中结果如何? MSI也可以在Win9x上运行,但是今天有多重要呢?我想Windows较旧的版本使用不同的编码编写并非不是不可能?
答案 3 :(得分:0)
我的同事找到了一种方法,可以将.bat文件(例如installscript.bat)输出到日志文件(以ASCII编码),然后还附加/包含来自msi安装程序的日志输出(以UTF-16编码),一个单独的临时日志文件。例如installscript.bat内容:
new code is :
`function Covid19_all() {
// Call the COVID19 API
var response = UrlFetchApp.fetch("https://api.covid19api.com/all");
// Parse the JSON reply
var json=response.getContentText();
var data=JSON.parse(json);
var sheet = SpreadsheetApp.getActiveSheet();
for(var i=0;i<data.length;i++)
{
sheet.getRange(i+2,1).setValue([data[i]['Country']]);
sheet.getRange(i+2,2).setValue([data[i]['CountryCode']]);
sheet.getRange(i+2,3).setValue([data[i]['Province']]);
sheet.getRange(i+2,4).setValue([data[i]['City']]);
sheet.getRange(i+2,5).setValue([data[i]['Lat']]);
sheet.getRange(i+2,6).setValue([data[i]['Lon']]);
sheet.getRange(i+2,7).setValue([data[i]['Confirmed']]);
sheet.getRange(i+2,8).setValue([data[i]['Deaths']]);
sheet.getRange(i+2,9).setValue([data[i]['Recovered']]);
sheet.getRange(i+2,10).setValue([data[i]['Active']]);
sheet.getRange(i+2,11).setValue([data[i]['Date']]);
}