В Lazarus есть довольно неплохой парсер командной строки, который (почти) работает из коробки.
Для его использования нужно создать приложение на базе класса
TCustomApplication
, который обладает таким функционалом. Готовый шаблон проекта имеется в комплекте. Проект --> Создать проект... и в появившемся окне выбрать тип проекта Консольное приложение:
Можно ввести параметры для генерации кода:

Основной код приложения размещается в процедуре
DoRun
, например, в procedure TMyApplication.DoRun;
Решил расширить пример с поиском файла по маске (копия), заодно поэкспериментировать с парсером командной строки.
Параметры будут такие:
Использование: smallfinder.exe <аргументы>
-h - эта помощь
-m <маска> - маска файла для поиска. Обязательный параметр
-d <директория> - Начальняя директория, если параметр не указан, используется текущая.
-s - включить в поиск подкаталоги
Примечание: весь код в процедуре
TSmallfinder.DoRun
.Почему-то способ проверки из документации, случая, когда параметров нет вообще, у меня сработал криво, так что пришлось вспоминать более старый:
// check if no parameters - способ из документации нихуя не сработал
if ParamCount=0 then begin
WriteHelp;
Terminate;
Exit;
end;
Но далее все вроде бы пошло как надо, единственное, что параметры регистрозависимые (т.е.
-d
и -D
программа воспринимает как разные параметры), пока не стал с этим разбираться, может после, если сильно надо будет. Длинные имена параметров не использовал, только короткие.Вывод помощи:
//help
if HasOption('h', '') then begin
WriteHelp;
Terminate;
Exit;
end;
Процедуру
WriteHelp
можно создать при создании нового проекта, а потом только запомнить, примерно так:procedure TSmallfinder.WriteHelp;
begin
writeln('Usage: ',ExtractFileName(ExeName), ' <arguments>');
WriteLn('-h - this help');
WriteLn('-m <mask> - file mask for search. Parameter must be!');
WriteLn('-d <directory> - start directory. If not, use current dir.');
WriteLn('-s - include subdirs');
end;
Маска файла:
//mask
if HasOption('m','') then begin
Mask:=GetOptionValue('m','');
if Mask = '' then begin
WriteHelp;
Terminate;
Exit;
end;
end;
Стартовый каталог:
//start directory
StartDir:=GetOptionValue('d','');
if StartDir='' then begin
StartDir:=GetCurrentDir();
end;
Искать в подкаталогах:
//Include subdirs
IncludeSubdirs:=HasOption('s','');
Ну и сам процесс поиска, до кучи:
WriteLn('Start directory: ',StartDir);
lstFiles := TStringList.Create;
FindAllFiles(lstFiles, StartDir, Mask, IncludeSubdirs);
i:=0;
while i < lstFiles.Count do begin
WriteLn(lstFiles[i]);
inc(i);
end;
lstFiles.Free();
Естественно, все нужные переменные перечисляем в секции
var
процедуры TSmallfinder.DoRun
var
Mask, StartDir:string;
IncludeSubdirs:boolean;
i:LongInt;
lstFiles:TStringList;
smallfinder.exe -m *.exe -d C:\Windows

smallfinder.exe -m *.exe -d C:\Windows -s

smallfinder.exe -m *.exe

Мануал по обработке параметров командной строки
Пример целиком на GitHub
Это репост с сайта http://tolik-punkoff.com
Оригинал: https://tolik-punkoff.com/2022/11/27/laz