Указанная процедура bat не найдена

Обновлено: 21.11.2024

Выполнение файлов пакетных заданий в IDL

Пакетные файлы в IDL — это файлы .PRO, которые содержат ряд отдельных операторов IDL, выполняемых по порядку. Пакетные файлы не являются программами — их нельзя скомпилировать и запустить. Вместо этого IDL последовательно интерпретирует и выполняет каждую инструкцию внутри пакетного файла, как если бы вы вводили их непосредственно в командной строке IDL.

Вы можете запустить IDL в неинтерактивном режиме (пакетном режиме), введя символ @, за которым следует имя файла, содержащего исполнительные команды и операторы IDL.

Чтобы войти в пакетный режим из командной строки IDL, введите:

в приглашении IDL, где имя файла – это имя пакетного файла. (Обратите внимание, что символ @ должен быть первым символом в строке, чтобы он правильно интерпретировался.) IDL считывает команды внутри указанного файла до тех пор, пока не будет достигнут конец файла.

Примечание. Пакетные файлы можно вкладывать, помещая вызов одного пакетного файла в другой, или они могут вызывать функции или подпрограммы.

Если имя файла не включает расширение файла, IDL ищет в текущем рабочем каталоге и каталогах, указанных системной переменной !PATH, файл с именем файла в качестве его основы и расширением файла .pro. Если filename.pro не найден в данном каталоге, IDL ищет имя файла без расширения в этом каталоге. Если имя файла найдено (с расширением .PRO или без него), файл выполняется, и поиск завершается. Если имя файла включает полный путь, IDL не выполняет поиск в каталогах, указанных в !PATH.

Пакетное выполнение может быть остановлено до конца файла с возвратом управления в интерактивный режим без выхода из IDL путем вызова процедуры STOP из пакетного файла. Вызов процедуры EXIT из пакетной процедуры приводит к обычному завершению IDL.

Интерпретация отчетов о пакетах

Ярлыки недопустимы в пакетном режиме, поскольку каждый оператор компилируется и выполняется независимо.

Многострочные операторы должны быть продолжены на следующей строке с использованием символа продолжения $, поскольку IDL завершает каждый оператор интерактивного режима, не заканчивающийся на $, оператором END. Распространенной ошибкой является включение многострочного оператора блока в пакетный файл, как показано ниже:

В пакетном режиме IDL компилирует и выполняет каждую строку отдельно, что приводит к синтаксическим ошибкам в приведенном выше примере, поскольку при компиляции строки, содержащей оператор BEGIN, не найдено соответствующего ENDFOR. Приведенный выше пример можно заставить работать, написав блок операторов в виде одной строки с использованием символов $ (продолжение) и & (несколько команд в одной строке).

Пример

Пример исполнительной командной строки IDL, которая инициирует пакетное выполнение:

Эта команда заставляет файл myfile.pro использоваться для ввода операторов и команд. Если этот файл не находится в текущем каталоге, поиск также выполняется в каталогах, указанных в !PATH.

Пример содержимого пакетного файла с именем in.pro приведен ниже:

Обратите внимание, что в пакетном файле выше нет инструкции END. Задача пакетного файла in.pro состоит в том, чтобы выстроить задачи для выполнения. В данном случае мы назвали их TASK1, TASK2 и т. д., каждая из которых является IDL-программой. В этом примере для представления задач используются процедуры, но подойдет любой тип программы. Программа TASK1, которая была вызвана в пакетном файле (см. выше), выполняет одну задачу:

По умолчанию, когда выполнение командной строки завершено, оно должно либо возвращать ноль в случае успешного выполнения, либо ненулевое значение в случае сбоя выполнения. Когда пакетный сценарий возвращает ненулевое значение после сбоя выполнения, ненулевое значение будет указывать номер ошибки. Затем мы используем номер ошибки, чтобы определить ее причину и устранить ее соответствующим образом.

Ниже приведены общие коды выхода и их описание.

Недостаточно виртуальной памяти.

Это указывает на то, что в Windows закончилась память.

Уровень ошибки

Переменная окружения %ERRORLEVEL% содержит код возврата последней выполненной программы или скрипта.

По умолчанию проверка уровня ERRORLEVEL осуществляется с помощью следующего кода.

Синтаксис

