delphinator
Турист
Для собственных нужд написал небольшой модуль для разбора параметров командной строки.
Версия 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.
Версия 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.