WIX:MSI 生成的日志文件有多余的空格字符

问题描述 投票:0回答:4

以前 MSI 每次都会创建新的日志文件,一切都运行顺利。现在我们有一个要求,我们需要附加到现有文件,而不是创建新的日志文件。我们使用的命令是

msiexec file.msi /l*v+ logfile.log  /passive
,因为 msdn 建议使用“+”来附加到现有文件。之后,我在日志文件中的每个字符后面看到一个额外的空格。

示例日志文件:

= = = 详细记录开始:2 / 1 5 / 2 0 1 7 8 : 4 9 : 5 4 构建类型:SHIP UNICDE 5。 0 0 。 9 6 0 0 。 0 0 调用过程:C:\WINDOWS\System 3 2\msi exec。 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 :   * * * * * * * * * *

我做错了什么?

logging wix installation windows-installer
4个回答
2
投票

MSI 日志文件似乎将自身写入为 UTF-16 (LE)。这些文件可以正确查看,并且可以使用更强大(且免费)的文本编辑器(如 Notepad++、Vim 等)轻松转换回 UTF-8。

在 Notepad++ 中,打开文件后会正常显示。使用该应用程序,您只需转到“编码”菜单并将其更改为 UTF-8,然后保存,以便其他人可以正确查看。在 Vim 中,您需要运行此命令才能正确查看它:

:e ++enc=utf-16le

然后您可以使用

更改其编码
:set fileencoding=utf-8

之后,您可以将文件以UTF-8编码保存,以供其他人正常查看。


1
投票

操作系统版本:不同操作系统之间可能存在差异 - 我尚未测试。下面的代码适用于 Windows 10。我的猜测是 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"

0
投票

我的同事找到了一种方法,可以将 .bat 文件(例如 installscript.bat)输出到日志文件(采用 ASCII 编码),然后还附加/包含来自单独的 msi 安装程序(采用 UTF-16 编码)的日志输出临时日志文件。例如installscript.bat内容:

REM installscript.bat - outputs log info to logfl in default MS-DOS ASCII format

set logfl=C:\Windows\Temp\install_script_log.txt 
set msilogfl=C:\Windows\Temp\msiinstaller_log.txt

echo "Running msiinstaller.msi ..." >> %logfl%

REM MSI logs in UTF-16 to msilogfl, then output and redirect in ASCII to logfl
.\msiinstaller.msi /quiet /norestart /l* %msilogfl% & TYPE %msilogfl% >> %logfl%

echo "Completed msiinstaller.msi. "  >> %logfl%

0
投票

您现有文件的创建编码与 .msi 写入时使用的 UTF-16 LE-BOM 不同。尝试通过首先使用该编码创建并写入文件来做好准备。以下是我的案例的例子

File.AppendAllText(LogFile, $"{DateTime.Now}: {command} {arguments}\n{output}\n{error}\n\n", Encoding.Unicode);
© www.soinside.com 2019 - 2024. All rights reserved.