Обычно используется команда EXIT /B %ERRORLEVEL% в конце пакетного файла для возврата кодов ошибок из пакетного файла.

EXIT /B в конце пакетного файла останавливает выполнение пакетного файла.

Используйте EXIT /B в конце пакетного файла, чтобы вернуть пользовательские коды возврата.

Переменная среды %ERRORLEVEL% содержит последний уровень ошибок в пакетном файле, то есть последние коды ошибок последней выполненной команды. В пакетном файле всегда рекомендуется использовать переменные среды вместо постоянных значений, поскольку одна и та же переменная расширяется до разных значений на разных компьютерах.

Давайте рассмотрим краткий пример проверки кодов ошибок из пакетного файла.

Пример

Предположим, у нас есть пакетный файл Find.cmd со следующим кодом. В коде мы четко упомянули, что если мы не найдем файл с именем lists.txt, то мы должны установить уровень ошибки на 7. Точно так же, если мы видим, что переменная userprofile не определена, мы должны установить код уровня ошибки на 9.

Предположим, у нас есть другой файл с именем App.cmd, который сначала вызывает Find.cmd. Теперь, если Find.cmd возвращает ошибку, в которой он устанавливает уровень ошибки больше 0, программа выходит из программы. В следующем пакетном файле после вызова функции поиска Find.cnd фактически проверяется, превышает ли уровень ошибки значение 0.

Вывод

В приведенной выше программе у нас могут быть следующие сценарии в качестве вывода —

Если файл c:\lists.txt не существует, в выводе консоли ничего не будет отображаться.

Если переменная userprofile не существует, в выводе консоли ничего не будет отображаться.

Если выполняются оба вышеуказанных условия, в командной строке будет отображаться строка «Успешное завершение».

Циклы

В главе о принятии решений мы видели операторы, которые выполнялись один за другим в последовательном порядке. Кроме того, реализации также могут быть выполнены в пакетном сценарии, чтобы изменить поток управления в логике программы. Затем они классифицируются в операторы управления потоком.

В пакетном скрипте нет прямого оператора while, но мы можем очень легко реализовать этот цикл, используя оператор if и метки.

Конструкция "FOR" обеспечивает возможность зацикливания пакетных файлов. Ниже приведена общая конструкция оператора for для работы со списком значений.

У оператора for также есть возможность перемещаться по диапазону значений. Ниже приведена общая форма заявления.

Ниже приведен классический оператор for, доступный в большинстве языков программирования.

Перебор аргументов командной строки

Операцию for также можно использовать для проверки аргументов командной строки. В следующем примере показано, как можно использовать оператор for для циклического перебора аргументов командной строки.

Пример

Вывод

Предположим, что приведенный выше код хранится в файле с именем Test.bat. Приведенная выше команда выдаст следующий вывод, если пакетный файл передает аргументы командной строки 1, 2 и 3 как Test.bat 1 2 3.

Инструкция break используется для изменения потока управления внутри циклов в любом языке программирования. Оператор break обычно используется в циклических конструкциях и используется для немедленного завершения самого внутреннего окружающего цикла.

Выполняет указанную команду для каждого файла в наборе файлов.

Синтаксис

Параметры

Параметр Описание
Обязательный. Представляет заменяемый параметр. Используйте один знак процента ( % ), чтобы выполнить команду for в командной строке. Используйте двойные знаки процента ( %% ) для выполнения команды for в пакетном файле. Переменные чувствительны к регистру и должны быть представлены в алфавитном порядке, например %a, %b или %c.
() Обязательный . Указывает один или несколько файлов, каталогов или текстовых строк или диапазон значений, для которых выполняется команда. Скобки обязательны.
Обязательно. Указывает команду, которую вы хотите выполнить для каждого файла, каталога или текстовой строки или диапазона значений, включенных в set.
Указывает любые параметры командной строки, которые вы хотите использовать с указанной командой.
/? Отображает справку в командной строке.< /td>

Примечания

Эту команду можно использовать в пакетном файле или непосредственно из командной строки.

К команде for применяются следующие атрибуты:

Эта команда заменяет переменную % или переменную %% каждой текстовой строкой в ​​указанном наборе до тех пор, пока указанная команда не обработает все файлы.

Имена переменных чувствительны к регистру, являются глобальными, и не более 52 могут быть активны одновременно.

