Set cmd примеры: set | Microsoft Learn
Содержание
Статья — CMD: SetLocal и расширенная обработка команд
JavaScript отключён. Чтобы полноценно использовать наш сайт, включите JavaScript в своём браузере.
-
Автор темы
Dragokas -
Дата начала
Dragokas
Angry & Scary Developer
#1
Статья от 10.05.2013
Автор: Dragokas
SetLocal, расширенная обработка команд и отложенное раскрытие значения переменной
Часто встречали такую конструкцию ?
SetLocal EnableExtensions EnableDelayedExpansion
По своей сути она состоит из 3 совмещенных частей:
SetLocal &:: Локализация переменных SetLocal EnableExtensions &:: Использование дополнительных ключей SetLocal EnableDelayedExpansion &:: Раскрытие переменных через знаки (!)
SetLocal
Что делает?
SetLocal — означает, что все переменные, объявленные внутри Batch-файла, будут локальными и после выхода из него обнуляться.
Это также оберегает от случаев, когда Вы забываете задавать начальное значение переменной.
По-умолчанию, значение переменной при инициализации
для строкового типа = пустой строке,
для числового типа = 0.
Если Вы запускаете Batch-файл
— из CMD.exe (ПУСК -> Выполнить -> CMD -> {Enter})
— один Batch-файл из другого
то при повторном запуске без команды SetLocal в переменных останутся старые значения.
Область видимости переменной, заданной командой Set, является текущая среда интерпретатора, если батник запущен через нее (CMD.exe) (и внутри нет команды локализации SetLocal), или сессия самого батника, если двойным кликом по нему.
Smitis написал(а):
А также дочерние процессы, запущенный после того, как переменная установлена.
Нажмите для раскрытия…
Как задается?
SetLocal
Переменные, использованные после команды SetLocal, можно обнулить принудительно еще до выхода из Batch-файла командой:
EndLocal
Конструкция вида:
SetLocal Set B=1 EndLocal& Set A=%B%
Позволяет обнулить переменную B, при этом в однострочной команде после EndLocal
переменная раскрываемая через % и все еще будет содержать старое значение, поэтому может быть «переброшена» через локаль.
В конструкции вида:
setLocal EnableDelayedExpansion Set B=1 EndLocal& Set A=!B!
переменная A получит актуальное (обнуленное) значение переменной B,
поэтому способ «переброса» значения через локаль невозможно использовать внутри циклов.
Extensions — режим расширенной обработки команд.
Что делает?
Позволяет использовать дополнительные ключи встроенных команд.
Где используется?
Откройте справку по командам, например,
For /?
Set /?
Там в первых 10 строках найдете выражение:
«Если включена расширенная обработка команд… то можно использовать еще и такие ключи…»
chdir /?
«Если включена расширенная обработка команд… в таком случае поведение команды изменяется» (касается пробелов в пути).
…
Как включается?
1) Задается командой
SetLocal EnableExtensions
EnableExtensions — обычно включена в системе по-умолчанию.
Но может быть выключена принудительно через реестр, а также по-умолчанию, выключена в некоторых старых ОС.
EnableExtensions
Поэтому, ее желательно включать во все скрипты.
2) Через реестр (выше по ссылкам).
3) Через ключи CMD.exe, если бат-файл или команда запускается через него, а не напрямую.
Метод может использоваться в однострочных командах, а также методах Shell других ЯП.
Пример:
cmd /E:ON /C Commands
где под
Commands подразумевается путь и имя к командному файлу (bat, cmd), цикл, команда, или перечень команд, составленных по
правилам формирования однострочных команд Batch.
Может быть отключена командой:
SetLocal DisableExtensions
Практическая польза от отключения, как мне известно, никакой.
DelayedExpansion — режим отложенного расширения переменных среды.
Что делает?
EnableDelayedExpansion — означает возможность использовать восклицательные знаки (!variable!) для раскрытия значения переменной.
Elroir написал(а):
В обычном случае, чтобы узнать значение переменной окружения, надо воспользоваться конструкцией %переменная%.
Однако, если значение переменной меняется внутри цикла и читается там же, то для корректной работы батника, нужно использовать команду setlocal enabledelayedexpansion и вместо символа «%», использовать символ «!». Иначе, значение переменной в цикле будет всегда одним и тем же — таким, каким было до входа в цикл.
Нажмите для раскрытия…
Обычно переменные раскрываются через знак %.
«Раскрывается» — означает, что мы получаем значение, которое хранит переменная.
Пример:
:: Инициализируем переменную и задаем ей значение "Кот" set Animal=Кот :: Выводим на экран значение переменной Animal echo %Animal%
Необходимость использовать знаки (!) возникает:
- внутри цикла
- под скобками
- в однострочной команде
*Здесь и далее под конструкцией подразумевается один из указанных выше вариантов.
Если Вы измените значение переменной внутри конструкции,
раскрывая переменную через %, Вы получите ее старое значение (присвоенное до входа в эту конструкцию).
Новое (актуальное) значение переменной можно получить:
- раскрыв переменную через знаки (!)
- временно выйдя за пределы конструкции (например, командой Call)
- после выхода из данной конструкции (ее завершения)
- UPD. также см. пп.4,6 здесь.
Как включить возможность использовать (!):
По-умолчанию, данный режим выключен.
Включить можно:
1) командой:
SetLocal EnableDelayedExpansion
2) через реестр (на постоянной основе — пользоваться пп.1,3 будет не нужно, но будет работать только на Вашей машине.)
DelayedExpansion
3) запуском batch-файла или команд(ы) через специальный ключ CMD.exe:
Пример:
cmd /V:ON /C Commands
где под
Commands подразумевается путь и имя к командному файлу (bat, cmd), цикл, команда, или перечень команд, составленных по правилам формирования однострочных команд Batch.
1) раскрытие переменной через % быстрее, чем через !
2) при чтении данных из файла, в содержимом которого есть знаки ! и последующей записью или выводом на экран
этой информации знаки ! «глотаются». Поэтому еще иногда используется команда отключения данного режима:
SetLocal DisableDelayedExpansion
3) Когда анализируешь свой же код, удобно понимать логику работы своего алгоритма: если видишь % под циклом, то сразу понятно, что значение этой переменной под циклом не изменяется, а если и изменяется, то в этой же конструкции новое значение не используется.
1) Цикл:
@echo off SetLocal EnableExtensions EnableDelayedExpansion :: Читаем файл example.txt :: Заводим счетчик строк count :: 5-ю строку файла выводим на экран set count=0 For /F "delims=" %%a in (example.txt) do ( set /A count+=1 if !count!==5 echo %%a echo В этом месте значение count всегда будет = 0. Count = %count% echo А здесь мы получим актуальное значение Count = !Count! )
2) Просто под скобками:
@echo off SetLocal EnableDelayedExpansion ( rem Присвоим значение переменной set variable=text echo Формируем echo несколько echo строк echo текстового echo файла echo Здесь ничего не получим.Перед скобками переменной не было присвоено значение. echo.%variable% echo Здесь получим актуальное значение echo !variable! ) >> example.txt
3) В однострочных командах:
@echo off SetLocal EnableDelayedExpansion set st1=staraya stroka set st1=novaya stroka& echo Здесь получим старую строку %st1% set st2=staraya stroka set st2=novaya stroka& echo Здесь получим новую строку !st2!
Ремарка:
Принцип раскрытия переменных влияет также на изменяемые глобальные переменные, например,
time и date, которые постоянно обновляются и отображают дату и время.
После входа в конструкцию эти переменные «замораживаются».
Чтобы получить актуальную дату/время необходимо раскрытие через знаки (!):
echo !date! !time!
Последнее редактирование:
Поделиться:
Ссылка
Назад
Сверху
Снизу
Статья — [CMD] Переменные среды в командной строке
JavaScript отключён. Чтобы полноценно использовать наш сайт, включите JavaScript в своём браузере.
-
Автор темы
Dragokas -
Дата начала
Dragokas
Angry & Scary Developer
#1
Переменные среды
Автор: specialist, Вадим Стеркин aka Vadikan
Источник
Переменные среды, используемые в пакетных (командных) файлах, позволяют обходиться без указания абсолютных путей к директориям. Например, если нам заранее неизвестна буква системного диска, мы всегда можем использовать переменную %systemdrive%, возвращающую букву диска, на котором установлена ОС. Также, переменные применяются для оптимизации кода — многократно повторяющемуся параметру (например, разделе реестра) можно назначить короткую переменную и использовать ее. В данной статье подробно рассматриваются различные приемы работы с переменными, а также способы изменения и создания новых переменных. Теперь обо всем по порядку.
Классификация переменных среды
Справка Windows различает два типа переменных среды: системные и локальные. Системные переменные возвращают одинаковые значения для всех пользователей. К примеру, %systemdrive% — буква системного диска, и она для всех пользователей одинакова. А вот значения, возвращаемые локальными переменными, варьируются в зависимости от вошедшего в систему пользователя. Например, %userprofile% может возвращать C:\Documents and Settings\ТекущийПользователь, где ТекущийПользователь — название учетной записи пользователя.
Узнать, какие переменные среды в операционной системе вам доступны и какие значения в данный момент им присвоены, вам поможет команда SET, запущенная из командной строки без параметров (Пуск – Выполнить – cmd – set). В рамках данной статьи нас интересуют переменные, обозначающие путь к различным папкам (каталогам). Чуть подробнее о некоторых из них ниже:
Переменная|Тип|Описание
%SYSTEMDRIVE%|Системная|Возвращает имя диска, содержащего корневой каталог операционной системы
Windows XP
/2003 (т. е. системный корневой каталог).
%SYSTEMROOT%, %WINDIR%|Системная|Возвращает размещение корневого каталога операционной системы Windows
XP
/2003
%PATH%|Системная|Указывает путь
поиска
для исполняемых файлов.
%PROGRAMFILES%|Системная|Указывает путь к каталогу установки программ (Program Files)
%COMMONPROGRAMFILES%|Системная|Указывает путь к общему каталогу программ (Program Files\Common Files).
%TEMP% и %TMP%|Системная и пользовательская|Возвращает временные папки, по умолчанию используемые приложениями, которые доступны пользователям, выполнившим вход в систему. Некоторые приложения требуют переменную TEMP, другие — переменную TMP.
%USERPROFILE%|Локальная|Возвращает размещение профиля для текущего пользователя.
%ALLUSERSPROFILE%|Локальная|Возвращает размещение профиля «All Users».
%CD%|Локальная|Возвращает путь к текущей папке.
%APPDATA%|Локальная|Возвращает используемое по умолчанию размещение данных приложений.
Использование переменных в пакетных файлах
Начнем с простенького примера:
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, импортирующем параметры в реестр
@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. Следуя коду, приведенному выше, нужно после определения переменной назначить ее системной.
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).
Последнее редактирование:
Phoenix
#2
Встречал такие %SYSDIR64%, %SYSDIR%, %CURDIR%, но система их не понимает. .
Dragokas
Angry & Scary Developer
#3
Стандартно x64-битная Windows 7 имеет примерно такой перечень переменных окружения
(можно получить, введя команду set без аргументов):
ALLUSERSPROFILE=C:\ProgramData
APPDATA=C:\Users\Alex\AppData\Roaming
CommonProgramFiles=C:\Program Files\Common Files
CommonProgramFiles(x86)=C:\Program Files (x86)\Common Files
CommonProgramW6432=C:\Program Files\Common Files
COMPUTERNAME=ALEX-PC
ComSpec=C:\Windows\system32\cmd.exe
FP_NO_HOST_CHECK=NO
HOMEDRIVE=C:
HOMEPATH=\Users\Alex
LOCALAPPDATA=C:\Users\Alex\AppData\Local
LOGONSERVER=\\ALEX-PC
NUMBER_OF_PROCESSORS=4
OS=Windows_NT
Path=C:\Program Files (x86)\NVIDIA Corporation\PhysX\Common;C:\me2;C:\me;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\Intel\DMIX;C:\Program Files (x86)\Common Files\Acronis\SnapAPI\;C:\Program Files\WinRAR;c:\my special soft
PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH;.MSC
PROCESSOR_ARCHITECTURE=AMD64
PROCESSOR_IDENTIFIER=Intel64 Family 6 Model 42 Stepping 7, GenuineIntel
PROCESSOR_LEVEL=6
PROCESSOR_REVISION=2a07
ProgramData=C:\ProgramData
ProgramFiles=C:\Program Files
ProgramFiles(x86)=C:\Program Files (x86)
ProgramW6432=C:\Program Files
PROMPT=$P$G
PSModulePath=C:\Windows\system32\WindowsPowerShell\v1.0\Modules\
PUBLIC=C:\Users\Public
SESSIONNAME=Console
SystemDrive=C:
SystemRoot=C:\Windows
TEMP=C:\Users\Alex\AppData\Local\Temp
TMP=C:\Users\Alex\AppData\Local\Temp
USERDOMAIN=Alex-PC
USERNAME=Alex
USERPROFILE=C:\Users\Alex
windir=C:\Windows
windows_tracing_flags=3
windows_tracing_logfile=C:\BVTBin\Tests\installpackage\csilogfile.logНажмите для раскрытия…
Указанные тобою переменные скорее всего являются локальными и предназначены исключительно для той программы, в которой ты их видел.
Например, «компилятор» Batch-кода (Bat -> to EXE) часто устанавливают подобную служебную переменную, указывающую на текущею директорию.
Предположу, что:
%SYSDIR64% — это %SystemRoot%\System32
%SYSDIR% — это %SystemRoot%\SysWow64
%CURDIR% — видимо директория работы распакованного скрипта (для батника это: %~dp0)
Или, как вариант — текущая директория (для ком. строки — это знак точки .\ или %CD%).
В любом случае, переменные могут быть добавлены в систему в качестве глобальных (доступных любой программе) внесением записи в реестр, например, для текущего пользователя (имеет приоритет):
HKCU\Environment
Нажмите для раскрытия…
или для системы в целом (видна всем пользователям и доступна также до входа в систему):
HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Environmenment
Нажмите для раскрытия.
..
или через WSH:
Set oSystemEnv = CreateObject("WScript.Shell").Environment( "SYSTEM" ) oSystemEnv("my_variable") = "XXX"
а также WMI можно:
WMIC Environment Where Name="my_variable" SET VariableValue="XXX"
Для применения эффекта, требуется перезагрузка системы или широковещательное оповещение API-функцией
PostMessage HWND_BROADCAST, WM_SETTINGCHANGE, 0, 0
либо имитацией такого эффекта, например, выполнением любой команды setx или вызовом окна UAC…
Phoenix
#4
Dragokas написал(а):
Указанные тобою переменные скорее всего являются локальными и предназначены исключительно для той программы, в которой ты их видел.
![]()
Например, «компилятор» Batch-кода (Bat -> to EXE) часто устанавливают подобную служебную переменную, указывающую на текущею директорию.Нажмите для раскрытия…
Тоже так думаю.. В зависимости от разрядности есть такие переменные. То есть, если в программе есть запись с %SYSDIR64%, то она работать в среде виндовс не будет же ?
Process Environment variables 64-bit process PROCESSOR_ARCHITECTURE=AMD64 or PROCESSOR_ARCHITECTURE=IA64 ProgramFiles=%ProgramFiles% ProgramW6432=%ProgramFiles% CommonProgramFiles=%CommonProgramFiles% CommonProgramW6432=%CommonProgramFiles% Windows Server 2008, Windows Vista, Windows Server 2003, and Windows XP: The ProgramW6432 and CommonProgramW6432 environment variables were added starting with Windows 7 and Windows Server 2008 R2. 32-bit process PROCESSOR_ARCHITECTURE=x86 PROCESSOR_ARCHITEW6432=%PROCESSOR_ARCHITECTURE% ProgramFiles=%ProgramFiles(x86)% ProgramW6432=%ProgramFiles% CommonProgramFiles=%CommonProgramFiles(x86)% CommonProgramW6432=%CommonProgramFiles%
То есть переменные указывающие на system32 syswow64 могут использоваться программами и как ?
Последнее редактирование:
Dragokas
Angry & Scary Developer
#5
Phoenix написал(а):
То есть, если в программе есть запись с %SYSDIR64%, то она работать в среде виндовс не будет же ?
Нажмите для раскрытия.
..
Чтобы вести предметный разговор, давайте определимся, что это за программа.
Есть много моментов.
Очевидный ответ — нет. Не будет доступна в других программах, разве что они были запущены из этой программы X и наследовали ее среду окружения.
Phoenix написал(а):
То есть переменные указывающие на system32 syswow64 могут использоваться программами и как ?
Нажмите для раскрытия…
Это непростой вопрос с множеством тонкостей.
Я готов поделиться подробными ответами в нескольких отдельных темах.
Заодно расскажу о зависимостях между битностью архитектуры процессора, ОС, процесса с переменными окружения. Наследованию битности процесса.
Механизме переадресации файловых запросов. А заодно об источнике проблемы с ярлыками, которую я обнаружил. Объясню на уровне байтовой структуры ярлыка и исходников M$. Думаю, glax24 будет интересно.
Вообщем, наберитесь терпения. Постараюсь по-проще. (Осталось только выспаться и отойти после праздников )
Поделиться:
Ссылка
Назад
Сверху
Снизу
Команда
Linux set и ее использование {9 примеров}
Введение
Команда set
— это встроенная команда оболочки Linux, которая отображает и устанавливает имена и значения переменных оболочки и среды Linux. В Unix-подобных операционных системах команда set
работает в оболочке Bourne ( sh
), оболочке C ( csh
) и оболочке Korn ( ksh 9). 0007
).
В этом руководстве вы узнаете, что такое команда set
и как ее использовать.
Предпосылки
- Система под управлением Linux.
- Доступ к терминалу/командной строке.
Linux set Синтаксис команды
Общий синтаксис команды set
:
set [параметры] [аргументы]
3
В контексте команды set
, [параметры]
— это параметры или флаги, которые устанавливаются или сбрасываются в среде оболочки Bash. Используйте его, чтобы влиять на поведение определенных сценариев оболочки и помогать выполнять нужные задачи.
- Установите параметр, используя знак минус (
-
), за которым следует соответствующий параметр. - Отключите параметр, используя знак плюса (
+
), за которым следует соответствующий параметр.
Аргументы
[аргументы]
являются позиционными параметрами и назначаются по порядку со следующими параметрами:
-
$1
-
$2
90 008 - .
..
-
$n
Отсутствие указания каких-либо параметров или аргументов приводит к тому, что команда печатает все переменные оболочки.
Выходные значения
Команда set
имеет три выходных значения:
-
0
. Отмечает успешное завершение. -
1
. Сбой, вызванный недопустимым аргументом. -
2
. Сбой, приводящий к сообщению об использовании, обычно из-за отсутствия аргумента.
Параметры команды Linux set
Команда set
предоставляет обширный список параметров, которые можно комбинировать.
Большинство опций имеют соответствующий -o флаг
, который можно использовать для вызова опции. В таблице ниже перечислены все параметры и соответствующие им альтернативные формы с использованием синтаксиса -o флаг
.
Опции | -o флаги | Описание |
---|---|---|
-a | -o allexport | Помечает все созданные или измененные переменные или функции для экспорта. |
-b | -o notify | Предупреждает пользователя о завершении фонового задания. |
-e | -o errexit | Указывает оболочке выйти в случае сбоя команды, т.е. , если он выводит ненулевой статус выхода. |
-f | -o noglob | Отключает генерацию имени файла (подстановку). |
-h | -o hashall | Находит и сохраняет команды функций, когда функция определена.![]() -h включен по умолчанию. |
-k | -o ключевое слово | Помещает в среду все аргументы присваивания для команды, а не только те, которые предшествуют имени команды. |
-n | -o noexec | Читает команды, но не выполняет их. |
-m | -o монитор | Отображает сообщение после завершения задачи. |
-p | -o привилегированный | Отключает $ENV обработка файлов и импорт функций оболочки. 9Параметр 0005 -p включен по умолчанию, если реальный и эффективный идентификаторы пользователей не совпадают.![]() |
-t | -o onecmd | Читает одну команду и затем выходит. |
-u | -o nounset | Обрабатывает неустановленные или неопределенные переменные как ошибку при подстановке (во время параметра расширение). Не применяется к специальным параметрам, таким как подстановочный знак 9.0005 * или @ . |
-v | -o подробный | Выводит строки ввода оболочки при их чтении. |
-x | -o xtrace | Выводит аргументы команды во время выполнения. |
-B | -o braceexpand | Выполняет расширение раскоса оболочки.![]() |
-C | -o noclobber | Предотвращает перезапись существующих обычных файлов путем перенаправления вывода. По умолчанию Bash разрешает перенаправленный вывод для перезаписи существующих файлов. |
-E | -o errtrace | Заставляет функции оболочки наследовать прерывание ERR. |
-H | -o histexpand | Включает замену истории стилей. Параметр включен по умолчанию, когда оболочка интерактивна. |
-P | -o физический | Предотвращает переход по символической ссылке при выполнении команд. |
-T | -o функция | Заставляет функции оболочки наследовать ловушку DEBUG.![]() |
-- | н/д | Присваивает остальные аргументы позиционным параметрам. Если нет оставшихся аргументов, сбрасывает позиционные параметры. |
- | н/д | Присваивает все оставшиеся аргументы позиционным параметрам. Отключает -x и -v вариантов. |
н/д | -o emacs | Использует интерфейс редактирования строки в стиле emacs. |
н/д | -o история | Включает историю команд. |
н/д | -o ignoreeof | Оболочка не завершает работу при чтении конца файла. |
н/д | -o интерактивные-комментарии | Разрешает комментарии в интерактивных командах.![]() |
н/д | -o nolog | Не записывает определения функций в файл истории. |
н/д | -o pipefail | Возвращаемое значение конвейера — это состояние последней команды, которая имела ненулевой статус при выходе. Если при выходе ни одна из команд не имела ненулевой статус, значение равно нулю. |
н/д | -o posix | Заставляет Bash соответствовать стандарту, когда операция по умолчанию отличается от стандарта Posix. |
н/д | -o vi | Использует интерфейс редактирования строки, аналогичный vi . |
Примеры команд Linux set
В этом разделе перечислены примеры наиболее распространенных применений команды set
.
Использование команды set без параметров
Запуск команды без параметров или аргументов выводит список всех параметров — имена и значения всех переменных оболочки и функций. Так как список очень длинный, его можно прокручивать с помощью клавиш Page Up и Page Down .
Ниже приведен пример частичного вывода команды set
:
Отладка сценария
Команда set
особенно удобна при отладке сценариев. Используйте -x
с параметром установите команду
, чтобы увидеть, какая команда в вашем сценарии выполняется после результата, что позволяет вам определить результат каждой команды.
В следующем примере показано, как отлаживать сценарии с помощью set -x
. Выполните следующие шаги:
1. Запустите set -x
:
set -x
2. Используйте ваш любимый текстовый редактор (мы используем редактор vi) для создания сценария. Мы создали простой цикл, который позволяет нам видеть -x
эффекты опции:
x=10 в то время как [ $x -gt 0 ]; делать х=$[$х-1] эхо $х спать 2 done
3. Убедитесь, что скрипт выполнен с помощью chmod, чтобы сделать его исполняемым. Этот шаг всегда обязателен перед запуском скрипта . Синтаксис:
chmod +x [имя-сценария.sh]
4. Выполните сценарий. Синтаксис:
./[script-name.sh]
Вывод выводит по одной строке за раз, выполняет ее, показывает результат, если он есть, и переходит к следующей строке.
Еще один способ включить отладку — поместить флаг -x
в строку shebang скрипта:
#!/bin/bash -x
Экспорт скрипта
вариант -a
. Экспорт переменных или функций позволяет использовать их другим подоболочкам и сценариям.
Включите экспорт сценариев, выполнив следующую команду:
set -a
В следующем примере показано, как работает экспорт сценариев. Выполните следующие шаги:
1. Создайте новый скрипт, используя любой редактор. Например:
один=1 два=2 три=3 четыре=4 /bin/bash
Аргумент /bin/bash
отмечает начало новой оболочки.
2. Проверить, работает ли скрипт в новой оболочке:
echo $one $two $three $four
Вывод доказывает, что созданная нами функция была экспортирована и работает даже при запуске новой оболочки.
Выход при сбое команды
Используйте -e
Параметр, указывающий сценарию завершить работу в случае возникновения ошибки во время выполнения. Остановка частично функционального сценария помогает предотвратить проблемы или неправильные результаты.
Создайте сценарий со следующим содержимым для проверки этой опции:
#!/bin/bash установить -е кот несуществующий файл эхо "Конец"
В приведенном выше примере сценарий обнаруживает ошибку при попытке отобразить содержимое nonexistingfile
, поскольку этот файл не существует, что приводит к завершению работы в этот момент. Таким образом, окончательные echo
команда не выполнена.
Примечание: Вы можете использовать команду cat для отображения содержимого файла в окне терминала.
Предотвращение потери данных
По умолчанию Bash перезаписывает существующие файлы. Однако использование параметра -C
настраивает Bash так, чтобы он не перезаписывал существующий файл при перенаправлении вывода с помощью >
, >&
или <>
перенаправляется на этот файл.
Например:
Сначала Bash позволяет перезаписать файл listing.txt
. Однако после запуска команды set -C
Bash выводит сообщение о том, что он не может перезаписать существующий файл.
Отчет о несуществующих переменных
По умолчанию в Bash игнорируются несуществующие переменные и работают с существующими. Использование параметра -u
не позволяет Bash игнорировать несуществующие переменные и сообщает о проблеме.
Например, следующий сценарий не содержит команды set -u
, и Bash игнорирует то, что $var2
не определено.
#!/бин/баш переменная1="123" эхо $var1 $var2
Вывод содержит только $var1
.
Однако изменение сценария и добавление команды set -u
не позволяет Bash игнорировать проблему и сообщает о ней:
#!/bin/bash установить -у переменная1="123" эхо $var1 $var2
Установка позиционных параметров
Команда set
также может назначать значения позиционным параметрам. Позиционный параметр — это переменная оболочки, значение которой указывается с использованием следующего синтаксиса:
$[N]
Значение [N]
— это цифра, обозначающая позицию параметра. Например, $1
— первый позиционный параметр, $2
— второй параметр и т. д.
Например:
установите первый второй третий
Выполнение приведенной выше команды устанавливает первый
для соответствия параметру $1
позиционному параметру, второму 90 007
- $2
и третий
до $3
. Проверьте это с помощью команды echo:
echo $2
Отмените позиционные параметры, запустив:
set --
Split Strings
Используйте команду set
для разделения строк на основе пробелов на отдельные переменные. Например, разделите строки в переменной с именем myvar
, которая говорит «Это тест» .
myvar="Это тест" установить -- $myvar эхо $1 эхо $2 эхо $3 эхо $4
Используйте этот параметр для извлечения и фильтрации информации из выходных данных команды, аналогично тому, что делает команда awk.
Установить флаги allexport и уведомления
Флаг -o allexport
позволяет автоматически экспортировать все впоследствии определенные переменные, а флаг -o notify
указывает оболочке немедленно печатать сообщения о завершении задания.
Чтобы установить флаги, выполните:
set -o allexport -o notify
В следующем примере мы видим, что оболочка уведомляет вас о завершении фонового задания после экспорта сценария:
Примечание : если вы хотите запустить процесс в фоновом режиме, добавьте амперсанд ( и
) в конце команды.
Заключение
Теперь вы знаете, что такое команда set
и как вы можете использовать ее в Linux. Протестируйте различные параметры, чтобы лучше понять команду и максимизировать свой контроль над средой Linux, используемой различными пакетами.
Если вам интересна тема Bash, ознакомьтесь с нашим исчерпывающим руководством по функциям Bash: как их использовать.
Команда Linux Set
Команда Linux set — это встроенная команда оболочки, которая позволяет отображать или устанавливать как переменные оболочки, так и переменные среды. В этом руководстве мы рассмотрим команду set и продемонстрируем различные способы использования утилиты командной строки.
Базовый синтаксис
Команда set имеет следующий синтаксис:
$ command -options arguments
Опции команды
Существует множество опций, которые можно использовать с командой set. Давайте рассмотрим некоторые из них:
- -a: Параметр -a позволяет экспортировать все созданные или измененные переменные или функции.
- -b: Параметр -b немедленно уведомляет пользователя о прекращении фоновых заданий.
- -e: Параметр -e указывает оболочке завершить работу, если команда возвращает ненулевой статус выхода. Проще говоря, оболочка завершает работу при сбое команды.
- -f: Параметр -f отключает создание имен файлов.
- -h: Параметр -h включен по умолчанию. Он находит и запоминает функцию, ожидающую выполнения.
- -n: Опция -n только читает команды, но не может их выполнить.
- -t: Опция -t завершает работу после чтения и выполнения одной команды.
- -u: Параметр -u обрабатывает неустановленные или неопределенные переменные, за исключением специальных параметров, таких как подстановочные знаки (*) или «@», как ошибки при расширении параметра.
- -v: Опция -v выводит строки ввода оболочки по мере их чтения.
- -x: Опция -x выводит аргументы команды во время выполнения
Значения выхода
Ниже приведены значения выхода оболочки, связанные с командой set:
0: Команда выполнена успешно.
- Не удалось выполнить команду из-за неправильного аргумента команды
- Ошибка команды из-за отсутствия ожидаемого аргумента
Команда set без каких-либо параметров
Без каких-либо аргументов команда set выводит список всех переменных оболочки, включая их значения.
Установка позиционных параметров с помощью команды Set
Команда set Linux может использоваться для присвоения значений позиционным параметрам. Позиционный параметр — это переменная в программе оболочки, и его значение обозначается как ${N}, где N — цифра, обозначающая позицию параметра.
Значение $1 — это первый позиционный параметр после имени файла или команды. Значение $2 является вторым параметром и так далее.
Предположим, мы выполняем команду, показанную ниже:
$ set красный синий зеленый
Здесь красный цвет соответствует позиционному параметру $1, синий соответствует параметру $2 и, наконец, зеленый соответствует $3.
Чтобы просмотреть все параметры в порядке $1 $2 $3, запустите команду echo ниже:
$ echo «$*»
Чтобы вывести список первого параметра, выполните:
$ echo $1
Чтобы вывести список второго параметра , запустить:
$ echo $2
И так далее.
Используйте команду Set для отмены всех позиционных параметров
Чтобы отменить позиционные параметры, запустите команду set с двойным дефисом — как показано.
$ set --
Еще раз, если вы попытаетесь перечислить позиционные параметры, вы получите пустой вывод, подразумевая, что они не установлены.
Игнорировать несвязанную переменную
По умолчанию сценарий оболочки игнорирует неопределенную переменную. В скрипте myscript.sh, показанном ниже, переменная $foo еще не определена и, следовательно, не существует.
Когда скрипт запущен, он возвращает пустую строку для строки, содержащей несуществующую переменную, и переходит к выполнению следующей строки:
$ ./myscript.sh
Эта аномалия нежелательна, и разработчики хотели бы получать уведомления в случае неопределенных переменных. Директива set -u в начале скрипта выводит ошибку в оболочке, если скрипт сталкивается с неопределенной переменной.
При повторном запуске скрипта выдается ошибка о несвязанной переменной.
Отображение ошибки, если команда не существует
Обычно, если команда вызывает ошибку и не выполняется, оболочка bash продолжает выполнять оставшиеся команды. Возьмем, к примеру, приведенный ниже сценарий оболочки:
Команда foobar не существует, и при выполнении сценария в оболочке bash должна отображаться ошибка, чтобы показать, что сценарий вызывает проблему. Однако этого не происходит, и оболочка выполняет следующую строку, как показано ниже:
Как и в предыдущем примере, это не очень хорошая практика при написании сценариев оболочки, особенно для обеспечения безопасности и отладки. В идеале сценарий должен останавливаться при обнаружении ошибки. Чтобы справиться с этим сценарием, определите директиву set -e в начале скрипта, как показано.
Когда вы попытаетесь снова запустить сценарий, вы столкнетесь с ошибкой, как показано ниже:
Отобразить ошибку в передаваемых по конвейеру командах
Набор директив -e не работает при работе с переданными по конвейеру командами. Рассмотрим сценарий ниже:
Когда вы запускаете скрипт, он возвращает ошибку, но продолжает выполнять следующую команду:
Чтобы преодолеть это препятствие, передайте директиву set -eo pipefail, как показано:
$ set -eo pipefail
На этот раз сценарий завершается и не выполняет следующую строку.