sonyps4.ru

Cmd строка содержит имя переменной. Основы BAT файлов

Иногда требуется сформировать переменную даты и времени в 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

Среда командной оболочки 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.

Локальная

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

Локальная

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

Локальная

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

Системная

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

    Команда SET используется для просмотра и изменения переменных среды окружения в командной строке Windows. Переменные окружения - это переменные, принимаемые значения которых характеризуют среду, в которой выполняется текущая программа - пути системных файлов, сведения об аппаратных средствах, каталоги пользователя и т.п. Значения переменных среды формируются в процессе загрузки Windows, регистрации пользователя в системе, при выполнении отдельных процессов или с помощью команды SET . Для просмотра значения, принимаемого конкретной переменной можно воспользоваться командой:

SET переменная
SET PATH - отобразить значение переменной PATH
Для создания новой переменной, или изменения значения существующей, используется команда:

SET переменная=строка

переменная - Имя переменной среды.
строка - Строка символов, присваиваемая указанной переменной.

SET MyName=Vasya - установить значение переменной MyName

SET path=C:\progs;%path% - изменить значение переменной PATH , добавив в начало строки C:\progs

Значение, принимаемое переменной, доступно для обработки в командных файлах, при использовании ее имени, заключенного в знаки процента - % . Например команда выдачи текста на дисплей ECHO в виде:

ECHO date - выведет на экран слово "date", а команда
ECHO %date% выведет на экран значение переменной date , т.е. текущую дату в формате операционной системы.

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

ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\Usr\AppData\Roaming
CommonProgramFiles=C:\Program Files\Common Files
COMPUTERNAME=TEST7
ComSpec=C:\windows\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Users\Usr
LOCALAPPDATA=C:\Users\Usr\AppData\Local
LOGONSERVER=\\TEST7
NUMBER_OF_PROCESSORS=2
OS=Windows_NT
Path=C:\windows\system32;C:\windows;
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS; .VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=x86
PROCESSOR_IDENTIFIER=x86 Family 15 Model 3 Stepping 4, GenuineIntel
PROCESSOR_LEVEL=15
PROCESSOR_REVISION=0304
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
PROMPT=$P$G
PSModulePath=C:\windows\system32\Windows PowerShell\v1.0\Modules\
PUBLIC=C:\Users\Public
SystemDrive=C:
SystemRoot=C:\windows
TEMP=C:\Users\Usr\AppData \Local\Temp
TMP=C:\Users\Usr\AppData \Local\Temp
USERDOMAIN=test7
USERNAME=Usr
USERPROFILE=C:\Users\Usr
windir=C:\windows

Кроме переменных, отображаемых в списке, при вызове команды SET, существуют и другие, значения которых изменяется динамически:

%CD% - принимает значение текущего каталога.
%DATE% - принимает значение текущей даты.
%TIME% - принимает значение текущего времени.
%RANDOM% - значение случайного числа в диапазоне между 0 и 32767.
%ERRORLEVEL% - текущее значение ERRORLEVEL, специальной переменной, которая используется в качестве признака результата выполнения программы.
%CMDEXTVERSION% значение версии расширенной обработки команд CMD.EXE.
%CMDCMDLINE% - раскрывается в исходную командную строку, которая вызвала командный процессор.

Если при вызове команды SET указать только часть имени, то будет выведен список переменных, имена которых начинаются с указанной строки. Например:

SET U - выведет значения всех переменных, имена которых начинаются с "U".

Команда SET поддерживает два дополнительных ключа:

SET /A выражение

SET /P variable=

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

При использовании любых логических или двоичных операторов необходимо заключить строку выражения в кавычки. Любые нечисловые строки в выражении рассматриваются как имена переменных среды, значения которых преобразуются в числовой вид перед использованием. Если переменная с указанным именем не определена в системе, вместо нее подставляется нулевое значение. Это позволяет выполнять арифметические операции со значениями переменных среды, причем не нужно вводить знаки % для получения значений. Если команда SET /A вызывается из командной строки, а не из пакетного файла, она выводит окончательное значение выражения. Слева от любого оператора присваивания должно стоять имя переменной среды. Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс:

0x - для шестнадцатеричных чисел
0 - для восьмеричных чисел.

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

SET /A REZ=0xA+012
ECHO %REZ%

В данном командном файле значение переменной REZ вычисляется сложением числа 10, представленного в шестнадцатеричном виде (0xA) и числа 10 , представленного в восьмеричном (012).

Ключ /P позволяет установить значение переменной для входной строки, введенной пользователем. Показывает указанное приглашение promptString перед чтением введенной строки. Приглашение promptString может быть пустым. Данный ключ позволяет организовать диалог с пользователем в командном файле:

@ECHO OFF
SET /P NAME=Введите имя пользователя:
SET /P pass=Введите пароль:
ECHO Имя пользователя - %NAME% , Пароль - %PASS%

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

переменная:строка1=строка2 - заменяет в принимаемом значении переменной строку1 на строку2

Следующий командный файл использует замену символа "точка" на символ "тире" в значении переменной, соответствующем текущей дате:

@ECHO OFF
set tm=%DATE%
ECHO Дата1 = %tm%
SET tm=%DATE:.=-%
ECHO Дата2 = %tm%

Для выделения части значения, принимаемого переменной, используется следующая конструкция:

переменная:~x,y - где x - число пропускаемых символов от начала строки, а y - количество символов, используемых в качестве значения переменной.

Следующий пример использует отображение текущего времени без секунд и долей секунд (только первые 5 символов из стандартного значения переменной TIME):

@ECHO OFF
set tm=%TIME%
ECHO Время1 = %tm%
SET tm=%TIME:~0,5%
ECHO Время2 = %tm%

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

@ECHO OFF
set tm=%TIME%
ECHO Время1 = %tm%
SET tm=%TIME:~0,-6%
ECHO Время2 = %tm%

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

%PATH:~-10% - извлечет последние 10 символов переменной PATH

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

%PATH:~0,-2% эквивалентно %PATH:~,-2%

При использовании переменных окружения в командных файлах существует определенное ограничение, связанное с тем фактом, что присваиваемое значение остается без изменения при его модификации внутри группы команд, задаваемой скобками, например в командах IF или FOR . Для обхода данного ограничения используется запуск командного процессора с параметром /V:ON и вместо знаков процента, для получения принимаемого переменной значения, используются восклицательные знаки. Кроме того, существует возможность использовать стандартный запуск командного процессора, но с локальным включением данного режима командой:

Разница в результатах использования значений переменных довольно наглядно демонстрируется следующим командным файлом:


@ECHO OFF
set VAR=before
if "%VAR%" == "before" (
set VAR=after
if "!VAR!" == "after" @echo Со знаком процента=%VAR% , Со знаком вопроса=!VAR!

Команда set VAR=after выполняется внутри подпрограммы, ограниченной скобками и, если убрать команду Setlocal EnableDelayedExpansion или не использовать для получения значения переменной VAR восклицательные знаки, ее значение останется старым (тем, что было установлено до входа в подпрограмму). Аналогичная же проблема наблюдается и тогда, когда значение переменной изменяется внутри цикла команды FOR . Например, для получения списка файлов текущего каталога такой командный файл не будет работать:

set LIST=
for %%i in (*) do set LIST=%LIST% %%i
echo %LIST%

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

Setlocal EnableDelayedExpansion
set LIST=
for %%i in (*) do set LIST=!LIST! %%i
echo %LIST%

Теперь, значение переменной LIST внутри цикла FOR будет изменяться, последовательно принимая значения имен файлов, разделенных пробелом ( set LIST=!LIST! %%i )

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

Классификация переменных среды

Резюме

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

Терминология

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

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

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

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



Загрузка...