Cmd ввод переменной. Переменные среды

Переменные устанавливают среду Cmd.exe. Они прописывают не только особенности поведения командной оболочки, но и самой ОС. Переменные следует подразделить на два вида, каждый из которых обладает уникальными свойствами: системные и локальные. Первый вид позволяет задать поведение глобальной среды ОС в процессе осуществления работы. Локальные переменные устанавливают деятельность среды исключительно в определенном экземпляре Cmd.exe. Это требуется отметить в качестве ключевого отличия.

Его говорить о системных переменных, то он предварительно заложены в ОС и могут быть использованы всеми приложениями. Чтобы внести в них изменения, необходимо обладать администраторскими правами доступа. Самым распространенным местом применения является обеспечение задачи запуска системы. Когда подобное мероприятие осуществлено для конкретного пользователя, можно говорить о возможности использования локальных переменных.

Ниже будет представлен перечень существующих классов переменных на основании важности их приоритета (по убыванию):

  • Встроенные системные. Их необходимо назвать наиболее серьёзными, что предусматривает особое внимание в процессе работы.
  • Переменные системного вида, относящиеся к HKEY_LOCAL_MACHINE.
  • Переменные локального вида, относящиеся к HKEY_CURRENT_USER.
  • Полный перечень переменных и сред, находящихся в документе Autoexec.bat.
  • Полный перечень переменных и сред, находящихся в сценарии начала работы системы. В определенных ситуациях его может и не быть.
  • Интерактивно применяемые переменные для прописанного сценария или пакетного документа.

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

Локальные переменные

Название Информация

%ALLUSERSPROFILE%

Предоставляет сведения о том, где именно находится профиль All Users

Предоставляет место нахождения программ, устанавливаемое по умолчанию

Позволяет получить путь до используемой папки

Предоставляет строчку команд, с применением которой произведена работа текущего экземпляра Cmd.exe

Предоставляет название контроллера домена, осуществляющего проверку подлинности заданной сессии

Позволяет выполнить предоставление параметров КА для действующего интерпретатора. Для получения доступа, необходимо воспользоваться Cmd.exe

Предоставляет название домена, который обладает перечнем учетных записей юзеров

Предоставляет имя юзера, осуществившего вход в систему

Осуществляет возврат положения аккаунта для текущего юзера

Системные переменные

Позволяет предоставить номер версии действующих расширений обработчика команд

Предоставляет название устройства, на котором производится работа

Осуществляет выдачу пути к исполняемой командной оболочке

Предоставляет действующие сведения. Следует отметить тот факт, что предусматривается применение формата, аналогичного date /t. Все сведения об указанной команде можно получить непосредственно из соответствующего раздела на сайте

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

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

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

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

%NUMBER_OF_PROCESSORS%

Определяет количество процессоров, которыми обладает конкретное устройство

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

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

Предоставляет перечень расширений документов, учитываемых ОС в качестве исполняемых

%PROCESSOR_ARCHITECTURE%

Используется в тех случаях, когда необходимо получить архитектуру определенного процессора

%PROCESSOR_IDENTFIER%

Предоставляет короткую информацию о процессоре

%PROCESSOR_LEVEL%

Предоставляет данные о номере модификации процессора

Предоставляет любое целое число в диапазоне 0-32767 включительно

Выполняет предоставление названия диска, на который записан корневой каталог ОС Windows XP

Предоставляет место расположения системного каталога ОС

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

Предоставляет сведения о времени на данный момент. Применяется аналогичный time /t формат отображения.

Позволяет осуществить возврат каталога ОС

Задание переменных среды

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

Для выдачи конкретной переменной, предусматривается написание в КС:

set название_переменной

Добавление ещё одной переменной осуществляется за счет прописывания:

set variablename=значение

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

set название_переменной=

Системой задаётся применение большинства существующих символов для указания в роли значений. Сюда же можно отнести и проделы. Чтобы применять определённые символы, предварительно требуется ввести (^) или осуществить заключение в кавычки. Если этого не сделать, возникнет вероятность неправильного исполнения или ошибки. Необходимо рассмотреть несколько простых примеров. Допустим, нужно создать переменную new&name. Для осуществления поставленной задачи в КС происходит ввод:

set varname=new^&name

Можете попытаться не использовать спецсимвол (^), но это будет невозможно осуществить. Причина заключается в постоянной выдаче одной и той же ошибки.

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

Подстановка в переменные среды

Существует способ выполнить подстановку определенных значений в переменные среды непосредственно из КС или сценария. Для проведения поставленной задачи рекомендуется использовать помещение в символы процента. Это выглядит следующим образом:

%название_переменной%

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

Среда командной оболочки Cmd.exe определяется переменными, задающими поведение командной оболочки и операционной системы. Имеется возможность определить поведение среды командной оболочки или среды всей операционной системы с помощью двух типов переменных среды: системных и локальных. Системные переменные среды определяют поведение глобальной среды операционной системы. Локальные переменные среды определяют поведение среды в данном экземпляре Cmd.exe.

Системные переменные среды заданы заранее в операционной системе и доступны для всех процессов Windows XP. Только пользователи с привилегиями администратора могут изменять эти переменные. Эти переменные наиболее часто используются в сценариях входа в систему.

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

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

  1. Встроенные системные переменные
  2. Системные переменные куста HKEY_LOCAL_MACHINE
  3. Локальные переменные куста HKEY_CURRENT_USER
  4. Все переменные среды и пути указаны в файле Autoexec.bat.
  5. Все переменные среды и пути указаны в сценарии входа в систему (если он имеется).
  6. Переменные, используемые интерактивно в сценарии или пакетном файле

В командной оболочке каждый экземпляр Cmd.exe наследует среду своего родительского приложения. Поэтому можно изменять переменные в новой среде Cmd.exe, что не повлияет на среду родительского приложения.

В следующей таблице приведен список системных и локальных переменных среды для Windows XP.

Переменная

Описание

%ALLUSERSPROFILE%

Локальная

Возвращает размещение профиля «All Users».

Локальная

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

Локальная

Возвращает путь к текущей папке.

Локальная

Возвращает строку команд, с помощью которой был запущен данный экземпляр Cmd.exe.

Системная

Возвращает номер версии текущих расширений обработчика команд.

Системная

Возвращает имя компьютера.

Системная

Возвращает путь к исполняемой командной оболочке.

Системная

Возвращает текущие данные. Использует тот же формат, что и команда date /t . Создается командой Cmd.exe.

Системная

Возвращает код ошибки последней использовавшейся команды. Значение, не равное нуля, обычно указывает на наличие ошибки.

Системная

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

Системная

Возвращает полный путь к основному каталогу пользователя. Задается на основании расположения основного каталога. Основной каталог пользователя указывается в оснастке «Локальные пользователи и группы».

Системная

Возвращает сетевой путь к общему основному каталогу пользователя. Задается на основании расположения основного каталога. Основной каталог пользователя указывается в оснастке «Локальные пользователи и группы».

Локальная

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

%NUMBER_OF_PROCESSORS%

Системная

Задает количество процессоров, установленных на компьютере.

Системная

Возвращает имя операционной системы. При использовании Windows 2000 имя операционной системы отображается как Windows_NT.

Системная

Указывает путь поиска для исполняемых файлов.

Системная

Возвращает список расширений файлов, которые рассматриваются операционной системой как исполняемые.

%PROCESSOR_ARCHITECTURE%

Системная

Возвращает архитектуру процессора. Значения: x86, IA64.

%PROCESSOR_IDENTFIER%

Системная

Возвращает описание процессора.

%PROCESSOR_LEVEL%

Системная

Возвращает номер модели процессора, установленного на компьютере.

%PROCESSOR_REVISION%

Системная

Возвращает номер модификации процессора.

Локальная

Возвращает параметры командной строки для текущего интерпретатора. Создается командой Cmd.exe.

Системная

Возвращает произвольное десятичное число от 0 до 32767. Создается командой Cmd.exe.

Системная

Возвращает имя диска, содержащего корневой каталог Windows XP (т. е. системный каталог).

Системная

Возвращает размещение системного каталога Windows XP.

Системная и пользовательская

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

Системная

Возвращает текущее время. Использует тот же формат, что и команда time /t . Создается командой Cmd.exe.

Локальная

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

Локальная

Возвращает имя пользователя, выполнившего вход в систему.

Локальная

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

Системная

Возвращает размещение каталога операционной системы.

(командных) файлах, позволяют обходиться без указания абсолютных путей к директориям. Например, если нам заранее неизвестна буква системного диска, мы всегда можем использовать переменную %systemdrive% , возвращающую букву диска, на котором установлена ОС. Также, переменные применяются для оптимизации кода - многократно повторяющемуся параметру (например, разделе реестра) можно назначить короткую переменную и использовать ее. В данной статье подробно рассматриваются различные приемы работы с переменными, а также способы изменения и создания новых переменных. Теперь обо всем по порядку.

Классификация переменных среды
Справка Windows различает два типа переменных среды: системные и локальные. Системные переменные возвращают одинаковые значения для всех пользователей. К примеру, %systemdrive% - буква системного диска, и она для всех пользователей одинакова. А вот значения, возвращаемые локальными переменными, варьируются в зависимости от вошедшего в систему пользователя. Например, %userprofile% может возвращать C:\Documents and Settings\ТекущийПользователь, где ТекущийПользователь - название учетной записи пользователя.

Узнать, какие переменные среды в операционной системе вам доступны и какие значения в данный момент им присвоены, вам поможет команда SET , запущенная из командной строки без параметров (Пуск – Выполнить – cmd – set ). В рамках данной статьи нас интересуют переменные, обозначающие путь к различным папкам (каталогам). Чуть подробнее о некоторых из них ниже:

Переменная|Тип|Описание
%SYSTEMDRIVE%|Системная|Возвращает имя диска, содержащего корневой каталог операционной системы Windows XP /2003 (т. е. системный корневой каталог).
%SYSTEMROOT%, %WINDIR%|Системная|Возвращает размещение корневого каталога операционной системы Windows /2003
%PATH%|Системная|Указывает путь поиска для исполняемых файлов.
%PROGRAMFILES%|Системная|Указывает путь к каталогу установки программ (Program Files)
%COMMONPROGRAMFILES%|Системная|Указывает путь к общему каталогу программ (Program Files\Common Files).
%TEMP% и %TMP%|Системная и пользовательская|Возвращает временные папки, по умолчанию используемые приложениями, которые доступны пользователям, выполнившим вход в систему. Некоторые приложения требуют переменную TEMP, другие - переменную TMP.
%USERPROFILE%|Локальная|Возвращает размещение профиля для текущего пользователя.
%ALLUSERSPROFILE%|Локальная|Возвращает размещение профиля "All Users".
%CD%|Локальная|Возвращает путь к текущей папке.
%APPDATA%|Локальная|Возвращает используемое по умолчанию размещение данных приложений.

Использование переменных в пакетных файлах
Начнем с простенького примера:

CMD/BATCH:

DEL /F /Q "%AllUsersProfile%\Главное меню\Активация Windows.lnk" DEL /F /Q "%AllUsersProfile%\Главное меню\WindowsUpdate.lnk" DEL /F /Q "%systemroot%\system32\*.scr"

В этом примере я удаляю вышеуказанные ярлыки, которые маячат перед глазами в меню Пуск, используя переменную %AllUsersProfile% , а также все файлы с расширением SCR из директории Windows\system32, используя переменную %SystemRoot% . Вместо DEL /F /Q, как вы понимаете, может быть все что угодно: от команды копирования COPY до команды запуска установки нужного нам приложения со всеми параметрами командной строки, если это потребуется.

Во всех командах я специально использовал "кавычки" – это не случайно. Весь путь, включая переменные, надо заключать в кавычки, если вы используете пути, содержащие пробелы. Даже если сама переменная кавычек не содержит, после ее разбора системой в пути могут появится пробелы (например, %ProgramFiles% в C:\Program Files). В любом случае кавычки лучше использовать – это является хорошим тоном оформления командных файлов.

Как задать свои переменные

Разобранный выше пример использовал уже существующие переменные среды. И вы, вероятно, обратили внимание на символы процентов, окружающие названия переменных. Эти символы нужны для того, чтобы разрешить подстановку значений переменной в командной строке или в пакетном файле. Символы процентов указывают на то, что Cmd.exe должна обратиться к значениям переменных, а не делать посимвольное сравнение. Ниже вы увидите, как это работает. Задать свои переменные в пакетном файле можно командой SET.

Команда SET
Вы можете задать в командном файле свои переменные при помощи все той же команды SET.

Чтобы добавить переменную, введите в командной строке:

Код:

Set имя_переменной=значение

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

Код:

Set имя_переменной

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

Код:

Set имя_переменной=

Например,

Код:

SET mydir=D:\Files\Work

задает переменную mydir , которая будет возвращать путь к указанной папке. Подробнее о команде вы можете прочитать из set /? .

Важное примечание: переменные, задаваемые командой set, действуют лишь на протяжении командной сессии (см. ниже), в которой они были заданы.

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

Пример назначения переменных в файле RunOnceEx.cmd , импортирующем параметры в реестр

CMD/BATCH:

@echo off SET KEY=HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx SET i=100 REG ADD %KEY% /V TITLE /D "Installing Applications" /f REG ADD %KEY%\%i% /VE /D "WinRar 3.51" /f REG ADD %KEY%\%i% /V 1 /D "%systemdrive%\install\Software\WinRar.exe /s" /f REG ADD %KEY%\%i% /V 2 /D "REGEDIT /S %systemdrive%\install\Software\rar_set.reg /s" /f SET /A i+=1

В данном скрипте командой SET задаются две переменных - %i% и %KEY% . Обратите внимание, что задаются они без символов процентов, а вот для обращения к ним %% уже нужны. Переменная %KEY% служит для упрощения и оптимизации кода. Она остается неизменной на протяжении текущей командной сессии, что избавляет от необходимости каждый раз включать в код раздел реестра. Каждый раз, когда в коде встречается %KEY% , будет происходить ее замена на HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx. А вот %i% служит для последовательной нумерации разделов реестра. При начальном значении 100 переменная увеличивается на единицу при помощи команды SET /A i+=1 после каждого блока команд, что дает последовательность 100, 101, 102 и т.д. Таким образом, строка

Код:

REG ADD %KEY%\%i% /V 1 /D "%systemdrive%\install\Software\WinRar.exe /s" /f

на самом деле отработает так

Код:

REG ADD HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion\RunOnceEx\100 /V 1 /D "C:\install\Software\WinRar.exe /s" /f

Обратите внимание, что во фрагменте файла также используется системная переменная %systemdrive% , которая соответствует букве системного диска.

Пример назначения переменных в командном файле, устанавливающем приложение с CD:

Код:

For %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist %%i:\WIN51 set CDROM=%%i: start /wait “%CDROM%\INSTALL\DVDTools\NBRom\Nero.exe”

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

Изменение переменных среды и добавление собственных переменных

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

Утилита setenv
Утилита работает из командной строки (сайт , загрузить). Работать с утилитой очень просто (setenv /?).


Пользовательские настройки|setenv -u имя_переменной значение
Системные настройки|setenv -m имя_переменной значение
Настройки Default User|setenv -d имя_переменной значение
Настройки текущего пользовательского сеанса|setenv -v имя_переменной значение

Допустим, если нужно получить переменную %temp% еще на стадии установки, то можно это проделать из cmdlines.txt , например:

Код:

:: Creating and Setting Temp folder... md %systemdrive%\Temp setenv -u Temp %systemdrive%\Temp setenv -u Tmp %systemdrive%\Temp

Утилита удобна тем, что после задания переменной ею можно пользоваться сразу. Ну почти сразу - в следующей командной сессии. Чтобы использовать ее в текущей сессии, можно задействовать старую знакомую команду set:

Код:

:: Creating #EgOrus# var set EgOrus=D:\EgOrus setenv -u EgOrus %EgOrus%

Импорт параметров в реестр
Если же пойти путем внесения изменений в реестр после первого входа в систему, то переменные начнут "работать" только после перезагрузки или завершения пользовательского сеанса. Конечно, в процессе автоустановки можно импортировать желаемые параметры на Т-12 (см. статью Твики реестра) и обойти данную проблему. Если же вы не собираетесь использовать назначенную переменную в текущем пользовательском сеансе, то импорт в реестр вас тоже может устроить. Процесс импорта REG-файлов описывать повторно не буду, а рассмотрю команду REG ADD на конкретном примере.

Допустим, вы заинтересованы иметь в системе переменную %CDROM% на постоянной основе и установить ее в процессе установки приложений с CD. Следуя коду, приведенному выше, нужно после определения переменной назначить ее системной.

CMD/BATCH:

For %%i in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do if exist %%i:\WIN51 set CDROM=%%i: REG ADD "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager\Environment" /v cdrom /d %CDROM% /f

После нахождения файла WIN51 диску, на котором он был найден, присваивается локальная переменная %CDROM% , которая тут же и назначается в виде постоянной системной переменной посредством импорта в реестр. Этот метод предложил в одной из тем на конференции Oszone Sanja Alone . Заодно вы узнали. где в реестре хранятся настройки системных переменных. Настройки пользовательских переменных хранятся в HKCU\Environment. Пути, возвращаемые переменными %PROGRAMFILES% и %COMMONPROGRAMFILES%, можно посмотреть в параметрах ProgramFilesDir и CommonFilesDir в HKLM\SOFTWARE\Microsoft\Windows\CurrentVersion, но менять их там не следует. Каталоги установки программ (отличные от %SystemDrive%\Program Files) нужно конфигурировать через файл ответов .

Резюме
Командная оболочка Windows (cmd.exe) - это весьма мощный инструмент работы с системой. При помощи пакетных файлов можно автоматизировать изрядное количество задач, и именно поэтому они часто используются для автоматической установки Windows. Умелое использование переменных в пакетных файлах позволяет решать широкий спектр вопросов. Работа с командной оболочкой становится более эффективной и одновременно упрощается код пакетных файлов. Другие примеры использования переменных вы можете найти на страницах сайта или форума. Все примеры, использованные в этой статье, взяты из скриптов участников форума OsZone.ru, за что им большое спасибо.

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

cmd.exe - интерпретатор команд, который командная оболочка ОС Windows использует для перевода введенной команды в формат, понятный системе.

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

Пользовательский сеанс (пользовательская сессия) начинается с момента входа пользователя в систему (log on) и завершается при выходе (log off).

Иногда требуется сформировать переменную даты и времени в cmd / bat скриптах windows так, как нужно нам, а не так, как нам отдаёт операционная система.

Например чтоб добавить эти данные в log файл, для фиксации времени или даты события, создать файл с именем, в котором должны фигурировать данные даты или времени (день, месяц, год, час, минуты, скунды, миллисекунды.) Да мало-ли, какие у нас задачи... Подключаем нашу фантазию :)

В следующем примере мы видим разбиение переменных по нужным нам шаблонам.

h- час 2 знака (то есть час будет выдаваться в следующем виде - 01, 02, ..., 09, ... , 12, ... 24)

m - минуты 2 знака

s - секунжы 2 знака

ms - миллисекунды 2 знака, почему-то от 0 до 99

dd - день 2 знака

mm - месяц 2 знака

yyyy - год 4 знака

Пример использования переменных %DATE% и %TIME% в скриптах cmd / bat Windows:

@echo off
set h=%TIME:~0,2%
set m=%TIME:~3,2%
set s=%TIME:~6,2%
set ms=%TIME:~9,2%
set curtime=%h%:%m%:%s%:%ms%
set dd=%DATE:~0,2%
set mm=%DATE:~3,2%
set yyyy=%DATE:~6,4%
set curdate=%dd%-%mm%-%yyyy%
set curdatetime=%curdate% %curtime%

echo Текущее время - %curdatetime%

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

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

Первая цифра после:~ - это номер символа, с которого мы начинаем брать значение, вторая цифра это сколько символов захватывать.

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

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

Имя
Описание
ALLUSERSPROFILE Возвращает размещение профиля «All Users».
APPDATA Возвращает используемое по умолчанию размещение данных приложений.
CD Указывает путь текущей папки. Идентична команде CD без аргументов.
CMDCMDLINE точная команда использованная для запуска текущего cmd.exe.
CMDEXTVERSION версия текущего Command Processor Extensions.
CommonProgramFiles Расположение каталога "Common Files" (обычно %ProgramFiles%\Common Files)
COMPUTERNAME имя компьютера
COMSPEC путь до исполняемого файла shell
DATE Возвращает текущую дату. Использует тот же формат, что и команда date /t. Создается командой Cmd.exe.
ERRORLEVEL Возвращает код ошибки последней использовавшейся команды. Значение, не равное нулю, обычно указывает на наличие ошибки.
HOMEDRIVE Возвращает имя диска локальной рабочей станции, связанного с основным каталогом пользователя. Задается на основании расположения основного каталога. Основной каталог пользователя указывается в оснастке «Локальные пользователи и группы».
HOMEPATH Возвращает полный путь к основному каталогу пользователя. Задается на основании расположения основного каталога. Основной каталог пользователя указывается в оснастке «Локальные пользователи и группы».
HOMESHARE Возвращает сетевой путь к общему основному каталогу пользователя. Задается на основании расположения основного каталога. Основной каталог пользователя указывается в оснастке «Локальные пользователи и группы».
LOGONSERVER имя контроллера домена, использовавшегося для авторизации текущего пользователя
NUMBER_OF_PROCESSORS количество процессоров в системе
OS название операционной системы. Windows XP и Windows 2000 отображаются как Windows_NT.
PATH Указывает путь поиска для исполняемых файлов.
PATHEXT Возвращает список расширений файлов, которые рассматриваются операционной системой как исполняемые.
PROCESSOR_ARCHITECTURE архитектура процессора
PROCESSOR_IDENTIFIER описание процессора
PROCESSOR_LEVEL номер модели процессора
PROCESSOR_REVISION ревизия процессора
PROGRAMFILES путь к папке Program Files
PROMPT Возвращает параметры командной строки для текущего интерпретатора. Создается командой Cmd.exe.
RANDOM случайное десятичное число от 0 до 32767. Генерируется Cmd.exe
SESSIONNAME Тип сессии. Значение по умолчанию "Console"
SYSTEMDRIVE диск на котором расположена корневая папка Windows
SYSTEMROOT путь к корневой папке Windows
TEMP or TMP Возвращает временные папки, по умолчанию используемые приложениями, которые доступны пользователям, выполнившим вход в систему. Некоторые приложения требуют переменную TEMP, другие — переменную TMP. Потенциально TEMP и TMP могут указывать на разные каталоги, но обычно - совпадают.
TIME Возвращает текущее время. Использует тот же формат, что и команда time /t. Создается командой Cmd.exe.
USERDOMAIN имя домена, которому принадлежит текущий пользователь
USERNAME имя текущего пользователя
USERPROFILE путь к профайлу текущего пользователя
WINDIR директория в которую установлена Windows

В этой статье:

  • Определение переменных
  • Переменные командной строки (параметры вызова bat-файла)
  • Оператор условия IF
  • Функции
  • Использование возвращаемых значений (обработка кода завершения программы)

Определение переменных

SET <Имяпеременной>=<Значениепеременной>

Оператор SET представляет собой расширение возможностей работы с параметрами в операционной системе. Он задает переменную, значение которой подставляется вместо ее имени при любом использовании этого имени между знаками процента. Так, если задано (переменная, которую требуют многие игры, использующие звуковую карту компьютера):

SET BLASTER=A220 I5 D1 P330

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

ECHO %BLASTER%

на экран будет выведено "A220 I5 D1 P330". Переменные, определенные с помощью оператора SET называются переменными окружения среды (environment) и являются видимыми после выполнения до перезапуска DOS (если не изменять ее вручную в памяти). То есть, ее можно использовать из одного пакетного файла или программы после задания в другом. Наиболее известной является переменная PATH, представляющая собой набор путей для быстрого поиска файлов. Она задается в файле autoexec.bat.

Переменные командной строки
(параметры вызова bat-файла)

%<цифра 0-9>

Как и в любом языке, в языке пакетных файлов возможно использование переменных, полученных в качестве параметров bat-файла.

Всего может быть 10 одновременно существующих независимых переменных. Для написания сложных программ это довольно мало, хотя для обычной работы часто хватает и 3-4. Значение переменной равно значению соответствующего параметра из командной строки. Переменная %0 будет содержать имя.bat-файла и, если вы указали, путь к нему. То есть, если вы запустили файл abc.bat со следующими параметрами:

abc.bat a bc def

то переменная %0 будет содержать значение abc.bat , %1 будет содержать значение a, %2 будет содержать bc , а %3 - def . Это свойство широко используется для создания универсальных пакетных файлов при работе с повторяющимися операциями.

Чтобы получить более чем 10 переменных из командной строки, можно воспользоваться командой SHIFT .

Команда SHIFT позволяет использовать число параметров командной строки далее 10. Однако, при этом теряются соответственно более ранние параметры. Иными словами, команда SHIFT сдвигает все значения переменных на один шаг влево. То есть, переменная %0 будет содержать значение, содержавшееся до этого в переменной %1 , а переменная %1 - значение переменной %2 до сдвига. Однако, данная операция является необратимой, то есть, невозможно сдвинуть переменные обратно.

Оператор условия IF

К счастью, командный интерпретатор cmd.exe современных ОС Windows 2000 и старше поддерживает блоки команд в конструкциях ветвления, что устраняет необходимость применения IF с метками. Блоки команд заключаются в круглые скобки. Выглядит это так (имитируя C/C++ indentation style):

if condition (

Rem Команды ветки ‘then’

Rem ...

) else (

Rem Команды ветки ‘else’

Rem ...

Конкретный пример использования:

@echo off

set BUILDMODE=%1

if "%BUILDMODE%" == "" (

Echo FAIL: Аргумент является обязательным ^(--debug, --release^)

Exit /b 1

rem Удаляем из аргумента все дефисы для упрощения обработки

set BUILDMODE=%BUILDMODE:-=%

if "%BUILDMODE%" == "debug" (

Set CCFLAGS=/Od /MDd /Z7

) else (

Set CCFLAGS=/O2 /MD

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

if "%BUILDMODE%" == "debug" (

Echo INFO: Устанавливаем debug-режим окружения

Set OPTFLAGS=/Od

Set CCFLAGS=%OPTFLAGS% /MDd /Z7

) else (

Echo INFO: Устанавливаем release-режим окружения

Set OPTFLAGS=/O2

Set CCFLAGS=%OPTFLAGS% /MD

Загвоздка в том, что в обоих блоках подстановка переменной OPTFLAGS произойдет до того, как она будет изменена в процессе выполнения этого блока. Соответственно, в CCFLAGS будет подставлено то значение, которое OPTFLAGS имела на момент начала выполнения данного if-блока.

Решается эта проблема путем использования отложенного раскрытия переменных. Переменные, заключенные в !…! вместо %…% , будут раскрыты в их значения только в момент непосредственного использования. Данный режим по умолчанию отключен. Включить его можно либо использованием ключа /V:ON при вызове cmd.exe , либо использованием команды:

в тексте самого bat-файла. Второй способ мне представляется более удобным – не очень здорово требовать от кого-то запуска твоего сценария с определенным параметром.

С учетом сказанного предыдущий «неправильный» пример может быть исправлен так:

setlocal enabledelayedexpansion

if "%BUILDMODE%" == "debug" (

Echo INFO: Setting up debug mode environment

Set OPTFLAGS=/Od

Set CCFLAGS=!OPTFLAGS! /MDd /Z7

) else (

Echo INFO: Setting up release mode environment

Set OPTFLAGS=/O2

Set CCFLAGS=!OPTFLAGS! /MD

Вот теперь это почти полноценный if-then-else блок. Почти, потому что если в одной из команд echo у вас встретится закрывающая круглая скобка, то вам необходимо заэкранировать ее символом ^, иначе синтаксический анализатор путается…

Но в любом случае, это гораздо лучше безумного количества меток и переходов.

Функции

А можно создать в bat-файле функцию? Да, можно. Более того, иногда даже нужно. Правда, функциями это можно назвать условно.

Есть особый синтаксис команды call , который позволяет перейти на метку в этом же bat-файле с запоминанием места, откуда был произведен этот вызов:

call:метка аргументы

Возврат из функции производится командой:

exit /b [опциональный код возврата]

Ключ /b здесь очень важен: без него будет произведен выход не из функции, а из сценария вообще.

За подробностями наберите в командной строке:

call /?

exit /?

Что интересно, команда call с таким синтаксисом поддерживает рекурсивные вызовы с автоматическим созданием нового фрейма для переменных аргументов %0-%9. Иногда это может быть полезным. Вот классический пример рекурсивного подсчета факториала на командном языке:

@echo off

call:factorial %1

echo %RESULT%

exit

rem Функция для подсчета значения факториала

rem Вход:

rem %1 Число, для которого необходимо подсчитать факториал

rem Выход:

rem %RESULT% Значение факториала

:factorial

if %1 == 0 (

Set RESULT=1

Exit /b

if %1 == 1 (

Set RESULT=1

Exit /b

set /a PARAM=%1 - 1

call:factorial %PARAM%

set /a RESULT=%1 * %RESULT%

exit /b

Пример работы:

> factorial.bat 10

3628800

Использование возвращаемых значений
(обработка кода завершения программы)

Любая программа при завершении своей работы возвращает операционной системе код своего завершения. Принято при успешном завершении возвращать ноль, иначе - код ошибки. Иногда, или, вернее, часто, программа "сознательно" возвращает ненулевое значение для того, чтобы в пакетном файле можно было "узнать" некоторые подробности ее работы. Например, программа возвращает код нажатой клавиши, а.bat-файл по нему выполняет различные действия.

Каким же образом пакетный файл может узнать код завершения выполненной программы? Для этого предусмотрено ключевая переменная ERRORLEVEL .

Пример пакетного файла с errorlevel"ами:

@ECHO OFF

REM Запускаем программу prg1.exe

PRG1.EXE

REM Анализ кода завершения

IF ERRORLEVEL 2 GOTO FILENOTFOUND

IF ERRORLEVEL 1 GOTO WRITEERROR

IF ERRORLEVEL 0 GOTO EXITOK

GOTO ONEXIT

:FILENOTFOUND

ECHO Ошибка! Файл не найден!

GOTO ONEXIT

:WRITEERROR

ECHO Ошибка записи!

GOTO ONEXIT

:EXITOK

ECHO Программа завершена благополучно.

GOTO ONEXIT

:ONEXIT

Обратите внимание - анализ кода завершения начинается не с нуля, а с максимально возможного значения. Дело в том, что подобная проверка означает: "если errorlevel больше или равен значению, то...". То есть, если мы будем проверять, начиная с нуля, любое значение будет истинным на первой же строке, что неверно.

Это самая распространенная ошибка в подобного рода программах.



Есть вопросы?

Сообщить об опечатке

Текст, который будет отправлен нашим редакторам: