В 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