WIX:MSI生成的日志文件具有额外的空格字符

时间:2017-02-15 14:48:58

标签: logging wix windows-installer installer msiexec

以前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 :   * * * * * * * * * *

我做错了什么?

4 个答案:

答案 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']]);
  }