Sign in Join
Wiki copytemporary

Command line parameters and environment variables/ru: what changed

Revision 1 to 2. Removed lines have a minus sign; added lines have a plus sign.

OldNewLine
1-В большинстве (интерактивных) операционных систем [[Program/ru|программы]] можно запускать через интерфейс командной строки [[Command-line interface|command line interface]] (CLI), что позволяет предоставлять программе дополнительные данные. Модули [[System unit|system]] (и [[Object Pascal|objPas]]) предоставляют базовые [[Function/ru|функции]] для доступа к данным, предоставленным из командной строки.
2-
3-## Обзор
1+В большинстве (интерактивных) операционных систем [[Program/ru|программы]] можно запускать через интерфейс командной строки [[Command-line interface|command line interface]] (CLI), что позволяет предоставлять программе дополнительные данные. Модули [[System unit|system]] (и [[Object Pascal|`objPas`]]) предоставляют базовые [[Function/ru|функции]] для доступа к данным, предоставленным из командной строки.
42
5-Хотя на этой странице говорится о *параметрах командной строки* и переменных среды, фактический интерфейс командной строки (CLI) не является обязательным требованием для использования таких данных, а также для использования процедур и терминологии, описанных здесь. Однако, поскольку интерфейс командной строки более осязаем, следующие инструкции в основном относятся к пользовательскому интерфейсу оболочки.
3+## Contents
64
7-### Терминология
5+ * 1 Обзор
6+ * 1.1 Терминология
7+ * 1.2 Основы
8+ * 2 Параметры командной строки
9+ * 2.1 Основы
10+ * 2.2 Простота использования
11+ * 2.2.1 Проверка параметра
12+ * 2.2.2 Чтение значения параметра
13+ * 2.2.3 Проверка параметров на валидность
14+ * 3 Переменные окружения
815
9-Option (переключатели)
10-Опции - флаги yes/no. Обычно они имеют вид `‑‑dryrun`/`‑‑no‑dryrun` (dryrun включен или отключен соответственно). Опции также называются «переключателями».
16+## Обзор
1117
12-Parameter (параметр)
13-Параметры представляют собой кортежи ключ-значение. В командной строке они выглядят так: `‑‑processors 4`.
18+Хотя на этой странице говорится о _параметрах командной строки_ и переменных среды, фактический интерфейс командной строки (CLI) не является обязательным требованием для использования таких данных, а также для использования процедур и терминологии, описанных здесь. Однако, поскольку интерфейс командной строки более осязаем, следующие инструкции в основном относятся к пользовательскому интерфейсу оболочки.
1419
15-Argument (аргумент)
16-Аргументы — это простые слова. В командной строке они обычно разделяются пробелами (назначают переменную [IFS](https://en.wikipedia.org/wiki/Input_Field_Separators) в некоторых оболочках). В узком смысле, аргументы — это все предоставленные слова, которые не являются ни опциями, ни (частью) параметров. В общем, *аргументы* — это все слова в командной строке, которые никак не интерпретируются.
20+### Терминология
1721
18-Environment variable (переменные окружения)
19-Переменные окружения относятся к помеченной части хранилища в среде. Это пары имя-значение.
22+Option (переключатели)
23+ Опции - флаги yes/no. Обычно они имеют вид `‑‑dryrun`/`‑‑no‑dryrun` (dryrun включен или отключен соответственно). Опции также называются «переключателями».
24+Parameter (параметр)
25+ Параметры представляют собой кортежи ключ-значение. В командной строке они выглядят так: `‑‑processors 4`.
26+Argument (аргумент)
27+ Аргументы — это простые слова. В командной строке они обычно разделяются пробелами (назначают переменную [IFS](<https://en.wikipedia.org/wiki/Input_Field_Separators>) в некоторых оболочках). В узком смысле, аргументы — это все предоставленные слова, которые не являются ни опциями, ни (частью) параметров. В общем, _аргументы_ — это все слова в командной строке, которые никак не интерпретируются.
28+Environment variable (переменные окружения)
29+ Переменные окружения относятся к помеченной части хранилища в среде. Это пары имя-значение.
2030
21-Обратите внимание, CLI/OS предоставляет программе только те аргументы, которые она должна получить: например, экранированные символы новой строки, перенаправление файла (каналы или в файл) и присвоение переменных среды не будут перенаправлены в программу.
31+Обратите внимание, CLI/OS предоставляет программе только те аргументы, которые она должна получить: например, экранированные символы новой строки, перенаправление файла (каналы или в файл) и присвоение переменных среды не будут перенаправлены в программу.
2232
2333### Основы
2434
25-Поскольку понятия «опция» и «параметры» уже являются своего рода высокоуровневыми, существуют разные стили (короткие опции против длинных опций), и модуль system стремится предоставить *базовые* средства для работы, все аргументы командной строки просто перечисляютсяить, начиная с нуля. Никакой интерпретации не делается.
35+Поскольку понятия «опция» и «параметры» уже являются своего рода высокоуровневыми, существуют разные стили (короткие опции против длинных опций), и модуль system стремится предоставить _базовые_ средства для работы, все аргументы командной строки просто перечисляютсяить, начиная с нуля. Никакой интерпретации не делается.
2636
27-Функция [`paramStr`](https://www.freepascal.org/docs-html/rtl/system/paramstr.html) возвращает n-й аргумент в командной строке. `ParamStr(0)` пытается вернуть имя и, возможно, полный путь к исполняемому программному файлу.
37+Функция [`paramStr`](<https://www.freepascal.org/docs-html/rtl/system/paramstr.html>) возвращает n-й аргумент в командной строке. `ParamStr(0)` пытается вернуть имя и, возможно, полный путь к исполняемому программному файлу.
2838
2939## Параметры командной строки
3040
3141### Основы
3242
33-Программа на Паскале может получить доступ к аргументам командной строки, используя [[Function/ru|функцию]]`paramStr` в сочетании с [`paramCount`](https://www.freepascal.org/docs-html/rtl/system/paramcount.html). `ParamCount` возвращает количество предоставленных аргументов.
34-
35-``` pascal
43+Программа на Паскале может получить доступ к аргументам командной строки, используя [[Function/ru|функцию]]`paramStr` в сочетании с [`paramCount`](<https://www.freepascal.org/docs-html/rtl/system/paramcount.html>). `ParamCount` возвращает количество предоставленных аргументов.
44+```
3645program listArguments(input, output, stdErr);
37-{$mode objFPC}
38-var
39- i: integer;
40-begin
41- writeLn({$ifDef Darwin}
42- // в Mac OS X возвращаемое значение зависит от метода вызова
43- 'This program was invoked via: ',
44- {$else}
45- // Turbo Pascal-совместимый paramStr(0) возвращает местоположение
46- 'This program is/was stored at: ',
47- {$endIf}
48- paramStr(0));
49-
50- for i := 1 to paramCount() do
46+ {$mode objFPC}
47+ var
48+ i: integer;
5149 begin
52- writeLn(i:2, '. argument: ', paramStr(i));
53- end;
54-end.
50+ writeLn({$ifDef Darwin}
51+ // в Mac OS X возвращаемое значение зависит от метода вызова
52+ 'This program was invoked via: ',
53+ {$else}
54+ // Turbo Pascal-совместимый paramStr(0) возвращает местоположение
55+ 'This program is/was stored at: ',
56+ {$endIf}
57+ paramStr(0));
58+
59+ for i := 1 to paramCount() do
60+ begin
61+ writeLn(i:2, '. argument: ', paramStr(i));
62+ end;
63+ end.
5564```
5665
57-Запуск этой программы (на не-Mac OS Ⅹ платформе) может выглядеть следующим образом:
58-
59-```text
66+Запуск этой программы (на не-Mac OS Ⅹ платформе) может выглядеть следующим образом:
67+```
6068$ ./listArguments foo bar able
61-This program is/was stored at: /tmp/listArguments
62- 1. argument: foo
63- 2. argument: bar
64- 3. argument: able
69+ This program is/was stored at: /tmp/listArguments
70+ 1. argument: foo
71+ 2. argument: bar
72+ 3. argument: able
6573```
6674
67-Модуль [[RTL]] `system` предоставляет версию `paramStr`, которая возвращает короткие строки [[Shortstring|shortString]]. Из-за особенностей реализации `shortString` ограничены 255 символами. Однако пользователь может указать более длинные аргументы командной строки.
75+Модуль [[RTL]] `system` предоставляет версию `paramStr`, которая возвращает короткие строки [[Shortstring|`shortString`]]. Из-за особенностей реализации `shortString` ограничены 255 символами. Однако пользователь может указать более длинные аргументы командной строки.
6876
69-Чтобы получить к ним доступ, модуль [`objPas`](https://www.freepascal.org/docs-html/rtl/objpas/index.html) переопределяет `paramStr`, который вместо этого возвращает строки [[Ansistring|ansiString]], которые не имеют этого ограничения длины. Модуль `objPas` автоматически включается в режимы компилятора [[Mode ObjFPC|{$mode objFPC}]] (строка2) и [[Mode Delphi|{$mode Delphi}]].
77+Чтобы получить к ним доступ, модуль [`objPas`](<https://www.freepascal.org/docs-html/rtl/objpas/index.html>) переопределяет `paramStr`, который вместо этого возвращает строки [[Ansistring|`ansiString`]], которые не имеют этого ограничения длины. Модуль `objPas` автоматически включается в режимы компилятора [[Mode ObjFPC|`{$mode objFPC}`]] (строка2) и [[Mode Delphi|`{$mode Delphi}`]].
7078
71-Распределенная функция `paramStr` пытается быть совместимой с [[Turbo Pascal]]. В TP `paramStr(0)` возвращает местоположение программы. Однако операционная система должна поддерживать это. В частности, в Mac OS Ⅹ значение `paramStr(0)` зависит от метода вызова, от того, как запускается приложение.
79+Распределенная функция `paramStr` пытается быть совместимой с [[Turbo Pascal]]. В TP `paramStr(0)` возвращает местоположение программы. Однако операционная система должна поддерживать это. В частности, в Mac OS Ⅹ значение `paramStr(0)` зависит от метода вызова, от того, как запускается приложение.
7280
73-> **Note:** Поскольку `paramStr(0)` зависит от функциональности ОС, он не подходит для [[Multiplatform Programming Guide/ru|кроссплатформенных программ]].
81+[![Note-icon.png](/wiki-images/b/be/Note-icon.png)](</File:Note-icon.png>)
7482
75-> **Note:** На юниксоидных платформах невозможно точно определить местоположение файла только по строке. Может быть несколько жестких ссылок, указывающих на один и тот же индексный дескриптор, файл мог быть уже удален, части пути к файлу могли измениться, помимо других деталей. По этим причинам `paramStr(0)` на юниксоидных платформах бесполезен.
83+**Примечание:** Поскольку `paramStr(0)` зависит от функциональности ОС, он не подходит для [[Multiplatform Programming Guide/ru|кроссплатформенных программ]].
7684
77-Модуль [`getOpts`](https://www.freepascal.org/docs-html/rtl/getopts/index.html) предоставляет несколько других подпрограмм для вызова программы в соответствии с определенным стилем.
85+[![Note-icon.png](/wiki-images/b/be/Note-icon.png)](</File:Note-icon.png>)
7886
87+**Примечание:** На юниксоидных платформах невозможно точно определить местоположение файла только по строке. Может быть несколько жестких ссылок, указывающих на один и тот же индексный дескриптор, файл мог быть уже удален, части пути к файлу могли измениться, помимо других деталей. По этим причинам `paramStr(0)` на юниксоидных платформах бесполезен.
88+
89+Модуль [`getOpts`](<https://www.freepascal.org/docs-html/rtl/getopts/index.html>) предоставляет несколько других подпрограмм для вызова программы в соответствии с определенным стилем.
90+
7991### Простота использования
8092
81-Хорошая программа должна выдавать справочное сообщение при вызове с неправильными параметрами и должна следовать общепринятому способу предоставления параметров. Модуль [`custApp`](https://www.freepascal.org/docs-html/fcl/custapp/index.html), поставляемый с FPC, предоставляет класс [`TCustomApplication`](https://www.freepascal.org/docs-html/fcl/custapp/tcustomapplication.html), предоставляющий функции для простой проверки и чтения параметров. Конечно, вы по-прежнему можете получить доступ к параметрам напрямую через `paramStr` и `paramCount`.
93+Хорошая программа должна выдавать справочное сообщение при вызове с неправильными параметрами и должна следовать общепринятому способу предоставления параметров. Модуль [`custApp`](<https://www.freepascal.org/docs-html/fcl/custapp/index.html>), поставляемый с FPC, предоставляет класс [`TCustomApplication`](<https://www.freepascal.org/docs-html/fcl/custapp/tcustomapplication.html>), предоставляющий функции для простой проверки и чтения параметров. Конечно, вы по-прежнему можете получить доступ к параметрам напрямую через `paramStr` и `paramCount`.
8294
83-Каждое приложение [[LCL]] использует это автоматически. Объект Application — это TCustomApplication.
95+Каждое приложение [[LCL]] использует это автоматически. Объект Application — это TCustomApplication.
8496
85-Если вы хотите написать не LCL-программу, то создайте в [[Lazarus]] новый проект типа «Консольное приложение». Это создаст файл project1.lpr с некоторыми приятными дополнениями, которые нужны почти всем программам. Перейдите к методу `doRun`.
97+Если вы хотите написать не LCL-программу, то создайте в [[Lazarus]] новый проект типа «Консольное приложение». Это создаст файл project1.lpr с некоторыми приятными дополнениями, которые нужны почти всем программам. Перейдите к методу `doRun`.
8698
8799#### Проверка параметра
88100
89-С TCustomApplication вы можете получить доступ к параметрам по имени. Например, ваша программа должна выводить текст справки, когда пользователь задает общий параметр справки *-h*. *-h* является коротким вариантом параметра. Длинная форма *--help*. Чтобы проверить, вызвал ли пользователь программу с помощью *-h* или *--help*, вы можете использовать следующий код:
90-
91-```delphi
101+С TCustomApplication вы можете получить доступ к параметрам по имени. Например, ваша программа должна выводить текст справки, когда пользователь задает общий параметр справки _-h_. _-h_ является коротким вариантом параметра. Длинная форма _\--help_. Чтобы проверить, вызвал ли пользователь программу с помощью _-h_ или _\--help_ , вы можете использовать следующий код:
102+```
92103if hasOption('h', 'help') then
93-begin
94- writeHelp;
95- halt;
96-end;
104+ begin
105+ writeHelp;
106+ halt;
107+ end;
97108```
98109
99-> **Note:** В LCL-форме вы должны добавить `application.` перед `hasOption`.
110+[![Note-icon.png](/wiki-images/b/be/Note-icon.png)](</File:Note-icon.png>)
100111
101-Например:
112+**Примечание:** В LCL-форме вы должны добавить `application.` перед `hasOption`.
102113
103-```delphi
114+Например:
115+```
104116if application.hasOption('h', 'help') then
105-begin
106- writeHelp;
107- halt;
108-end;
117+ begin
118+ writeHelp;
119+ halt;
120+ end;
109121```
110122
111-Если вы хотите поддерживать только короткий вариант, используйте:
112-
113-```delphi
123+Если вы хотите поддерживать только короткий вариант, используйте:
124+```
114125if hasOption('h', '') then
115126```
116127
117-Если вы хотите поддерживать только длинный вариант, используйте:
118-
119-```delphi
128+Если вы хотите поддерживать только длинный вариант, используйте:
129+```
120130if hasOption('help') then
121131```
122132
123133#### Чтение значения параметра
124134
125-Каждому параметру может быть присвоено значение. Например:
126-
127-``` bash
135+Каждому параметру может быть присвоено значение. Например:
136+```
128137$ project1 -f filename
129138```
130139
131-или в длинной форме:
132-
133-``` bash
140+или в длинной форме:
141+```
134142$ project1 --file=filename
135143```
136144
137-Чтобы получить `filename`, используйте:
138-
139-```delphi
145+Чтобы получить `filename`, используйте:
146+```
140147writeLn('f=', getOptionValue('f', 'file'));
141148```
142149
143-> **Note:** если вы получаете сообщение об ошибке "`Option at position 1 needs an argument : f.`" (Переключатель в позиции 1 нуждается в аргументе: f), то вы забыли добавить опцию при вызове [`checkOptions`](https://www.freepascal.org/docs-html/fcl/custapp/tcustomapplication.checkoptions.html).
150+[![Note-icon.png](/wiki-images/b/be/Note-icon.png)](</File:Note-icon.png>)
144151
145-#### Проверка параметров на валидность
152+**Примечание:** если вы получаете сообщение об ошибке "`Option at position 1 needs an argument : f.`" (Переключатель в позиции 1 нуждается в аргументе: f), то вы забыли добавить опцию при вызове [`checkOptions`](<https://www.freepascal.org/docs-html/fcl/custapp/tcustomapplication.checkoptions.html>).
146153
147-Параметры командной строки представляют собой произвольный текст, поэтому пользователь при вводе может легко допускать ошибки. Отсюда проверка синтаксиса параметров обязательна. Для этого вы можете использовать метод [[doc:fcl/custapp/tcustomapplication.checkoptions.html|CheckOptions]].
154+#### Проверка параметров на валидность
148155
149-Вы можете определить, какие параметры разрешены, какие из них нуждаются в параметре, а в случае синтаксической ошибки вы можете получить сообщение об ошибке, а также неправильные параметры для печати полезных и подробных ошибок.
156+Параметры командной строки представляют собой произвольный текст, поэтому пользователь при вводе может легко допускать ошибки. Отсюда проверка синтаксиса параметров обязательна. Для этого вы можете использовать метод [CheckOptions](<http://lazarus-ccr.sourceforge.net/docs/fcl/custapp/tcustomapplication.checkoptions.html> "doc:fcl/custapp/tcustomapplication.checkoptions.html").
150157
151-Пример:
158+Вы можете определить, какие параметры разрешены, какие из них нуждаются в параметре, а в случае синтаксической ошибки вы можете получить сообщение об ошибке, а также неправильные параметры для печати полезных и подробных ошибок.
152159
153-```delphi
160+Пример:
161+```
154162errorMsg := checkOptions('hf:', 'help file:');
155163```
156164
157-Это позволяет передавать короткие переключатели: `‑f value` и `‑h`.\
158-Это - передавать длинные переключатели: `‑‑help` или `‑‑file=filename`.\
159-А это не позволяет передачу параметра `‑‑help` *со значением* или `‑‑file` *без значения*.\
160-Пример передачи параметра:
165+Это позволяет передавать короткие переключатели: `‑f value` и `‑h`.
166+Это - передавать длинные переключатели: `‑‑help` или `‑‑file=filename`.
167+А это не позволяет передачу параметра `‑‑help` _со значением_ или `‑‑file` _без значения_.
161168
162-``` pascal
169+Пример передачи параметра:
170+```
163171procedure TMainForm.FormShow(Sender: TObject);
164-var
165- I: Integer;
166- Params : TStringList
167- LongOpts : array [1..2] of string = ('debug-sync', 'config-dir:');
168-begin
169- Params := TStringList.Create;
170- try
171- Application.GetNonOptions('hgo:', LongOpts, Params);
172- for I := 0 to Params.Count -1 do
173- debugln('Extra Param ' + inttostr(I) + ' is ' + Params[I]); }
174- finally
175- FreeAndNil(Params);
172+ var
173+ I: Integer;
174+ Params : TStringList
175+ LongOpts : array [1..2] of string = ('debug-sync', 'config-dir:');
176+ begin
177+ Params := TStringList.Create;
178+ try
179+ Application.GetNonOptions('hgo:', LongOpts, Params);
180+ for I := 0 to Params.Count -1 do
181+ debugln('Extra Param ' + inttostr(I) + ' is ' + Params[I]); }
182+ finally
183+ FreeAndNil(Params);
184+ end;
176185 end;
177-end;
178186```
179187
180-Этот пример находит параметры и не смешивает их с переключателями или параметрами командной строки. В этом примере приложение также принимает параметры --debug-sync и --config-dir=somedir, но здесь они не указаны.
188+Этот пример находит параметры и не смешивает их с переключателями или параметрами командной строки. В этом примере приложение также принимает параметры --debug-sync и --config-dir=somedir, но здесь они не указаны.
181189
182-Обратите внимание, что Application.GetNonOptions() принимает длинные параметры в виде массива, а Application.CheckOptions принимает те же данные, но в виде строки. Немного грустно!
190+Обратите внимание, что Application.GetNonOptions() принимает длинные параметры в виде массива, а Application.CheckOptions принимает те же данные, но в виде строки. Немного грустно!
183191
184192## Переменные окружения
185193
186-Модуль [[sysutils|sysUtils]] определяет три основные функции для получения переменных среды.
187-
188-- [`getEnvironmentVariableCount`](https://www.freepascal.org/docs-html/rtl/sysutils/getenvironmentvariablecount.html) возвращает общее количество переменных среды.
189-- [`getEnvironmentString`](https://www.freepascal.org/docs-html/rtl/sysutils/getenvironmentstring.html) возвращает переменную среды по ее индексу
190-- [`getEnvironmentVariable`](https://www.freepascal.org/docs-html/rtl/sysutils/getenvironmentvariable.html) возвращает переменную среды по ее ключу
194+Модуль [[sysutils|`sysUtils`]] определяет три основные функции для получения переменных среды.
191195
192-Пример:
196+ * [`getEnvironmentVariableCount`](<https://www.freepascal.org/docs-html/rtl/sysutils/getenvironmentvariablecount.html>) возвращает общее количество переменных среды.
197+ * [`getEnvironmentString`](<https://www.freepascal.org/docs-html/rtl/sysutils/getenvironmentstring.html>) возвращает переменную среды по ее индексу
198+ * [`getEnvironmentVariable`](<https://www.freepascal.org/docs-html/rtl/sysutils/getenvironmentvariable.html>) возвращает переменную среды по ее ключу
193199
194-``` pascal
195-program environmentVariablesList(input, output, stdErr);
196-uses
197- sysUtils;
198-var
199- i: integer;
200-begin
201- for i := 0 to getEnvironmentVariableCount() - 1 do
202- begin
203- writeLn(getEnvironmentString(i));
204- end;
205-end.
200+Пример:
206201```
207-
208-Также можно загрузить все переменные среды в объект [`TStringList`](https://www.freepascal.org/docs-html/rtl/classes/tstringlist.html) и легко получить доступ к паре имя-значение. Списки строк автоматически учитывают символ-разделитель, который по умолчанию является знаком равенства [[=|('=')]].
209-
210-```delphi
211-program environmentVariablesSorted(input, output, stdErr);
212-{$mode objFPC}
213-uses
214- classes, sysUtils;
215-var
216- i: integer;
217- environmentVariables: tStringList;
218-begin
219- environmentVariables := tStringList.create();
220-
221- try
222- // загружаем все переменные в список строк
223- for i := 0 to getEnvironmentVariableCount() - 1 do
224- begin
225- environmentVariables.append(getEnvironmentString(i));
226- end;
227-
228- environmentVariables.sort;
229- for i := 0 to environmentVariables.count - 1 do
230- begin
231- writeLn(environmentVariables.names[i]:20,
232- ' = ',
233- environmentVariables.valueFromIndex[i]);
234- end;
235- finally
236- environmentVariables.free;
237- end;
238-end.
202+1program environmentVariablesList(input, output, stdErr);
203+ 2uses
204+ 3 sysUtils;
205+ 4var
206+ 5 i: integer;
207+ 6begin
208+ 7 for i := 0 to getEnvironmentVariableCount() - 1 do
209+ 8 begin
210+ 9 writeLn(getEnvironmentString(i));
211+ 10 end;
212+ 11end.
239213```
240214
241-Существует также [[Method|метод]] `TCustomApplication` для одновременного получения всех переменных среды в виде [[TStringList]]. Тогда схема может выглядеть так:
215+Также можно загрузить все переменные среды в объект [`TStringList`](<https://www.freepascal.org/docs-html/rtl/classes/tstringlist.html>) и легко получить доступ к паре имя-значение. Списки строк автоматически учитывают символ-разделитель, который по умолчанию является знаком равенства [[=|(`'='`)]].
216+```
217+1program environmentVariablesSorted(input, output, stdErr);
218+ 2{$mode objFPC}
219+ 3uses
220+ 4 classes, sysUtils;
221+ 5var
222+ 6 i: integer;
223+ 7 environmentVariables: tStringList;
224+ 8begin
225+ 9 environmentVariables := tStringList.create();
226+ 10
227+ 11 try
228+ 12 // загружаем все переменные в список строк
229+ 13 for i := 0 to getEnvironmentVariableCount() - 1 do
230+ 14 begin
231+ 15 environmentVariables.append(getEnvironmentString(i));
232+ 16 end;
233+ 17
234+ 18 environmentVariables.sort;
235+ 19 for i := 0 to environmentVariables.count - 1 do
236+ 20 begin
237+ 21 writeLn(environmentVariables.names[i]:20,
238+ 22 ' = ',
239+ 23 environmentVariables.valueFromIndex[i]);
240+ 24 end;
241+ 25 finally
242+ 26 environmentVariables.free;
243+ 27 end;
244+ 28end.
245+```
242246
243-```delphi
247+Существует также [[Method|метод]] `TCustomApplication` для одновременного получения всех переменных среды в виде [[TStringList|`TStringList`]]. Тогда схема может выглядеть так:
248+```
244249var
245- environmentVariables: tStringList;
246-begin
247- environmentVariables := tStringList.create();
248- try
249- application.getEnvironmentList(environmentVariables);
250- …
251- finally
252- environmentVariables.free;
250+ environmentVariables: tStringList;
251+ begin
252+ environmentVariables := tStringList.create();
253+ try
254+ application.getEnvironmentList(environmentVariables);
255+ …
256+ finally
257+ environmentVariables.free;
258+ end;
253259 end;
254-end;
255260```
256261
257262---
258-*From the Free Pascal wiki, page "Command line parameters and environment variables/ru", as it stood on 2022-05-28 after a change by FTurtle, out of the wiki's dump of 2024-05-26. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*
259-Category: Code/ru
263+*From the Free Pascal wiki, page "Command line parameters and environment variables/ru", as the Internet Archive kept it on 2022-07-04. Copyright stays with the author who wrote it, according to the old wiki's [[Licensing]] page. If you have concerns about this material, [message the admin](/wiki-contact).*

Back to history