Чтобы избежать путаницы с пакетными параметрами, от %0 до %9, вы можете использовать любой символ для переменной, кроме цифр от 0 до 9. Для простых пакетных файлов можно использовать один символ, например %% ф будет работать.

Вы можете использовать несколько значений для variable в сложных пакетных файлах, чтобы различать разные заменяемые переменные.

Параметр set может представлять одну группу файлов или несколько групп файлов. Вы можете использовать подстановочные знаки (* и ?) для указания набора файлов. Допустимы следующие наборы файлов:

При использовании этой команды первое значение в set заменяет переменную % или переменную %% , а затем указанная команда обрабатывает это значение.Это продолжается до тех пор, пока не будут обработаны все файлы (или группы файлов), соответствующие значению set.

In и do не являются параметрами, но вы должны использовать их с этой командой. Если вы пропустите любое из этих ключевых слов, появится сообщение об ошибке.

Если расширения команд включены (по умолчанию), поддерживаются следующие дополнительные формы for:

Только каталоги: если set содержит подстановочные знаки (* или ?), указанная команда выполняется для каждого каталога (вместо набора файлов в указанном каталоге). соответствует set. Синтаксис:

Рекурсивный: просматривает дерево каталогов, корнем которого является диск:путь, и выполняет оператор for в каждом каталоге дерева. Если после /r каталог не указан, в качестве корневого каталога используется текущий каталог. Если set представляет собой только одну точку (.), он только перечисляет дерево каталогов. Синтаксис:

Итерация и синтаксический анализ файлов. Используйте синтаксический анализ файлов для обработки выходных данных команд, строк и содержимого файлов. Используйте повторяющиеся переменные, чтобы определить содержимое или строки, которые вы хотите проверить, и используйте различные параметры ключевых слов разбора для дальнейшей модификации анализа. Используйте параметр токена parsingkeywords, чтобы указать, какие токены следует передавать в качестве повторяющихся переменных. Обратите внимание, что при использовании без параметра токена параметр /f будет проверять только первый токен.

Синтаксический анализ файла заключается в чтении вывода, строки или содержимого файла, последующем разбиении его на отдельные строки текста и анализе каждой строки на ноль или более токенов. Затем вызывается цикл for со значением итерационной переменной, установленным в токен. По умолчанию /f передает первый маркер, разделенный пробелом, из каждой строки каждого файла. Пустые строки пропускаются.

Аргумент set указывает одно или несколько имен файлов. Каждый файл открывается, читается и обрабатывается перед переходом к следующему файлу в наборе. Чтобы переопределить поведение синтаксического анализа по умолчанию, укажите ключевые слова синтаксического анализа. Это строка в кавычках, содержащая одно или несколько ключевых слов для указания различных параметров синтаксического анализа.

Если вы используете параметр usebackq, используйте один из следующих синтаксисов:

В следующей таблице перечислены ключевые слова для синтаксического анализа, которые можно использовать для ключевых слов для синтаксического анализа.

Подстановка переменных. В следующей таблице приведен необязательный синтаксис (для любой переменной I):

Переменная с модификатором Описание
%~I Расширяет %I, удаляя все окружающие кавычки.
%~fI Расширяет %I до полного имени пути.
%~dI Расширяет %I только до буквы диска.
%~pI Расширяет %I только до пути.
%~nI Расширяет %I только до имени файла.
%~xI Расширяет %I только до расширения имени файла.
%~sI Расширяет путь, чтобы содержать только короткие имена.
%~aI Расширяет %I до файловых атрибутов файла.
%~tI Расширяет %I до даты и времени файла.
%~zI Расширяет %I до размера файла.
%~$PATH:I Выполняет поиск в каталогах, перечисленных в среде PATH переменная и расширяет %I до полного имени первого найденного каталога. Если имя переменной среды не определено или файл не найден при поиске, этот модификатор заменяется пустой строкой.

В следующей таблице перечислены комбинации модификаторов, которые можно использовать для получения составных результатов.

< td>%~dp$PATH:I
Переменная с комбинированными модификаторами Описание
%~dpI Расширяет %I только до буквы диска и пути.
%~nxI Расширяет %I только до имени файла и расширения .
%~fsI Расширяет %I до полного пути только с короткими именами.
Выполняет поиск %I в каталогах, перечисленных в переменной окружения PATH, и заменяется на букву диска и путь к первому найденному.
%~ftzaI Расширяет %I до строки вывода, похожей на dir.

