在 Inno Setup 中解析 wmic 的输出

Parsing output of wmic in Inno Setup

我最近为我的 Java 软件使用了 Inno Setup。我正在编写一个函数,通过调用 wmic printer get name /All 并读取它的输出来检查打印机驱动程序是否存在。但问题是当我读取文本文件并检查它是否包含 Pos() 的特定子字符串时,它总是返回 0,但是当我尝试用一​​个字符进行测试时它返回了真值。我目前使用的是 5.6.1 版 Unicode。

我看过 但我认为这不是我的情况:

我是这样做的:

function isContainedInFile(File, Substring: String): Boolean;
var 
  Lines: TArrayOfString;
  i: Integer;
  line: String;
begin
  Substring := Uppercase(Substring);
  Result := False;
  if LoadStringsFromFile(File, Lines) then 
     begin
        for i:= 0 to GetArrayLength(Lines) - 1 do
          begin
            line := Lines[i];
            if (Length(line) = 0) then
                continue;

            line := Uppercase(Trim(line));
            Log('Substring:' + Substring + ', Line:' + line + ', Pos:' + IntToStr(Pos(Substring, line)));
            if (Pos(Substring, line) <> 0) then
            begin
                Result:= True;
                break;
            end;
          end;
     end;
end;

我是这样称呼 isContainedInFile():

function IsBrotherDriverInstalled(): Boolean;
var
  path, brotherPath, ListPrinterPath, ListPrinter: String;
  check, index: Integer;
begin       
  ListPrinterPath := ExpandConstant('{tmp}\printerlist.tdm');
  { Save temporarily the list }
  Exec(ExpandConstant('{cmd}'), '/c wmic printer get name /All > "' + ListPrinterPath + '"', 
                      '', SW_HIDE, ewWaitUntilTerminated, check);
  { Check if the list has the printer }
  Result := isContainedInFile(ListPrinterPath, PrinterName);
  { Delete the file }
  DeleteFile(ListPrinterPath);
end;

这是我在子字符串长度 > 1 时的输出:


当子字符串的长度为 1 时:

提前致谢。

wmic 在其输出中使用 UTF-16 编码。 LoadStringsFromFile不支持UTF-16编码。参见

所以文件读取错误。

您似乎在使用 Inno Script Studio IDE。它的 Messages 控制台不会准确地打印消息,所以它混淆了真正的问题。如果您使用原始的 Inno Setup 编译器 IDE 或检查物理日志文件,您会立即看到问题:

2018-08-26 10:44:35.783   Substring:BROTHER, Line:ÿþN A M E, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:S E N D   T O   O N E N O T E   2 0 1 6, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:S A M S U N G   S C X - 3 4 0 0   S E R I E S   ( U S B 0 0 1 ), Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:M S   P U B L I S H E R   C O L O R   P R I N T E R, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:M I C R O S O F T   X P S   D O C U M E N T   W R I T E R, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:M I C R O S O F T   P R I N T   T O   P D F, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:H P   E P R I N T   +   J E T A D V A N T A G E, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:F A X, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:, Pos:0
2018-08-26 10:44:35.783   Substring:BROTHER, Line:, Pos:0

解决方案: