Как передать аргументы командной строки программе в PascalABC.NET


#1

Как можно передать параметры, допустим с помощью ярлыка, в программу на PascalABC.NET? На языках C вроде понятно - это аргументы функции main(...). На паскале main нет.


#2

Есть переменная CommandLineArgs, которую заполняет с помощью System.Environment вот так:

  var arg := Environment.GetCommandLineArgs();
  if arg.Length > 1 then begin
    CommandLineArgs := new string[arg.Length - 1];
    for var i := 1 to arg.Length - 1 do
      CommandLineArgs[i - 1] := arg[i];
  end else
    CommandLineArgs := new string[0];

Первый параметр удаляет, потому что он всегда содержит имя .exe файла, а его и по-другому получить можно.


#3

Ну и в Help\ Справочник по языку\ Системный модуль PABCSystem\ Системные подпрограммы можно посмотреть ParamCount и ParamStr.

begin
  if ParamCount = 0 then
    Print('Нужны параметры')
  else
    for var i := 0 to ParamCount do
      println(ParamStr(i));
end.

Нулевой параметр, как отмечено выше, – это полный адрес файла, а сами параметры – строки. Так что если нужны числа, надо преобразовывать.


#4

Нет ну вот эти 2 функции использовать не стоит. Они ужасно не эффективно реализованы.


#5

Работают один раз при старте программы… При чём тут эффективность? Вы собираетесь гигабайт передавать через комстроку? :slight_smile:


#6

Гигабайт нет, а передачу тысяч параметров за раз я видел…


#7
Учитель: Дети, запишите предложение:
"Рыба сидела на дереве".
Ученик: А разве рыбы сидят на деревьях?
Учитель: Ну... Это была сумасшедшая рыба.
         (А. и Б. Стругацкие. "Понедельник начинается в субботу")

А если серьезно, даже три десятка параметров - это перебор. Для такого существует файловый обмен.


#8

Параметры также используются для передачи информации оболочке. Поэтому надо использовать только ParamStr


#9

Погодите что? Я что то не уловил мысль. Записывать то в них всё равно ничего нельзя.


#10

В режиме связи с оболочкой, насколько я помню, IDE туда что-то пишет.


#11

Благодарен за помощь. PascalABC передаёт в качестве [1] параметра принимает значение по умолчанию [REDIRECTIOMODE]. Впрочем try except end всё приводит в порядок.


#12

Это не хорошо, исключения должны вызываться только в особых случаях.
Лучше проверяйте аргумент, если он [REDIRECTIOMODE] - скипайте.


#13

ParamStr в качестве [1] параметра выдает первый параметр :slight_smile: а вот в качестве [0]…

  • ParamStr(0) = [REDIRECTIOMODE] в режиме связи с оболочкой (по F9)
  • ParamStr(0) = [RUNMODE] без связи с оболочкой (по shift+F9)
  • ParamStr(0) = полный путь к файлу, при запуске из ОС

можно убедиться на примере:

begin
    writeln('ParamCount: ', ParamCount);
    write('Params: ');
    for var i := 0 to ParamCount do write(ParamStr(i), '    ');
    writeln;
end.