В приведенных выше примерах вы можете заменить %I и PATH другими допустимыми значениями. Допустимое имя переменной завершает синтаксис %~.

Используя имена переменных в верхнем регистре, такие как %I , вы можете сделать свой код более читабельным и избежать путаницы с модификаторами, которые не чувствительны к регистру.

Синтаксический анализ строки. Вы можете использовать логику анализа for /f для непосредственной строки, заключив ее либо в двойные кавычки (без usebackq), либо в одинарные кавычки (с usebackq) --например, (MyString) или ('MyString'). рассматривается как одна строка ввода из файла. При синтаксическом анализе в двойных кавычках командные символы (например, \ & | > < ^ ) обрабатываются как обычные символы.

Синтаксический анализ вывода. Вы можете использовать команду for /f для анализа вывода команды, помещая обратные кавычки между скобками. Он рассматривается как командная строка, которая передается дочернему Cmd.exe. Выходные данные сохраняются в памяти и анализируются, как если бы это был файл.

Примеры

Для использования в пакетном файле используйте следующий синтаксис:

Чтобы отобразить содержимое всех файлов в текущем каталоге с расширением .doc или .txt с помощью заменяемой переменной %f, введите:

В предыдущем примере каждый файл с расширением .doc или .txt в текущем каталоге заменяется переменной %f до тех пор, пока не будет отображено содержимое каждого файла. Чтобы использовать эту команду в пакетном файле, замените каждое вхождение %f на %%f. В противном случае переменная игнорируется и отображается сообщение об ошибке.

Чтобы проанализировать файл, игнорируя закомментированные строки, введите:

Эта команда анализирует каждую строку в файле myfile.txt. Он игнорирует строки, начинающиеся с точки с запятой, и передает вторую и третью лексему из каждой строки в тело for (лексемы разделяются запятыми или пробелами). Тело инструкции for ссылается на %i для получения второй лексемы, %j для получения третьей лексемы и %k для получения всех оставшихся лексем. Если указанные имена файлов содержат пробелы, заключите текст в кавычки (например, Имя файла). Чтобы использовать кавычки, вы должны использовать usebackq. В противном случае кавычки интерпретируются как определяющие литеральную строку для анализа.

%i явно объявлен в операторе for. %j и %k неявно объявляются с помощью tokens=. Вы можете использовать tokens= для указания до 26 токенов при условии, что это не вызовет попытки объявить переменную выше буквы z или Z.

Чтобы проанализировать вывод команды, поместив set между скобками, введите:

Вызывает одну пакетную программу из другой без остановки родительской пакетной программы. Команда call принимает метки в качестве цели вызова

Вызов не действует в командной строке, если он используется вне скрипта или пакетного файла.

Синтаксис

Параметры

Параметр Описание
[:][] Указывает местоположение и имя пакетной программы, которую вы хотите вызвать. Параметр является обязательным и должен иметь расширение .bat или .cmd.
Указывает любую информацию командной строки, требуемую пакетной программой.
: Указывает метку, на которую должен перейти элемент управления пакетной программой.
Указывает командную строку информация, которая должна быть передана новому экземпляру пакетной программы, начиная с: .
/? Отображает справку в командной строке.

Пакетные параметры

Ссылки на аргументы пакетного сценария (%0, %1, . ) перечислены в следующих таблицах.

Использование значения %* в пакетном скрипте относится ко всем аргументам (например, %1, %2, %3. ).

В качестве замены параметров пакета (%n) можно использовать следующие необязательные синтаксисы:

< /tr> < td>Заменяет %1 только на путь.
Пакетный параметр Описание
%~1 Расширяет %1 и удаляет окружающие кавычки.
%~f1 Расширяет %1 до полного пути.
%~d1 Расширяет %1 только до буквы диска.
%~p1
%~n1 Заменяет %1 только на имя файла.
%~x1 Расширяет %1 только до расширения имени файла.
%~s1 Заменяет %1 полным путем, содержащим только короткие имена.
%~a1 Заменяет %1 атрибутами файла.
%~t1 Расширяет %1 до даты и времени файла.
%~z1< /td> Расширяет %1 до размера файла.
%~$PATH:1 Выполняет поиск в каталогах, перечисленных в PATH переменная среды и заменяет %1 на полное имя первого найденного каталога. Если имя переменной среды не определено или файл не найден поиском, то этот модификатор заменяется пустой строкой.

