Как передать переменную, которая содержит двойные кавычки, в исполняемый файл Delphi в Cygwin? - PullRequest
0 голосов
/ 02 октября 2018

Я пытаюсь получить несколько параметров, каждый из которых содержит разделенные пробелами токены и поэтому заключен в кавычки.Однако, когда весь набор параметров предоставляется из Cygwin через переменную bash, Delphi не распознает его.

Project1.sh

./Project1.exe "a b c d"
arg='"a b c d"'  
./Project1.exe $arg

Project1.pas

procedure TForm1.FormCreate(Sender: TObject);
var
  I: Integer;
begin
  for I := 0 to ParamCount do begin
    Memo1.Lines.Add(ParamStr(I));
    if AnsiEndsText('\', ParamStr(I)) then
    begin
      raise Exception.Create(ParamStr(I));
    end;
  end;
end;

Ожидаемая запись - a b c d, как указано ./Project1.exe "a b c d".

Тем не менее, ./Project1.exe $arg дает только \a b c d\.

Не могли бы вы прокомментировать, возможно ли получить a b c d с переменной в Cygwin?

1 Ответ

0 голосов
/ 03 октября 2018

При запуске Project1.exe "a b c d" существует один параметр, значение которого равно a b c d.Двойные кавычки не являются частью самого значения параметра, они просто ограничители, позволяющие процессору командной строки знать, что в нем есть один параметр со встроенными пробелами.

При выполнении Project1.exe $arg вывключая двойные кавычки в значение параметра, поэтому при передаче в командной строке они должны быть экранированы как \", поэтому вы получаете параметр, переданный как "\"a b c d\"".Однако Delphi ParamStr() не поддерживает экранирование \" и удаляет все " символы .Вот почему вместо этого вы получите значение параметра \a b c d\.

Если вам просто нужно значение параметра a b c d, избавьтесь от двойных кавычек в вашей переменной:

arg='a b c d'

В противном случае вам придется позвонить GetCommandLine() напрямую, а затем проанализировать его вручную или использовать CommandLineToArgvW() (который поддерживает \"спасаясь ).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...