RAD Studio Модуль разбора командной строки

delphinator

Турист
Регистрация
18 Май 2022
Сообщения
1
Реакции
1
Credits
34
Для собственных нужд написал небольшой модуль для разбора параметров командной строки.
Версия Delphi 10.4 и выше, для более ранних версий нужно заменить объявления inline переменных на классические.

unit CmdLineParser;
//
// Хранилище параметров командной строки программы
//
// Командная строка имеет вид: '"путь\имя_программы" параметр1 параметр2 ... параметрN'
// Параметры разделяются пробелами и обозначаются символами '-' и/или '/'
// Параметр состоит из имени и необязательного значения, отделенного пробелом или символом '='
//
// По умолчанию поиск регистрозависимый, т.е. /v и /V это разные параметры
// Для регистроНЕзависимого поиска изменить значение CaseSensitive на False.
//
interface

uses
System.Classes, System.Generics.Collections;

const
clpCaseSensitive = True;
clpCaseInsensitive = False;

type
TCommandLineParser = class(TObject)
public
constructor Create(ACaseSensitive: Boolean = clpCaseSensitive);
destructor Done;
function GetParameterValue(Name: string): string;
function ParameterExists(Name: string): Boolean;
private
var
Parameters: TDictionary<string, string>;
end;

var
CommandLineParser: TCommandLineParser;

implementation

uses
System.StrUtils, System.SysUtils, System.Math, System.Generics.Defaults;

constructor TCommandLineParser.Create;
begin
inherited Create;

case ACaseSensitive of
clpCaseSensitive: Parameters := TDictionary<string, string>.Create;
clpCaseInsensitive: Parameters := TDictionary<string, string>.Create(TIStringComparer.Ordinal);
end;

var name := '';
var value := '';
var wstr := '';
var ValueStart: integer;

{ удаляем "путь\имя_программы" и двойные кавычки из строки CmdLine и разбираем на части }
var Splitted := Trim(StringReplace(ReplaceStr(CmdLine, ParamStr(0), ''), '"', '', [rfReplaceAll])).Split(['/', '-']);

for var s in Splitted do
if s <> '' then
begin
wstr := Trim(s);
ValueStart := Max(Pos(' ', wstr), Pos('=', wstr));
if ValueStart > 0 then
begin
{ затем извлекаем значение параметра, если оно задано }
name := Copy(wstr, 1, ValueStart - 1);
value := Copy(wstr, ValueStart + 1, 255);
end else
begin
name := wstr;
value := '';
end;
Parameters.TryAdd(name, value);
end;
end;

destructor TCommandLineParser.Done;
begin
if Assigned(Parameters) then
Parameters.Free;
end;

function TCommandLineParser.GetParameterValue(Name: string): string;
begin
if not Parameters.TryGetValue(Name, Result) then
Result := ''; // вернуть явную пустую строку, если не удалось получить значенние параметра
end;

function TCommandLineParser.ParameterExists(Name: string): Boolean;
begin
Result := Parameters.ContainsKey(Name);
end;

initialization

CommandLineParser := TCommandLineParser.Create;

finalization

if Assigned(CommandLineParser) then
CommandLineParser.Free;

end.