Разбор вывода wmic в Inno Setup - PullRequest
       14

Разбор вывода wmic в Inno Setup

0 голосов
/ 26 августа 2018

Я недавно использовал Inno Setup для своего программного обеспечения Java. Я пишу функцию, чтобы проверить, существует ли драйвер принтера, вызывая wmic printer get name /All и читая его вывод. Но проблема в том, что когда я читаю текстовый файл и проверяю, содержит ли он конкретную подстроку, Pos(), он всегда возвращает 0, но когда я пытался проверить с символом, он возвращал истинное значение. В настоящее время я использую Unicode версии 5.6.1.

Я смотрел на Delphi Pos, всегда возвращающий 0 , но я думаю, что это не мой случай:

Вот как я это сделал:

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:

Pos returned 0


А когда подстрока имеет длину = 1:

Pos returned true value

Заранее спасибо.

1 Ответ

0 голосов
/ 26 августа 2018

wmic использует кодировку UTF-16 на своем выходе.LoadStringsFromFile не поддерживает кодировку UTF-16.См. Inno Setup Pascal Script - Чтение файла UTF-16 .

Итак, файл читается неправильно.

Вы, похоже, используете IDE Inno Script Studio.Его консоль Messages не печатает сообщения точно, поэтому она скрывает реальную проблему.Если бы вы использовали оригинальный IDE Inno Setup Compiler или проверили физический файл журнала, вы бы сразу увидели проблему:

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

Решения:

...