В следующей таблице показано, как можно комбинировать модификаторы с пакетными параметрами для составных результатов:

Пакетный параметр с модификатором Описание
%~dp1 Заменяет %1 только буквой диска и путем.
%~nx1 Заменяет %1 только именем файла и расширением .
%~dp$PATH:1 Выполняет поиск %1 в каталогах, перечисленных в переменной среды PATH, а затем расширяется до буквы диска и путь к первому найденному каталогу.
%~ftza1 Расширяет %1 для отображения вывода, аналогичного команде dir.

В приведенных выше примерах %1 и PATH можно заменить другими допустимыми значениями. Синтаксис %~ завершается допустимым номером аргумента. Модификаторы %~ нельзя использовать с %*.

Примечания

Использование пакетных параметров:

Пакетные параметры могут содержать любую информацию, которую вы можете передать пакетной программе, включая параметры командной строки, имена файлов, пакетные параметры с %0 по %9 и переменные (например, %baud%).

Использование параметра:

Используя вызов с параметром, вы создаете новый контекст пакетного файла и передаете управление оператору после указанной метки. При первом обнаружении конца пакетного файла (то есть после перехода к метке) управление возвращается оператору, следующему за оператором вызова. При втором обнаружении конца пакетного файла выполняется выход из пакетного сценария.

Использование каналов и символов перенаправления:

Не используйте вертикальную черту (|) или символы перенаправления (< или >) при вызове.

Выполнение рекурсивного вызова

Вы можете создать пакетную программу, которая вызывает сама себя. Однако вы должны указать условие выхода. В противном случае родительская и дочерняя пакетные программы могут бесконечно зацикливаться.

Работа с расширениями команд

Если включены расширения команд, вызов принимается в качестве цели вызова. Правильный синтаксис call :

Примеры

Чтобы запустить программу checknew.bat из другой пакетной программы, введите следующую команду в родительской пакетной программе:

Если родительская пакетная программа принимает два пакетных параметра и вы хотите, чтобы она передала эти параметры в checknew.bat, введите в родительской пакетной программе следующую команду:

Вызывать одну пакетную программу из другой или вызывать подпрограмму.

В справке Microsoft для команды CALL указано: "Вызывает одну пакетную программу из другой, не останавливая родительскую пакетную программу". делает PAUSE во время работы второго скрипта.

Вызвать второй пакетный файл

Команда CALL запустит новый контекст пакетного файла вместе со всеми указанными параметрами. Когда будет достигнут конец второго пакетного файла (или если используется EXIT), управление вернется сразу после начального оператора CALL.

Аргументы могут быть переданы либо в виде простой строки, либо с использованием переменной:

CALL MyScript.cmd "1234"
CALL OtherScript.cmd %_MyVariable%

Пример

::-------- --start main.cmd-----------
@Echo off
CALL function.cmd 10 first
Echo %_description% - %_number%

CALL function.cmd 15 секунд
Echo %_description% - %_number%
::----------end main.cmd--------- ----

::----------start function.cmd---------
@Echo off
:: Добавить 25 к %1
SET /a _number=%1 + 25
:: Store %2
SET _description=[%2]
::----------end function.cmd- ----------

Во многих случаях вы также захотите использовать SETLOCAL и ENDLOCAL, чтобы полностью разделить переменные в разных пакетных файлах, это позволит избежать любых потенциальных проблем, если два скрипта используют с тем же именем переменной.

Если вы выполняете второй пакетный файл без использования CALL, вы можете столкнуться с некоторым ошибочным поведением: если оба пакетных файла содержат метку с тем же именем, а у вас есть ранее использовали CALL для перехода к этой метке в первом сценарии, вы обнаружите, что выполнение второго сценария начинается с той же метки. Даже если второй этикетки не существует, это все равно вызовет ошибку "не удается найти метку партии". Этой ошибки можно избежать, всегда используя CALL.

ВЫЗОВ подпрограммы (:метка)

Команда CALL передаст управление оператору после указанной метки вместе с любыми указанными параметрами.
Чтобы выйти из подпрограммы, укажите GOTO:e, чтобы передать управление в конец текущей подпрограммы.

Метка определяется одним двоеточием, за которым следует имя:

:myShinyLabel

Если метка помещена в скобки, за меткой должна следовать хотя бы одна допустимая команда, даже просто команда ECHO или REM.
Максимальная длина метки — 127 символов, без пробелов.

Это основа функции пакетного файла.

CALL :sub_display 123
CALL :sub_display 456
ECHO All Done
GOTO :eof

:sub_display
ECHO Результат: %1
EXIT /B

В конце подпрограммы EXIT /B вернется в позицию, где вы использовали CALL
(для этого также можно использовать GOTO :eof)

Позвонить и при желании продолжить

В некоторых случаях может потребоваться вызвать второй пакетный файл (или подпрограмму) и продолжить работу только в случае успеха.

CALL SecondScript.cmd || goto :eof

Это будет goto:eof, если SecondScript.cmd возвращает уровень ошибки больше нуля, вы можете установить уровень ошибки, используя Exit /b 1

Передача по ссылке

В дополнение к передаче числовых или строковых значений в командной строке также можно передать имя переменной, а затем использовать эту переменную для передачи данных между сценариями или подпрограммами. Передача по ссылке — это немного более продвинутый метод, но он может быть необходим, если строка содержит символы, являющиеся разделителями CMD или кавычками. В противном случае передача строки типа Начало и середина:"и & Конец может что-то сломать. .

Ошибки при использовании CALL

Перенаправление через канал ' | ' не всегда работает так, как ожидалось.
Это сработает:
CALL :function >file.txt
Это не сработает:
CALL :function | Подробнее
Более подробную информацию можно найти в этом вопросе SO: Почему отложенное расширение терпит неудачу, когда находится внутри переданного блока кода?

Если команда CALL содержит символ вставки в строке "test^ing" в кавычках, символы вставки будут удвоены.

Расширенное использование: вызов внутренних команд

CALL также можно использовать для запуска любой внутренней команды (SET, ECHO и т. д.), за исключением FOR и IF.
CALL расширит все переменные, переданные в той же строке. CALL REM работает только частично: операторы перенаправления, операторы условного выполнения и скобки не будут отмечены.

Это недокументированное поведение, фактически всякий раз, когда CALL запускается без префикса :, он всегда будет искать на диске пакет. файл/исполняемый файл, вызываемый command перед выполнением внутренней команды. Эффект этого дополнительного доступа к диску заключается в том, что CALL SET работает значительно медленнее, чем CALL, поэтому следует избегать его использования в циклах или с большим количеством переменных.

Пример

В строке, выделенной жирным шрифтом, символы '%' утроены, CALL расширит это до: SET _result=frodo

Каждый CALL выполняет одну замену переменных. (Вы также можете использовать CALL CALL. для нескольких замен)

Во многих случаях DelayedExpansion является лучшим/быстрым методом:

Уровни ошибок

Если вы запустите CALL SET, это сбросит ERRORLEVEL = 0, даже если обычно SET . не сможет сбросить ERRORLEVEL
Если вы ВЫЗЫВАЕТЕ подпрограмму, ERRORLEVEL останется неизмененным
Если вы ВЫЗОВЕТЕ подпрограмму с несуществующей меткой, ERRORLEVEL будет установлен на 1
(call) установит ERRORLEVEL на 0.
(call) установит ERRORLEVEL на 1.

Если вы ВЫЗЫВАЕТЕ исполняемый файл или утилиту набора ресурсов, убедитесь, что она доступна на машине, на которой будет выполняться пакет, проверьте ее существование с помощью команды IF и выдайте ошибку, если она отсутствует.

CALL — это внутренняя команда (внутренне она тесно связана с GOTO).
Если расширения команд отключены, команда CALL не будет принимать метки пакетов.

«Моя мать никогда не видела иронии в том, чтобы называть меня сукиным сыном» ~ Джек Николсон

Связанные команды:

Как: Функции - Как упаковать блоки кода.
CMD — может использоваться для вызова следующего пакета и ВСЕГДА возврата, даже если возникают ошибки.
GOTO — переход к метке или GOTO :eof
START — запуск отдельного окна для запуска указанной программы или команды.
Эквивалентная команда bash (Linux): . (источник) — Запустить командный сценарий в текущей оболочке, встроенный — Запустить встроенную оболочку.

Читайте также: