(командных) файлах, позволяют обходиться без указания абсолютных путей к директориям. Например, если нам заранее неизвестна буква системного диска, мы всегда можем использовать переменную %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).
0.00 (1 )
Общий подход.
Командные файлы - это текстовые файлы с расширением bat или cmd , строки которых представляют собой команды или имена исполняемых файлов. Когда вы запускаете на выполнение командный файл, то управление получает командный процессор операционной системы (часто называемый интерпретатором команд), который последовательно считывает и интерпретирует строки командного файла. Для Windows9X этим занимается command.com , для WinNT/2K/XP - cmd.exe . Строки командных файлов могут содержать команды самого процессора команд (FOR, GOTO, IF и т.п.) или имена исполняемых модулей (net.exe, regedit.exe, win.com и т.п.). В операционных системах WinNT/2K/XP можно получить краткую справку по составу команд с помощью командной строки:
или по конкретной команде:
HELP Имя команды
Для выдачи текста справки не на экран, а в файл, можно воспользоваться перенаправлением вывода . При использовании командной строки, стандартным устройством ввода является клавиатура, а устройством вывода - дисплей, однако эти устройства можно переназначить с использованием символов перенаправления
< - перенаправление ввода
> - перенаправление вывода (или > > - перенаправление в существующий файл, когда выводимые данные дописываются в конец файла.)
Для вывода потока данных команды
HELP в файл help.txt командная строка будет следующей:HELP > help.txt
Для вывода справки по команде GOTO в файл goto.txt:
HELP GOTO > goto.txt
Использование переменных окружения.
В командных файлах можно, а зачастую, и нужно использовать переменные окружения - переменные, значения которых характеризуют среду, в которой выполняется команда или пакетный файл. Значения переменных окружения формируются при загрузке ОС и регистрации пользователя в системе, а также могут быть заданы с помощью команды SET , формат которой:
SET [переменная=[строка]]
переменная Имя переменной среды.
строка Строка символов, присваиваемая указанной переменной.
Например, командная строка
SET mynane=Vasya
добавит переменную myname, принимающую значение Vasya.
Можно получить значение переменной в программах и командных файлах, используя ее имя, заключенное в знаки процента (%) . Например команда
выведет на экран слово time, а команда
выведет на экран значение переменной time, принимающей значение текущего времени.
А командная строка
SET PATH=C:myprog;%path%
добавит в путь поиска исполняемых программ, описываемый значением переменной PATH каталог C:myprog
Выполнение команды SET без параметров вызывают выдачу текущих значений переменных на экран, в виде:
NUMBER_OF_PROCESSORS=1 - количество процессоров
OS=Windows_NT- тип ОС
Path=E:WINDOWSsystem32;E:WINDOWS;E:Program FilesFar - путь поиска исполняемых файлов.
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH - расширения для исполняемых файлов.
PROCESSOR_ARCHITECTURE=x86 - архитектура процессора.
PROCESSOR_IDENTIFIER=x86 Family 6 Model 8 Stepping 1, AuthenticAMD - идентификатор процессора.
PROCESSOR_LEVEL=6 - уровень (номер модели) процессора.
PROCESSOR_REVISION=0801 - версия процессора.
ProgramFiles=E:Program Files - путь к папке "Program Files"
PROMPT=$P$G - формат приглашения командной строки $P - путь для текущего каталога $G - знак ">".
SystemDrive=E: - буква системного диска.
SystemRoot=E:WINDOWS - каталог ОС Windows.
Значение некоторых переменных по команде SET не выдаются. Это переменные, значения которых динамически изменяются:
%CD% - Принимает значение строки текущей директории.
%DATE% - Принимает значение текущей даты.
%TIME% - Принимает значение текущего времени.
%RANDOM% - Принимает значение случайного десятичного числа в диапазоне 1 -32767.
%ERRORLEVEL% - Принимает текущее значение кода завершения задачи ERRORLEVEL
%CMDEXTVERSION% - Принимает значение версии командного процессора CMD.EXE для расширенной обработки команд.
%CMDCMDLINE% - Принимает значение строки, которая вызвала командный процессор.
Для просмотра значения переменной можно использовать командную строку:
ECHO %переменная%
Входные параметры для командного файла.
Существует возможность передать командному файлу параметры командной строки и использовать их значения в операторах самого командного файла.
BAT-файл < параметр1 > , < параметр2 >, ... < параметрN >
В самом командном файле первый параметр будет доступен как переменная %1 , второй - %2 и т.п. Имя самого командного файла доступно как переменная %0 . Для примера создадим командный файл, задачей которого будет выдача на экран значений введенных параметров. Обычно для вывода текста используется команда
ECHO < текст >
Однако если текст заменить на %1, - то будет выдан первый параметр, на %2 - второй и т.д.
Создаем файл parm.bat следующего содержания:
echo Первый параметр=%1
echo Второй параметр=%2
echo Третий параметр = %3
и запускаем его на выполнение следующей командой:
parm.bat FIRST second “two words”
после его выполнения вы поймете, как это работает и что параметры с пробелами, нужно заключать в двойные кавычки. Для того, чтобы обрабатываемые командным процессором строки не выдавались на экран, можно воспользоваться командой
ECHO OFF , поместив ее в первую строку командного файла. Для того, чтобы строка командного файла игнорировалась командным процессором поместите в ее начало REM< пробел > . Таким образом можно помещать комментарии, зачастую нелишние в больших командных файлах:rem ECHO OFF выключает режим вывода содержания строк командного файла на экран
REM будет выводиться только результат их выполнения.
echo Первый параметр=%1
echo Второй параметр=%2
echo Третий параметр = %3
Попробуйте ECHO OFF заменить на @ECHO OFF - результат говорит сам за себя. Строка, которая выключает режим вывода, перестала выдаваться на экран.
Переходы и метки.
В командных файлах можно использовать команды условного перехода, меняющие логику их работы в зависимости от выполнения определенных условий. Для иллюстрации приемов использования условных переходов создадим командный файл, целью которого будет присвоение заранее определенной буквы диска для съемных носителей, в качестве которых будут использоваться флэш-диски. Условия таковы - есть 2 флэш-диска, один из которых должен быть виден в проводнике как диск X: а второй - как диск Y: независимо от того, в какой порт USB они подключены. Будем считать, что реальные диски могут быть подключены как F: или G: Опознавание дисков будем выполнять по наличию файла с определенным именем (лучше такой файл сделать скрытым в корневом каталоге и назвать его как-нибудь необычно):
Flashd1.let - на первом диске
Flashd2.let - на втором
Т.е. задача командного файла заключается в том, чтобы проверить наличие на сменных дисках F: и G: файлов Flashd1.let или Flashd2.let и, в зависимости от того, какой из них присутствует, присвоить диску букву X: или Y:
Для поиска файла на диске используем команду
IF EXIST :IF EXIST имя_файла команда
В качестве команды проще всего воспользоваться SUBST , сопоставляющей имя диска и каталог.
SUBST X: C: - создает виртуальный диск X:, содержимым которого будет корневой каталог диска C:
Создаем командный файл setXY.bat со следующими строками:
После выполнения такого файла у вас появятся диски X: и Y: Но если такой файл выполнить повторно, команда SUBST выдаст сообщение об ошибке - ведь диски X: и Y: уже существуют.
Желательно обойти выполнение SUBST, если виртуальные диски X: и Y: уже созданы, (или удалять их, используя SUBST с параметром -d перед подключением). Модифицируем командный файл с использованием GOTO - передачи управления строке пакетного файла по метке.
GOTO метка
Метка должна находиться в отдельной строке и начинаться с двоеточия. Сделаем изменения в нашем командном файле, чтобы не возникало сообщений об ошибке:
REM если не существует X: - то перейдем на метку SETX
IF NOT EXIST X: GOTO SETX
REM если существует X: - перейдем на проверку наличия Y:
IF EXIST G:flashd1.let SUBST X: G:
IF EXIST F:flashd1.let SUBST X: F:
REM если Y: существует - завершим командный файл.
IF EXIST Y: GOTO EXIT
IF EXIST G:flashd2.let SUBST Y: G:
IF EXIST F:flashd2.let SUBST Y: F:
REM выход из командного файла
Сообщение об ошибке SUBST исчезло. Признаки ошибок при выполнении команд можно отслеживать и в самом командном файле, анализируя переменную ERRORLEVEL , значение которой формируется при выполнении большинства программ. ERRORLEVEL равно 0, если программа завершилась без ошибок и 1 - при возникновении ошибки. Могут быть и другие значения, если они предусмотрены в выполняемой программе.
В качестве команды в строке командного файла можно использовать также командный файл. Причем, для передачи с возвратом обратно к точке выполнения вызывающего командного файла используется команда CALL . Создадим командный файл test.bat, следующего содержания:
ECHO Вызов 1.bat
ECHO Возврат.
И файл 1.bat, содержащий команду PAUSE , приостанавливающую выполнение командного файла до нажатия любой клавиши.
При выполнении test.bat будет выдано на экран сообщение
Вызов 1.bat
и управление получит 1.bat с командой pause. После начатия клавиши на клавиатуре управление получит командная строка “ECHO Возврат.” и на экран будет выдано
Если же в test.bat убрать CALL , то возврат из файла 1.bat выполняться не будет. Кстати, используя передачу управления командному файлу, можно организовать его зацикливание. Попробуйте добавить в конец файла test.bat строку:
Выйти из зацикливания командного файла можно по нажатию комбинации CTRL-Break. Возможно использование команды CALL для вызова процедуры внутри командного файла. В этом случае в качестве аргумента используется не имя внешнего файла, а метка:
....
call:proc1
....
:proc1
....
exit
....
Создание файлов.
В Windows нет специальной команды для создания файла, но без нее можно легко обойтись несколькими способами:
Копирование с консоли в файл
COPY CON myfile.txt
При выполнении этой команды данные с клавиатуры (устройство CON) будут заноситься в файл myfile.txt. Нажатие клавиши F6 или комбинации CTRL-Z завершит вывод.
Перенаправление вывода
ECHO 1 > myfile.txt
При выполнении этой команды будет создан файл myfile.txt, содержащий символ “1”
Комбинация перенаправления ввода и вывода:
COPY CON > myfile.txt < xyz
При выполнении этой команды, как и в первом случае, используется копирование с консоли в файл, но вместо данных с клавиатуры используется ввод с несуществующего устройства xyz. Система выдаст сообщение, о том, что такого устройства не существует, но пустой файл myfile.txt будет успешно создан.
Совсем простой вариант - копирование с фиктивного устройства с именем nul
в файл.
copy nul myfile.txt
Если вам часто приходится создавать пустые файлы, можно подготовить свой командный файл (например - newfile.bat или, что еще лучше, - nf.bat), а имя создаваемого файла передавать ему в качестве параметра при запуске.
Содержимое файла:
Поместите этот командный файл в системный каталог (C:windowssystem32 или любой другой, имеющийся в путях поиска, задаваемых PATH).
Командная строка:
newfile.bat myfile.txt
Или
nf.bat myfile.txt
Или
nf myfile.txt
Вот вам и команда nf для создания пустого файла в командной строке.
Присвоение съемному диску одной и той же буквы.
Задача заключается в том, чтобы съемный USB диск (флэш диск) был доступен всегда под одной и той же буквой, независимо от того, на каком компьютере он используется и как он подключен. Для ее решения воспользуемся уже упоминаемой выше командой SUBST. Выберем для съемного диска желаемую букву, например - X. Имя диска, с которого был запущен командный файл доступно как переменная %~d0. Создаем командный файл следующего содержания:@echo off
subst X: %~d0
что означает - создать виртуальный диск X:, которому сопоставлен физический диск, откуда был выполнен запуск командного файла.
Дополнительное представление о подстановочных значениях переменной %0 можно получить из командного файла следующего содержания:
@echo off
ECHO ОБРАБАТЫВАЕТСЯ ФАЙЛ - %0
ECHO Дата/время создания/изменения командного файла - %~t0
ECHO Путь командного файла - "%~f0"
ECHO Диск командного файла - %~d0
ECHO Каталог командного файла - "%~p0"
ECHO Имя командного файла - %~n0
ECHO Расширение командного файла - %~x0
ECHO Короткое имя и расширение - %~s0
ECHO Атрибуты командного файла - %~a0
ECHO Размер командного файла - %~z0
Создание поколений архивов по датам и времени.
Решим следующую задачу - нужно создать архив файлов, находящихся в каталоге C:Program FilesFAR. Имя архивного файла должно состоять из текущего времени (часы.минуты.секунды - ЧЧ.ММ.СС.rar), и помещен он должен в новый каталог, имя которого должно состоять из текущей даты (день.месяц.год - ДД.ММ.ГГГГ). Для архивирования будем использовать архиватор RAR. Формат запуска для создания архива:
RAR a -r < путь и имя архива > < Путь и имя архивируемых данных >
a
- команда создания архива.
-r
- ключ, определяющий архивирование подкаталогов (т.к. в исходной папке есть подкаталоги).
Таким образом, для решения задачи нужно правильно создать имена и пути для RAR. Для чего воспользуемся следующими факторами:
Дата, получаемая из переменной %DATE% при стандартных настройках региональных установок выглядит следующим образом: Set VDATE=%date:~3% Создаем каталог на диске C:, имя которого = текущая дата из переменной VDATE: MD C:\%VDATE% Время, получаемое из переменной %TIME%: Запустим архиватор: Теперь можно создать командный файл с содержимым: Set VDATE=%date:~3% Такой командный файл можно выполнять через автозагрузку, или как часть скрипта, при входе пользователя в домен, либо с помощью планировщика в заданное время, и у вас всегда будут в наличии упорядоченные по времени архивы критических данных.
Этот командный файл создает архивы содержимого папки "Мои Документы" пользователей Win2K/XP, размещая их в каталоги |
Иногда требуется сформировать переменную даты и времени в 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 |
Объявление собственных переменных является неотъемлемой часть практически любого языка программирования, так в языке vbscript они объявляются с помощью ключевого слова dim , а в jscript – используется ключевое слово var .
Переменные командной строки Windows представляют немного другой характер, тут нельзя объявить группу переменных cmd, или же сразу присвоить значения нескольким переменным в командной строке. Давайте посмотрим на следующие строчки кода:
echo % Var3% echo % VAR3% echo % vAr3% |
Стоит учитывать один момент, запись
set var1 =100 |
set var1 = 100 |
это не одно и тоже, то есть, в первом случае мы создаем cmd переменную "var1", а во втором – "var1 ". С присвоением значений аналогичная ситуация, так что обращайте внимание на пробел!!!
Видим, что бы вывести значение переменной с помощью функции Echo , мы заключаем ее в символ "%", для set – просто прописываем ее имя, так же стоит учитывать, что всем переменным присваивается строковой тип.
Если вы запустите на выполнение команду cmd set, которая выводит список всех переменных и их значений в текущем сеансе, то увидите, что там будут присутствовать и только что созданные cmd переменные и . Мы сможем обращаться к ним на протяжение всего сеанса работы.
Что бы очистить переменные в командной строке Windows от их содержимого, нужно просто присвоить пустое значение:
просто выведет строчку %Var3%, а команда
В данном примере мы экранировали символы & и ^, тем самым присвоив фразы:
"100 & 3 = 5"
"100 ^3"
Стоит обратить внимание, что если мы попытаемся вывести значения данных переменных с помощью функции cmd set, то проблем не возникнет, но если будет использовать функцию echo, то получим совсем не тот результат, что ожидали. Так, при попытке выполнить следующую команду:
Теперь при выполнении кода:
echo % var4% echo % var5% |
все пройдет успешно.
Понятно, что переменные cmd, созданные в текущем окне командной строки недоступна для других процессов, но, есть возможность задать ограничения еще большие.
Что бы задать локальную область видимости, используется блок SETLOCAL … ENDLOCAL . Все cmd переменные командной строки Windows, объявленные в середине данного блока не будут видны за его пределами. Откройте редактор (я использую редактор Notepad++ , так как он сразу подсвечивает код), и пропишите в нем следующие строчки кода:
Видим, что вначале мы объявили var1 и присвоили ей значение 0, далее мы снова объявили переменную с аналогичным именем, но уже в блоке SETLOCAL … ENDLOCAL . В сценарии происходит вывод значения как локальной, так и глобальной var1. Я специально использовал латинские знаки, что бы у вас в случае чего не выводились крякозябры.
Переменные среды, используемые в пакетных (командных) файлах, позволяют обходиться без указания абсолютных путей к директориям. Например, если нам заранее неизвестна буква системного диска, мы всегда можем использовать переменную %systemdrive% , возвращающую букву диска, на котором установлена ОС. Также, переменные применяются для оптимизации кода - многократно повторяющемуся параметру (например, разделе реестра) можно назначить короткую переменную и использовать ее. В данной статье подробно рассматриваются различные приемы работы с переменными, а также способы изменения и создания новых переменных. Теперь обо всем по порядку.
Классификация переменных среды
Резюме
Командная оболочка Windows (cmd.exe) - это весьма мощный инструмент работы с системой. При помощи пакетных файлов можно автоматизировать изрядное количество задач, и именно поэтому они часто используются для автоматической установки Windows. Умелое использование переменных в пакетных файлах позволяет решать широкий спектр вопросов. Работа с командной оболочкой становится более эффективной и одновременно упрощается код пакетных файлов. Другие примеры использования переменных вы можете найти на страницах сайта или форума. Все примеры, использованные в этой статье, взяты из скриптов участников , за что им большое спасибо.
Терминология
Командная оболочка — это отдельный программный продукт, который обеспечивает прямую связь между пользователем и операционной системой. Текстовый пользовательский интерфейс командной строки предоставляет среду, в которой выполняются приложения и служебные программы с текстовым интерфейсом.
cmd.exe - интерпретатор команд, который командная оболочка ОС Windows использует для перевода введенной команды в формат, понятный системе.
Командная сессия может инициироваться как запуском cmd.exe , так и запуском пакетного файла. Иными словами создается текущая командная оболочка. Соответственно выход из этой оболочки (к примеру, окончание работы пакетного файла) завершает командную сессию.
Пользовательский сеанс (пользовательская сессия) начинается с момента входа пользователя в систему (log on) и завершается при выходе (log off).