Команда SET — работа с переменными среды Windows
    Команда SET используется для просмотра и изменения переменных среды окружения в командной строке Windows. Переменные окружения — это переменные, принимаемые значения которых характеризуют среду, в которой выполняется текущая программа — пути системных файлов, сведения об аппаратных средствах, каталоги пользователя и т.п. Значения переменных среды формируются в процессе загрузки Windows, регистрации пользователя в системе, при выполнении отдельных процессов или с помощью команды SET . Для просмотра значения, принимаемого конкретной переменной можно воспользоваться командой :
SET переменная
SET PATH — отобразить значение переменной PATH
Для создания новой переменной, или изменения значения существующей, используется команда :
переменная — Имя переменной среды.
строка — Строка символов, присваиваемая указанной переменной.
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=[promptString]
Ключ /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:
Возможно использование число пропусков не задано, и используется отрицательное число, то принимаемое значение будет частью переменной от конца строки:
-10% — извлечет последние 10 символов переменной PATH
. Нулевое значение можно не указывать, сохраняя формат подстановки:
0,-2% эквивалентно %PATH:
При использовании переменных окружения в командных файлах существует определенное ограничение, связанное с тем фактом, что присваиваемое значение остается без изменения при его модификации внутри группы команд, задаваемой скобками, например в командах IF или FOR . Для обхода данного ограничения используется запуск командного процессора с параметром /V:ON и вместо знаков процента, для получения принимаемого переменной значения, используются восклицательные знаки. Кроме того, существует возможность использовать стандартный запуск командного процессора, но с локальным включением данного режима командой :
Разница в результатах использования значений переменных довольно наглядно демонстрируется следующим командным файлом:
Setlocal EnableDelayedExpansion
@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 )
Класс Win32_Process — работа с процессами
Класс Win32_Process служит для работы с процессами Windows. С его помощью можно получить обширный список параметров заданного процесса или целой группы. А также получить имя учетной записи и ее идентификатор, создать новый процесс, завершить заданный, изменить приоритет и многое другое.
Сначала я приведу вам описание класса Win32_Process, а потом покажу примеры с его использованием.
Свойства класса Win32_Process
Caption – Содержит описание процесса (короткая форма).
CommandLine – Содержит полный путь к приложению (если оно существует), которое отвечает за запуск процесса.
CreationClassName – имя класса, который создал процесс, как правило – Win32_Process
CreationDate – хранит в себе значение в формате дата, собственно время начала запуска процесса
CSCreationClassName – как и свойство CreationClassName выводит имя класса.
CSName – данное свойство позволяет получить имя компьютера, на котором запущен процесс.
Description — Содержит описание процесса (полная форма).
ExecutablePath – фактически, как и свойство CommandLine , хранит полный путь к исполняемому файлу процесса.
ExecutionState – это свойство не нашло реализации и всегда возвращает пустое значение ( null )
Handle – описатель процесса, фактически содержит такое же значение, как и свойство ProcessID
HandleCount – количественное значение дескрипторов, которые открыты в данный момент текущим процессом.
InstallDate – дата создания объекта, объект может быть создан и без записи значения в это свойство, тогда свойство вернет null
KernelModeTime – время работы в режиме ядра
UserModeTime – время работы в пользовательском режиме, данные свойства, как и KernelModeTime позволяют определить загрузку процессора заданным процессом.
MaximumWorkingSetSize — Максимально возможный размер рабочего набора процесса (рабочий набор процесса — это набор страниц, доступных процессу в физической оперативной памяти)
MinimumWorkingSetSize — Минимально возможный размер рабочего набора процесса
Name – свойство хранит имя процесса и как правило, совпадает со значением свойства Caption .
OSCreationClassName – вернет имя класса.
OSName – содержит имя ОС
OtherOperationCount — Число выполненных операций ввода/вывода, отличных от операции чтения или записи
OtherTransferCount — Размер данных, переданных в процессе выполнения операций, отличных от операции чтения или записи.
PageFaults – количество ошибок, которые возникают при обращении к блоку памяти.
PageFileUsage – определяет размер в байтах части файла подкачки, что используется на данный момент процессом.
ParentProcessID – свойство позволяет получить идентификатор родительского процесса (того, что создал текущий процесс).
PeakPageFileUsage – хранит информацию в байтах части файла подкачки, что использовалась на протяжении работы всего процесса.
PeakVirtualSize — Максимальное значение размера виртуального адресного пространства, что использовалось процессом единовременно.
PeakWorkingSetSize — Максимальное значение размера рабочего набора процесса за все время работы
Priority – данное свойство позволяет узнать приоритет процесса, оно может принимать значение от 0 (минимум) до 31(максимум).
ProcessID – собственно, идентификатор процесса, в большинстве случаев, именно данный параметр служит для определения процесса, так как является всегда уникальным из целого списка.
ReadOperationCount — количество выполненных процессом операций чтения
ReadTransferCount — размер прочитанных данных
ThreadCount — количество активных потоков в процессе
VirtualSize — Текущий размер виртуального адресного пространства в байтах, используемого процессом
WindowsVersion – версия сборки ОС.
WorkingSetSize — Размер памяти в байтах, который нужно для успешного выполнения процесса в ОС, которая использует страничную организацию памяти
WriteOperationCount – количество выполненных процессом операций записи
WriteTransferCount — Размер записанных данных
Методы класса Win32_Process
AttachDebugger() – позволяет запустить отладчик, который установлен в система по умолчанию для отладки системы.
Create(CommandLine, CurrentDirectory, ProcessStartupInformation, ProcessId) – данный метод позволяет создать новый процесс. Метод вернет значение 0 (при успехе) или код ошибки. Как видим методу передаются 4 параметры, первые три являются входящими, а четвертый ( ProcessId ) – будет хранить идентификатор процесса, присвоенный системой.
CommandLine – путь к файлу, который породит процесс
CurrentDirectory – рабочий каталог, который, используемый созданным процессом, при отсутствии данного параметра, будет приниматься значение из параметра CommandLine .
ProcessStartupInformation — начальная конфигурация процесса (объект класса Win32_ProcessStartup ), при отсутствии параметра будет приниматься пустая строка ( \»\» ).
GetOwner(User, Domain) – данный метод полезен тем, что позволяет получить имя пользователя (User) создавшего процесс и имя домена в котором запущен текущий процесс ( Domain ). Стоит обратить внимание, что не важно, какие имена переменных передаются методу. Схема вызова метода GetOwner для языка vbscript и jscript разная, как это происходит мы рассмотрим ниже.
GetOwnerSid(Sid) – метод принимает всего один параметр, в котором будет храниться идентификатор безопасности ( Security IDentifier, SID ) владельца процесса
SetPriority(Priority) – метод позволяет задать приоритет процесса. Параметр Priority принимает следующие значения: 64 (низкий), 16 384 (ниже среднего), 32 (средний), 32 768 (выше среднего), 128 (высокий), 256 (процесс будет выполняться в реальном времени – может подвесить систему)
Terminate(Reason) – позволяет принудительно завершить текущий процесс и все дочерние. Метод, как и все остальные, вернет ноль при успехе или код ошибки при неудачи. Параметр позволяет задать код выхода.
Хорошо, теорию прошли, теперь можно и попрактиковаться.
Получаем имя процесса, SID и имя домена/пользователя (класс Win32_Process, язык JScript)
Сперва происходит подключение к пространству имен WMI CIMv2 с помощью функции GetObject , результат будет храниться в переменной objWMI . Видим, что для экранизации косой черты, мы ее прописываем дважды. Далее нам нужно обработать коллекцию, которая возвращается после вызова класса Win32_Process. В языке jscript для обработки коллекции служит встроенный объект Enumerator (смотри статью “Урок 17 по JScript: Enumerator — объект для работы с коллекциями”). Далее идет использования цикла for для перебора всех элементов коллекции. В цикле мы вызываем функцию GetOwner (она вернет значение в переменную output, которая хранит код выхода и через которую мы получаем имя домена и пользователя) и GetOwnerSid (она вернет значение в переменную output_SID, которая хранит код выхода и через которую мы получаем значение SID) через метод ExecMethod_ . Я не делал проверки, то есть, если переменные output или output_SID возвращают ноль, значит, запрос прошел удачно, иначе, мы получим пустое значение null. Весь список записывается в переменную list . Далее происходит вызов функции ShowInNotepad , в которой данные записываются во временный файл, и который потом открывается с помощью программы wordpad.exe.
Получаем имя процесса, SID и имя домена/пользователя (класс Win32_Process, язык JScript)
Тут стоит обратить внимание на следующую особенность: Вызов методов GetOwner и GetOwnerSid происходит через переменную objItem а не через функцию ExecMethod_ как в примере на jscript. Также видим, что переменные strSID, strDomain и strUser мы указали как параметры, то есть, мы могли указать и другие названия переменных.
Спасибо за внимание. Автор блога Владимир Баталий