Содержание

Help по коммандам MS DOS

Help по коммандам MS DOS

set


Вывод, задание и удаление переменных среды cmd.exe.

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

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

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

Изменение команды SET при включении расширенной обработки команд:

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

    SET P

Эта команда выведет значения всех переменных, имена которых начинаются с 'P'.

Если имя переменной не найдено в текущей среде, при возврате команда SET
установит значение ошибки ERRORLEVEL 1.

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

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

    SET /A выражение
    SET /P variable=[promptString]

Ключ /A указывает, что строка справа от знака равенства является числовым
выражением, значение которого вычисляется.
= |= >= , - разделитель операторов При использовании любых логических или двоичных операторов необходимо заключить строку выражения в кавычки. Любые нечисловые строки в выражении рассматриваются как имена переменных среды, значения которых преобразуются в числовой вид перед использованием. Если переменная с указанным именем не определена в системе, вместо нее подставляется нулевое значение. Это позволяет выполнять арифметические операции со значениями переменных среды, причем не нужно вводить знаки % для получения значений. Если команда SET /A вызывается из командной строки, а не из пакетного файла, она выводит окончательное значение выражения. Слева от любого оператора присваивания должно стоять имя переменной среды. Числовые значения рассматриваются как десятичные, если перед ними не стоит префикс 0x для шестнадцатеричных чисел, и 0 для восьмеричных чисел. Например, числа 0x12, и 022 обозначают десятичное число 18.
Обратите внимание на запись восьмеричных числе: 08 и 09 не являются допустимыми числами, так как в восьмеричной системе исчисления цифры 8 и 9 не используются. Ключ /P позволяет установить значение переменной для входной строки, введенной пользователем. Показывает указанное приглашение promptString перед чтением введенной строки. Приглашение promptString может быть пустым. Подстановка переменной среды может быть расширена следующим образом: %PATH:str1=str2% расширит действие переменной среды PATH, заменяя каждое вхождение "str1" в расширенном результате на "str2". "str2" может быть пустой строкой для эффективного удаления вхождений "str1" из расширенного вывода. "str1" может начинаться со звездочки, и в этом случае это будет соответствовать любому началу расширенного вывода до первого вхождения оставшейся части "str1". Можно также использовать строки расширения. %PATH:~10,5% расширит действие переменной среды PATH, затем использует только 5 символов, которые начинаются с 11-го символа (пропустив 10) расширенного результата.
Если длина не указана, по умолчанию используется оставшееся значение переменной. Если оба значения (длина и число пропускаемых символов) отрицательны, следующим используемым значением будет длина значения переменной среды, добавленной к указанному значению пропуска или указанной длины. %PATH:~-10% извлечет последние 10 символов переменной PATH. %PATH:~0,-2% извлечет все символы переменной PATH, за исключением 2-х последних. Наконец, добавлена поддержка связывания времени выполнения для переменных среды окружения. По умолчанию эта поддержка отключена. Ключ /V командной строки CMD.EXE позволяет включать и выключать ее. Для вызова справки, наберите CMD /? Связывание времени выполнения для переменных среды окружения полезно при обходе ограничений раннего связывания, которое происходит при первом чтении текстовой строки, а не при ее выполнении. Следующий пример демонстрирует возникающую проблему при использовании раннего связывания переменных: set VAR=before if "%VAR%" == "before" ( set VAR=after if "%VAR%" == "after" @echo Тело внутреннего оператора сравнения ) Данное сообщение не будет выводиться, т.
к. %VAR% в ОБОИХ выражениях IF подставляется в момент первого использования в первом IF, в том числе и в тело первого ветвления IF, которое является составным выражением. В IF внутри составного выражения в действительности сравниваются значения "before" и "after", что заведомо ложно. Следующий пример демонстрирует подобную ошибку: set LIST= for %i in (*) do set LIST=%LIST% %i echo %LIST% в данном случае список файлов текущей папки никогда не будет построен. Вместо этого, значением переменной LIST будет имя последнего найденного файла. И вновь, это случилось потому, что %LIST% подставляется всего один раз - в момент обработки выражения FOR, когда список еще пуст. Фактически, приведенный фрагмент эквивалентен следующему примеру: for %i in (*) do set LIST= %i в котором имя последнего найденного файла сохраняется в переменной LIST. Связывание времени выполнения для переменных среды окружения происходит при использовании специального символа (восклицательного знака), обозначающего проведение сопоставления во время выполнения.
Если включена поддержка связывания времени выполнения, то для достижения ожидаемых результатов приведенные выше фрагменты должны быть изменены следующим образом: set VAR=before if "%VAR%" == "before" ( set VAR=after if "!VAR!" == "after" @echo Тело внутреннего оператора сравнения ) set LIST= for %i in (*) do set LIST=!LIST! %i echo %LIST% При включенной расширенной обработке команд доступны несколько переменных среды, которые не отображаются в списке, отображаемом при вызове команды SET. Значения этих переменных вычисляются динамически каждый раз при их извлечении. Если пользователь явно задает переменные с одним из этих имен, то это определение перекрывает соответствующее динамическое определение, описанное ниже: %CD% - раскрывается в строку текущей директории. %DATE% - раскрывается в текущую дату, используя тот же формат команды DATE.
%TIME% - раскрывается в текущую дату, используя формат команды TIME. %RANDOM% - раскрывается в случайное десятичное число между 0 и 32767. %ERRORLEVEL% - раскрывается в текущее значение ERRORLEVEL %CMDEXTVERSION% - раскрывается в текущее значение версии расширенной обработки команд. %CMDCMDLINE% - раскрывается в исходную командную строку, которая вызвала командный процессор.


Команда set в командной строке. Команда SET

If Command Extensions are enabled SET changes as follows:

SET command invoked with a variable name , no equal sign or value displays the value of all variables whose prefix matches the name given to the SET command. For example:

would display all variables that begin with the letter «P.»

SET command will set the ERRORLEVEL to 1 if the variable name is not found in the current environment.

SET command will not allow an equal sign to be part of the name of a variable. = |= >=Assignment.

,Expression separator.

If you use any of the logical or modulus operators, you need to enclose the expression string in quotes. Any non-numeric strings in the expression are treated as environment variable names whose values are converted to numbers before using them. If an environment variable name is specified but is not defined in the current environment, then a value of zero is used. Doing this allows you to do arithmetic with environment variable values without having to type all those % signs to get their values. If SET /A is executed from the command line outside of a command script, then it displays the final value of the expression. The assignment operator requires an environment variable name to the left of the assignment operator. Numeric values are decimal numbers unless prefixed by 0x for hexadecimal numbers, and 0 for octal numbers. So 0x12 is the same as 18 is the same as 022. Note: the octal notation can be confusing: 08 and 09 are not valid numbers because 8 and 9 are not valid octal digits.

The /P switch allows you to set the value of a variable to a line of input entered by the user. Displays the specified promptString before reading the line of input. The promptString can be empty.

Environment variable substitution has been enhanced as follows:

%PATH:str1=str2%

would expand the PATH environment variable, substituting each occurrence of str1 in the expanded result with str2 . str2 can be the empty string to effectively delete all occurrences of str1 from the expanded output. str1 can begin with an asterisk, which matches everything from the beginning of the expanded output to the first occurrence of the remaining portion of str1.

May also specify substrings for an expansion.

%PATH:~10,5%

would expand the PATH environment variable, and then use only the 5 characters that begin at the 11th (offset 10) character of the expanded result. If the length is not specified, then it defaults to the remainder of the variable value. If either number (offset or length) is negative, then the number used is the length of the environment variable value added to the offset or length specified.

%PATH:~-10%

would extract the last 10 characters of the PATH variable.

%PATH:~0,-2%

would extract all but the last 2 characters of the PATH variable.

Finally, support for delayed environment variable expansion has been added. This support is always disabled by default, but may be enabled/disabled via the /V command line switch to CMD.EXE. See CMD /?

Delayed environment variable expansion is useful for getting around the limitations of the current expansion that happens when a line of text is read, not when it is executed. The following example demonstrates the problem with immediate variable expansion:

Set VAR=before if «%VAR%» == «before» (set VAR=after; if «%VAR%» == «after» @echo If you see this, it worked)

would never display the message, because %VAR% is expanded when the lie is read into memory. Changes that occur to the variable after that (such as VAR=after in our compound if statement) will not be expanded.

Similarly, the following example will not work as expected:

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

in that it will NOT build up a list of files in the current directory, but instead will set the LIST variable to the last file found. Again, this is because the %LIST% is expanded once when the FOR statement is read, and at that time the LIST variable is empty. So the actual FOR loop we are executing is:

For %i in (*) do set LIST= %i

which keeps setting LIST to the last file found.

Delayed environment variable expansion allows you to use a different character (the exclamation mark) to expand environment variables at execution time. If delayed variable expansion is enabled, the above examples could be written as follows to work as intended:

Set VAR=before if «%VAR%» == «before» (set VAR=after if «!VAR!» == «after» @echo If you see this, it worked) set LIST= for %i in (*) do set LIST=!LIST! %i echo %LIST%

If Command Extensions are enabled, then there are several dynamic environment variables that can be expanded, which don»t show up.

The list of variables displayed by SET. These variable values are computed dynamically each time the value of the variable is expanded. If the user explicitly defines a variable with one of these names, then that definition will override the dynamic one described below:

%CD% — expands to the current directory string.

%DATE% — expands to current date using the same format as DATE command.

%TIME% — expands to current time using the same format as TIME command.

%RANDOM% — expands to a random decimal number between 0 and 32767.

%ERRORLEVEL% — expands to the current ERRORLEVEL value

%CMDEXTVERSION% — expands to the current Command Processor Extensions version number.

%CMDCMDLINE% — expands to the original command line that invoked the command processor.

Windows 2000 and Windows XP recovery console syntax

set =

allowwildcards
allowallpaths
allowremovablemedia
nocopyprompt
Setting the enviroment_variable to true enables the enviroment_variable. By default, these are set to False .

MS-DOS, Windows 95, Windows 98, Windows ME syntax

Displays, sets, or removes Windows environment variables.

SET ]

variableSpecifies the environment variable name.
stringSpecifies a series of characters to assign to the variable.

Type SET without parameters to display the current environment variables.

Set examples

set path=c:\windows\command

Set the path to c:\windows\command.

Notice: Users in Microsoft Windows 2000 and Windows XP may have difficulty defining the set values through the MS-DOS prompt. See the link below for setting variables within Windows.

set

Display all of the set environment variables currently defined.

How to use the set command as a substitute for the choice command in Windows 2000 and Windows XP

In the example below, a user would be prompted to enter an option of 1,2, or 3 to print hello , bye , or test .

@ECHO off
cls
:start
ECHO.
ECHO 1. Print Hello
ECHO 2. Print Bye
ECHO 3. Print Test
set choice=
set /p choice=Type the number to print text.
if not «%choice%»==»» set choice=%choice:~0,1%
if «%choice%»==»1» goto hello
if «%choice%»==»2» goto bye
if «%choice%»==»3» goto test
ECHO «%choice%» is not valid, try again
ECHO.
goto start
:hello
ECHO HELLO
goto end
:bye
ECHO BYE
goto end
:test
ECHO TEST
goto end
:end

Secret commands

If you wanted to hide all your directories from users, you could use:

SET DIRCMD=0

The above command prevents anyone from seeing the directories; however, they can still be accessed. To allow the directories to be visible again, type the command below.

Устанавливает, удаляет и просматривает переменные среды. Вызванная без параметров, команда set выводит список установленных переменных среды и их значений.

Синтаксис

set [[/a [выражение ]] [/p [переменная = ]] строка ]

Параметры

/a Указывает, что параметр строка является вычисляемым числовым выражением. ), либо заключать в кавычки, при использовании символов в параметре строка (например, » строка_содержания& символ » ). При заключении в кавычки строки, содержащей специальные символы, кавычки считаются частью значения переменной среды.

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

    Переменные среды используются для управления работой некоторых пакетных файлов и программ и для управления работой Windows XP и подсистемы MS-DOS. Команда set часто используется в файле Autoexec.nt для установки переменных среды.

  • Вывод текущих установок среды

    Когда команда set вызвана без параметров, на экран будут выведены текущие установки. Обычно эти установки включают переменные COMSPEC и PATH, используемые для поиска программ на диске. Две другие переменные среды, используемые Windows XP — это PROMPT и DIRCMD.

  • Использование параметров

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

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

  • Использование /a

    В следующей таблице представлены операторы, поддерживающие параметр /a , в порядке убывания очередности.

    При использовании логических операторов (&& ||) или оператора остатка от деления (%) заключайте выражение строки в кавычки. Любые нечисловые строки в выражении считаются именами переменной среды, чьи значения преобразованы в числа до обработки. Если указано имя переменной среды, которое не определено в текущем окружении, ей присваивается значение нуля, что позволяет выполнять арифметические операции со значениями переменной среды без использования % для получения значения.

    При выполнении команды set /a из командной строки вне командного сценария, выводится конечное значение выражения.

    Численные значения — это десятичные числа, кроме чисел с префиксами 0× для шестнадцатеричных чисел и 0 для восьмеричных чисел. Таким образом, 0×12 тоже самое, что 18 и 022. Восьмеричное представление можно спутать. Например, 08 и 09 недопустимы, потому что 8 и 9 не являются восьмеричными цифрами.

  • Использование /p

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

  • Поддержка расширения переменной среды с задержкой

    Добавлена поддержка расширения переменной среды с задержкой. Эта поддержка отключена по умолчанию, можно включить или отключить ее с помощью команды cmd /v .

  • Работа с расширениями команды

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

  • Использование команды set в пакетных файлах

    При создании пакетных файлов, используйте команду set для создания переменных и использовании их в качестве числовых переменных от %0 до %9 . 1″

    Для установки переменной среды INCLUDE так, чтобы с ней была связана строка C:\Inc (каталог Inc на диске C), можно использовать следующую команду:

    set include=c:\inc

    Строку C:\Inc можно использовать в пакетных файлах, заключив имя INCLUDE в знаки процента (%). Например, в пакетном файле можно использовать следующую команду для вывода содержимого каталога, на который указывает переменная среды INCLUDE:

    dir %include%

    При выполнении команды строка %include% будет заменена строкой C:\Inc.

    Можно также использовать команду set в пакетной программе, которая добавляет новый каталог к переменной среды PATH. Например:

    @echo off
    rem ADDPATH.BAT добавляет новый каталог
    rem к переменной среды path.
    set path=%1;%path%
    set

    При включенных расширениях команды (установлено по умолчанию) и выполнении команды set со значением, на экран выводятся все переменные среды, соответствующие значению. Например, при вводе в командную строку: set p , результат будет следующим:

    Path=C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem
    PATHEXT=. COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
    PROCESSOR_ARCHITECTURE=x86
    PROCESSOR_IDENTIFIER=x86 Family 6 Model 8 Stepping 1, GenuineIntel
    PROCESSOR_LEVEL=6
    PROCESSOR_REVISION=0801
    ProgramFiles=C:\Program Files
    PROMPT=$P$G

    &nbsp &nbsp Команда 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 )

    Атрибуты

    Атрибуты показанные ниже включаются так -X , а выключаются +X . (Такая перевернутая схема включения/выключения пришла в bash исторически, т.к. опции обычно включались в виде -X . Прямо как с электрическим зарядами)

    Флаг
    Название опцииОписание
    -a allexportАвтоматически отмечает измененные переменные.
    Automatically mark new and altered variables to be exported to subsequent environments.
    -b notifyНе ждет нажатия enter чтобы оповестить о завершившемся в фоне job-е. (Оповещения работают только для управления job-ами)
    -e errexitWhen set, the shell exits when a simple command in a command list exits non-zero (FALSE). This is not done in situations, where the exit code is already checked (if , while , until , || , &&)
    -f noglobОтменяет (globbing)
    -h hashallЗапоминает абсолютное расположение команды если она вызывалась, и использует в следующий раз этот путь (хеширование). Включено по-умолчанию. (см checkhash из списка опций shopt)
    -k keywordРазрешает подставлять значение перемернной среды окружения везде в командной строке, а не только во время вызова команды.
    -m monitorMonitor mode . При управлении job-ами будет выведено короткое описание завершенного в фоне задания. По-умолчанию включено для для интерактивных оболочек с управлением job-ами.
    -n noexecЧитает и парсит команды из скрипта, но не исполняет их . Полезно для проверки сценария на предмет синтаксических ошибок. Игнорируется интерактивными оболочками.
    -o
    Устаналивает или снимает опцию по её длинному имени. Например set -o noglob . Если никакой опции не задано, то выводится список всех опций и их статус.
    -p privilegedВключает привилегированный режим.
    -t onecmdВыходит после чтения и выполнения одной команды.
    -u nounsetРассматривает сброс (unset) переменной как ошибку при выполнении parameter expansion. Неинтерактивные оболочки завершают свое выполнение при такой ошибке.
    -v verboseВыводит прочитанные или введенные строки при выполнении. Полезно при отладке.
    -x xtraceРежим отладки. Перед выполнением команды печатает её со всеми уже развернутыми подстановками и вычислениями.
    -B braceexpandОболочка осуществляет раскрытие скобок. . Эта опция включена по-умолчанию.
    -C noclobberНе перезаписывает файлы в операциях перенаправлениях потока. Вы можете обойти это ограничение используя оператор перенаправления >| там где это необходимо. Смотрите
    -E errtrace ERR -ловушки будут наследоваться функциями оболочки, подстановками команд и командами которые выполняются в окружении подоболочки.
    -H histexpandРазрешены подстановки из истории команд (! -style). По умолчанию включено для интерактивных оболочек.
    -P physicalНе следовать по симлинкам когда изменяются директории, use the physical filesystem structure.
    -T functrace DEBUG — и RETURN -ловушки будут унаследованы последующими средами. Аналогично как -E для ERR -ловушек.

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

    If no arguments follow, the positional parameters are unset. With arguments, the positional parameters are set, even if the strings begin with a — (dash) like an option.
    Длинные опции, -o у которых нет короткого экивалента.

    emacsВключает emacs -стиль для редактирования команд. По-умолчанию включена.

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

    ignoreeofТакой же эффект как и команды IGNOREEOF=10 . Смотрите shell variables .

    nolog(В настоящее время игнорируется. currently ignored)

    pipefailIf set, the exit code from a pipeline is different to the normal («last command in pipeline») behaviour: TRUE when no command failed, FALSE when something failed (code of the rightmost command that failed)

    posixКогда эта опция установлена — Bash работает в режиме POSIX .

    viВключает

    Устанавливает, удаляет и просматривает переменные среды. Вызванная без параметров, команда set выводит список установленных переменных среды и их значений.

    Синтаксис

    set [[/a [выражение ]] [/p [переменная = ]] строка ]

    Параметры

    /a Указывает, что параметр строка является вычисляемым числовым выражением. ), либо заключать в кавычки, при использовании символов в параметре строка (например, » строка_содержания& символ » ). При заключении в кавычки строки, содержащей специальные символы, кавычки считаются частью значения переменной среды.

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

    Переменные среды используются для управления работой некоторых пакетных файлов и программ и для управления работой Windows XP и подсистемы MS-DOS. Команда set часто используется в файле Autoexec.nt для установки переменных среды.

  • Вывод текущих установок среды

    Когда команда set вызвана без параметров, на экран будут выведены текущие установки. Обычно эти установки включают переменные COMSPEC и PATH, используемые для поиска программ на диске. Две другие переменные среды, используемые Windows это PROMPT и DIRCMD.

  • Использование параметров

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

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

  • Использование /a

    В следующей таблице представлены операторы, поддерживающие параметр /a , в порядке убывания очередности.

    При использовании логических операторов (&& ||) или оператора остатка от деления (%) заключайте выражение строки в кавычки. Любые нечисловые строки в выражении считаются именами переменной среды, чьи значения преобразованы в числа до обработки. Если указано имя переменной среды, которое не определено в текущем окружении, ей присваивается значение нуля, что позволяет выполнять арифметические операции со значениями переменной среды без использования % для получения значения.

    При выполнении команды set /a из командной строки вне командного сценария, выводится конечное значение выражения.

    Численные значения это десятичные числа, кроме чисел с префиксами 0x для шестнадцатеричных чисел и 0 для восьмеричных чисел. Таким образом, 0x12 тоже самое, что 18 и 022. Восьмеричное представление требует аккуратности. Например, 08 и 09 недопустимы, потому что 8 и 9 не являются восьмеричными цифрами.

  • Использование /p

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

  • Поддержка расширения переменной среды с задержкой

    Добавлена поддержка расширения переменной среды с задержкой. Эта поддержка отключена по умолчанию, можно включить или отключить ее с помощью команды cmd /v .

  • Работа с расширениями команды

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

  • Использование команды set в пакетных файлах

    При создании пакетных файлов, используйте команду set для создания переменных и использовании их в качестве числовых переменных от %0 до %9 . 1″

    Для установки переменной среды INCLUDE так, чтобы с ней была связана строка C:\Inc (каталог Inc на диске C), можно использовать следующую команду:

    set include=c:\inc

    Строку C:\Inc можно использовать в пакетных файлах, заключив имя INCLUDE в знаки процента (%). Например, в пакетном файле можно использовать следующую команду для вывода содержимого каталога, на который указывает переменная среды INCLUDE:

    При выполнении команды строка %include% будет заменена строкой C:\Inc.

    Можно также использовать команду set в пакетной программе, которая добавляет новый каталог к переменной среды PATH. Например:

    @echo off
    rem ADDPATH.BAT добавляет новый каталог
    rem к переменной среды path.
    set path=%1;%path%
    set

    При включенных расширениях команды (установлено по умолчанию) и выполнении команды set со значением, на экран выводятся все переменные среды, соответствующие значению. Например, при вводе в командную строку: set p , результат будет следующим:

    Path=C:\WINNT\system32;C:\WINNT;C:\WINNT\System32\Wbem
    PATHEXT=. COM;.EXE;.BAT;.CMD;.VBS;.VBE;.JS;.JSE;.WSF;.WSH
    PROCESSOR_ARCHITECTURE=x86
    PROCESSOR_IDENTIFIER=x86 Family 6 Model 8 Stepping 1, GenuineIntel
    PROCESSOR_LEVEL=6
    PROCESSOR_REVISION=0801
    ProgramFiles=C:\Program Files
    PROMPT=$P$G

    Некоторые приемы и особенности работы с командой Set можно посмотреть в разделе Арифметическая обработка данных .

    Для вопросов, обсуждений, замечаний, предложений и т. п. можете использовать раздел форума этого сайта (требуется регистрация).

    Cmd работа с переменными • Вэб-шпаргалка для интернет предпринимателей!

    Содержание

    • 1 ЗАМЕНА ОДНОЙ ПОДСТРОКИ НА ДРУГУЮ В ФАЙЛЕ
    • 2 Вывод на экран, в файл текста без перевода строки
    • 3 Вычисление длины строковой переменной
    • 4 Получение подстроки.
    • 5 Удаление ведущих и замыкающих пробелов.
    • 6 Рекомендуем к прочтению

    &nbsp &nbsp Команда 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:UsersUsrAppDataRoaming
    CommonProgramFiles=C:Program FilesCommon Files
    COMPUTERNAME=TEST7
    ComSpec=C:windowssystem32cmd.exe
    FP_NO_HOST_CHECK=NO
    HOMEDRIVE=C:
    HOMEPATH=UsersUsr
    LOCALAPPDATA=C:UsersUsrAppDataLocal
    LOGONSERVER=\TEST7
    NUMBER_OF_PROCESSORS=2
    OS=Windows_NT
    Path=C:windowssystem32;C:windows;
    PATHEXT=.COM;.EXE;.BAT;.CMD;.VBS; .VBE;.JS;.JSE;.WSF;.WSH;.MSC
    PROCESSOR_ARCHITECTURE=x86
    PROCESSOR_ > PROCESSOR_LEVEL=15
    PROCESSOR_REVISION=0304
    ProgramData=C:ProgramData
    ProgramFiles=C:Program Files
    PROMPT=$P$G
    PSModulePath=C:windowssystem32Windows PowerShellv1. 0Modules
    PUBLIC=C:UsersPublic
    SystemDrive=C:
    SystemRoot=C:windows
    TEMP=C:UsersUsrAppData LocalTemp
    TMP=C:UsersUsrAppData LocalTemp
    USERDOMAIN=test7
    USERNAME=Usr
    USERPROFILE=C:UsersUsr
    windir=C:windows

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

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

    Если при вызове команды SET указать только часть имени, то будет выведен список переменных, имена которых начинаются с указанной строки.
    |
    =
    ,— группировка
    — арифметические операторы
    — арифметические операторы
    — двоичный сдвиг
    — двоичное И
    — двоичное исключающее ИЛИ
    — двоичное ИЛИ
    — присвоение
    — разделитель операторов

    При использовании любых логических или двоичных операторов необходимо заключить строку выражения в кавычки. Любые нечисловые строки в выражении рассматриваются как имена переменных среды, значения которых преобразуются в числовой вид перед использованием. Если переменная с указанным именем не определена в системе, вместо нее подставляется нулевое значение. Это позволяет выполнять арифметические операции со значениями переменных среды, причем не нужно вводить знаки % для получения значений. Если команда 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 )

    1 EXIT /b for %%a in («A=a» «B=b» «C=c» «D=d» «E=e» «F=f» «G=g» «H=h» «I=i» «J=j» «K=k» «L=l» «M=m» «N=n» «O=o» «P=p» «Q=q» «R=r» «S=s» «T=t» «U=u» «V=v» «W=w» «X=x» «Y=y» «Z=z» «А=а» «Б=б» «В=в» «Г=г» «Д=д» «Е=е» «Ж=ж» «З=з» «И=и» «К=к» «Л=л» «М=м» «Н=н» «О=о» «П=п» «Р=р» «С=с» «Т=т» «У=у» «Ф=ф» «Х=х» «Ц=ц» «Ч=ч» «Ш=ш» «Щ=щ» «Ь=ь» «Ы=ы» «Ъ=ъ» «Э=э» «Ю=ю» «Я=я») do ( call set %

    ЗАМЕНА ОДНОЙ ПОДСТРОКИ НА ДРУГУЮ В ФАЙЛЕ

    Для выполнения этой операции можно использовать утилиту sbs2. com
    Традиция и дошедший комментарий приписывает авторство Herbert Kleebauer. Получить эту программку можно выполнив следующий бат файл:

    x>viH>`LYNBGyA?@xAB?sUq`>>sbs2.com
    echo LRy@PwtCYQEuFK@A

    BxPtDss@fFqjVmzD@qBEOEenU?`eHHeBCMs?FExep>>sbs2.com
    echo LHsPBGyA?@xAunjzA>EKNs@CA?wQpQpKLBHv?s`WJ`LRCYyIWMJaejCksl>>sbs2.com
    echo H[GyFGhHBwHZjjHeoFasuFUJeHeB?OsQH[xeHCPvqFj@oq@eNc?

    >>sbs2.com
    echo CK>Ayre

    В результате, в папке, где будет запущен приведенный выше текст, создастся файл sbs2.com.
    Возможно, вы будете приятно удивлены его размером — 659 БАЙТ!
    Те, кому вышеприведенные изыски кажутся излишними, могут скачать готовую утилиту здесь.
    Использование:
    sbs2.com 0 «Old String» «New String» outfile
    Осуществляется замена всех вхождений Old String на New String в файле infile. Результат запишется в файл outfile.

    Такую задачу можно решить без использования сторонних программ, только средствами bat !
    Ниже приведен пример с использованием локальной процедуры txtrepl

    Вывод на экран, в файл текста без перевода строки

    В bat/cmd командах не предусмотрена возможность вывода данных без перевода строки. Но для решения такой задачи можно использовать некую уловку.
    Команда set с параметром, предусматривающим ввод данных с экрана, позволяет вывести подсказку для ввода без перевода строки. Вот этим мы и воспользуемся.
    b.txt

    Использование этого приема в сочетании с символом backspace (код 08) позволяет сделать вывод на экран изменяемого текста и как вариант — «вращающейся палки».

    Вычисление длины строковой переменной

    В bat/cmd командах нет функции, позволяющей вычислять длину строковой переменной. А такая задача возникает не так уж и редко. Однако средств командного языка достаточно, для того что бы решить такую задачу, не прибегая к использованию специальных программ. Рассмотрим несколько вариантов решения данной задачи:

    1 :startvarcount if not defined var exit /b set var=%var:

    1% set /a %2+=1 goto startvarcount exit /b

    Еще один вариант вычисления длины строковой переменной:

    1″ GoTo :EOF :StringLenLoop Set /A $StringLen+=1 Call Set $StringChr=%%$StringBuf:

    %$StringLen%%% If «»==»%$StringChr%» GOTO :EOF GoTo :StringLenLoop

    Еще один способ определения длины строки, как ни странно — достаточно быстрый:

    n0. tmp» For %%i In («%TEMP%\%

    n0.tmp») Do Set /A z=%%

    Ну и, наконец, решение, поразившее меня своей математической лаконичностью:

    1!»&rem keep the A up front to ensure we rem get the length and not the upper bound rem it also avo SET /a %

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

    !BB!,1%% if «!sim!» == «» ( set /a mmax=!BB!) else ( set /a mmin=!BB! ) ) ENDLOCAL & SET /a %

    2=%mmin% EXIT /b %mmin%

    Получение подстроки.

    Если смещение начала подстроки и ее длина являются константами — здесь все достаточно просто и аналогичный пример рассматривался выше:

    Прошу прощения, если в качестве значения переменной str я опубликовал чей-то пароль )).
    Если же одна или обе эти величины — переменные, то решение будет не столь простое.
    Здесь встретиться возможно не совсем обычное применение команды CALL. Немного глубже об этом на странице Полезное в разделе Особенности использования команды CALL. Там же рассмотрен и этот пример.
    Итак, рассмотрим возможные решения:

    Или как вариант предыдущего

    Удаление ведущих и замыкающих пробелов.

    %curpos%,1! if «!SUBD!» == «» GoTo :formrez if NOT «!SUBD!» == » » ( if !firstnoblank! == -1 set firstnoblank=!curpos! set lastnoblank=!curpos! ) set /a curpos = !curpos!+1 GoTo :StringLenLoop :formrez set /a n1=!firstnoblank!-1 set /a n2=!lastnoblank!-!firstnoblank!+1 if !firstnoblank! == -1 (set «rez=») else (set rez=!%1:

    Объявление собственных переменных является неотъемлемой часть практически любого языка программирования, так в языке vbscript они объявляются с помощью ключевого слова dim, а в jscript – используется ключевое слово var.

    Переменные командной строки Windows представляют немного другой характер, тут нельзя объявить группу переменных cmd, или же сразу присвоить значения нескольким переменным в командной строке. Давайте посмотрим на следующие строчки кода:

    В данном примере, с помощью ключевого слова cmd set мы поэтапно объявили три переменные (Var1, Var2 и Var3), как и в языке vbscript, в cmd регистр символов не играет роли, поэтому, данные строчки выведут фразу «Привет Мир. «

    Стоит учитывать один момент, запись

    это не одно и тоже, то есть, в первом случае мы создаем cmd переменную «var1», а во втором – «var1 «. С присвоением значений аналогичная ситуация, так что обращайте внимание на пробел.

    Видим, что бы вывести значение переменной с помощью функции Echo, мы заключаем ее в символ «%», для set – просто прописываем ее имя, так же стоит учитывать, что всем переменным присваивается строковой тип.

    Если вы запустите на выполнение команду cmd set, которая выводит список всех переменных и их значений в текущем сеансе, то увидите, что там будут присутствовать и только что созданные cmd переменные и переменные среды. » экранирования не один раз, а трижды:

    Теперь при выполнении кода:

    все пройдет успешно.

    Как и в сценариях сервера Windows Script Host, переменные в командной строке Windows могут содержать заданную область видимости.

    Область видимости – блок кода, за пределами которого нельзя получить доступ к переменным, объявленным в нем. Довольно ясно значение области видимости проявляется при роботе с функциями, по этому вопросу можете прочить статью «Урок 3 по JScript: Объявление пользовательских функций».

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

    Что бы задать локальную область видимости, используется блок SETLOCAL … ENDLOCAL . Все cmd переменные командной строки Windows, объявленные в середине данного блока не будут видны за его пределами. Откройте редактор (я использую редактор Notepad++, так как он сразу подсвечивает код), и пропишите в нем следующие строчки кода:

    Видим, что вначале мы объявили var1 и присвоили ей значение 0, далее мы снова объявили переменную с аналогичным именем, но уже в блоке SETLOCAL … ENDLOCAL . В сценарии происходит вывод значения как локальной, так и глобальной var1. Я специально использовал латинские знаки, что бы у вас в случае чего не выводились крякозябры.

    Спасибо за внимание. Автор блога Владимир Баталий

    cmd — команда set/p в пакетных файлах

    Спросил

    Изменено 5 лет, 9 месяцев назад

    Просмотрено 20k раз

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

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

     >@эхо выкл.
    Скрытие файла title
    :Начало
    клс
    Эхо Вы хотите скрыть или показать папку?
    эхо.
    эхо.
    set/p cho=Выбор:
    if %cho% equ Скрыть перейти к
    если %cho% equ скрыть перейти к
    if %cho% equ Показать перейти к b
    если %cho% equ показать скрыть перейти к b
    if %cho% neq Скрыть goto c
    :с
    клс
    echo Это неверный выбор
    Пауза
    перейти к началу
    :а
    клс
    echo Введите имя папки, которую вы хотите скрыть:
    эхо.
    эхо.
    set/p name=Имя папки:
    если СУЩЕСТВУЕТ %name% перейти к файлу
    если НЕ СУЩЕСТВУЕТ %name% перейти к 99
    :файл
    атрибут +h +s +r %имя%
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    эхо-задание завершено
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    выход
    :б
    клс
    echo Введите имя папки, которую вы хотите увидеть:
    эхо. 
    эхо.
    set/p name=Имя папки:
    если СУЩЕСТВУЕТ %name%, перейдите ниже
    если НЕ СУЩЕСТВУЕТ %name% перейти к 98
    :рев
    атрибут -h -s -r %имя%
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    эхо-задание завершено
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    перейти к вопросу
    :вопрос
    клс
    эхо Вы хотите открыть эту папку/файл?
    эхо.
    эхо.
    set/p yn=Ответ[y:n]
    если %yn% equ y перейти к 1
    если %yn% equ n перейти к 2
    если %yn% equ Y перейти к 1
    если %yn% equ n перейти к 2
    if %yn% neq y goto 3
    :1
    начать %имя%
    выход
    :2
    выход
    :3
    клс
    эхо Неверный выбор
    Пауза
    перейти к вопросу
    выход
    :99
    клс
    эхо Это имя файла не существует
    Пауза
    иди к
    :98
    клс
    эхо, что имя файла не существует
    Пауза
    перейти к б
     
    • пакетный файл
    • cmd

    4

    Вам нужны двойные кавычки, например:

     set/p "name=Имя папки: "
    если СУЩЕСТВУЕТ "%name%" перейти к файлу
    если НЕ СУЩЕСТВУЕТ "%name%" перейти к 99
    :файл
    атрибут +h +s +r "%name%"
     

    и /i делают тест нечувствительным.

     if /i "%cho%" equ "Скрыть" goto a
     

    1

    Везде, где у вас есть %var% и var содержит пробелы, вам нужно использовать "%var%" . Заключение строки в кавычки означает, что пробел не интерпретируется как разделитель. И если вы используете оператор IF , то кавычки должны быть сбалансированы по обе стороны от оператора сравнения.

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

    Также содержит предупреждение о недопустимых записях.

     set /p entry=ВСТАВЬТЕ ИНСТРУКЦИЮ ЗДЕСЬ, введите ОПЦИИ(S), затем нажмите клавишу ввода:
    ЕСЛИ /I НЕ %entry%==N IF /I %entry%==Y GOTO M1
    ЕСЛИ /I НЕ %entry%==Y IF /I %entry%==N ПЕРЕЙТИ К M2
    ЕСЛИ /I НЕ %entry%==N IF /I НЕ %entry%==Y ПЕРЕЙТИ К M3
    :М1
    echo Вот куда указывает 'Y'. 
    цвет около
    пинг 127.0.0.1 -n 2 -w 100 > ноль
    цвет 4а
    пинг 127.0.0.1 -n 2 -w 500 > ноль
    цвет около
    пинг 127.0.0.1 -n 2 -w 500 > ноль
    цвет 4а
    пинг 127.0.0.1 -n 2 -w 500 > ноль
    цвет 0а
    ПЕРЕЙТИ НАЧАТЬ
    :КОНЕЦ
     

    Я заметил пару ошибок в коде, который вы запрограммировали, поэтому я сделал для вас улучшенную версию!

    Исходный код:

     @echo off
    Скрытие файла title
    :Начало
    клс
    Эхо Вы хотите скрыть или показать папку?
    эхо.
    эхо.
    set/p cho=Выбор:
    if %cho% equ Скрыть перейти к
    если %cho% equ скрыть перейти к
    if %cho% equ Показать перейти к b
    если %cho% equ показать скрыть перейти к b
    if %cho% neq Скрыть goto c
    :с
    клс
    echo Это неверный выбор
    Пауза
    перейти к началу
    :а
    клс
    echo Введите имя папки, которую вы хотите скрыть:
    эхо.
    эхо.
    set/p name=Имя папки:
    если СУЩЕСТВУЕТ %name% перейти к файлу
    если НЕ СУЩЕСТВУЕТ %name% перейти к 99
    :файл
    атрибут +h +s +r %имя%
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    эхо-задание завершено
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    выход
    :б
    клс
    echo Введите имя папки, которую вы хотите увидеть:
    эхо. 
    эхо.
    set/p name=Имя папки:
    если СУЩЕСТВУЕТ %name%, перейдите ниже
    если НЕ СУЩЕСТВУЕТ %name% перейти к 98
    :рев
    атрибут -h -s -r %имя%
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    эхо-задание завершено
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    перейти к вопросу
    :вопрос
    клс
    эхо Вы хотите открыть эту папку/файл?
    эхо.
    эхо.
    set/p yn=Ответ[y:n]
    если %yn% equ y перейти к 1
    если %yn% equ n перейти к 2
    если %yn% equ Y перейти к 1
    если %yn% equ n перейти к 2
    if %yn% neq y goto 3
    :1
    начать %имя%
    выход
    :2
    выход
    :3
    клс
    эхо Неверный выбор
    Пауза
    перейти к вопросу
    выход
    :99
    клс
    эхо Это имя файла не существует
    Пауза
    иди к
    :98
    клс
    эхо, что имя файла не существует
    Пауза
    перейти к б
     

    Модифицированная версия:

     @echo off
    Скрытие файла title
    :Начало
    клс
    Эхо Вы хотите скрыть или показать папку?
    эхо. 
    эхо.
    set/p cho=Выбор:
    if %cho% equ Скрыть goto :a
    если %cho% equ скрыть goto :a
    if %cho% equ Показать goto :b
    если %cho% equ отобразить перейти к :b
    иначе иди :с
    :с
    клс
    echo Это неверный выбор
    Пауза
    перейти к началу
    :а
    клс
    echo Введите имя папки, которую вы хотите скрыть:
    эхо.
    эхо.
    set/p name=Имя папки:
    если СУЩЕСТВУЕТ %name% перейти к :file
    если НЕ СУЩЕСТВУЕТ %name% перейти к :99
    :файл
    атрибут +h +s +r %имя%
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    эхо-задание завершено
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    выход
    :б
    клс
    echo Введите имя папки, которую вы хотите увидеть:
    эхо[
    эхо[
    set/p name=Имя папки:
    если СУЩЕСТВУЕТ %name% перейти к :ниже
    если НЕ СУЩЕСТВУЕТ %name% перейти к :98
    :рев
    атрибут -h -s -r %имя%
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    эхо-задание завершено
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    пинговать локальный хост -5 > ноль
    перейти :вопрос
    :вопрос
    клс
    эхо Вы хотите открыть эту папку/файл?
    эхо. 
    эхо.
    set/p yn=Ответ[y:n]
    если %yn% equ y перейти к 1
    если %yn% equ n выход
    если %yn% equ Y перейти к 1
    если %yn% equ n выход
    иначе иди :3
    :1
    начать %имя%
    :3
    клс
    эхо Неверный выбор
    Пауза
    перейти :вопрос
    :99
    клс
    эхо Это имя файла не существует
    Пауза
    перейти: а
    :98
    клс
    эхо, что имя файла не существует
    Пауза
    иди :б
     

    Надеюсь, это прояснило для вас пару вещей, если есть какие-либо ошибки с кодом (в этом XD было много строк), дайте мне знать ниже!

    Твой ответ

    Зарегистрируйтесь или войдите

    Зарегистрироваться через Google

    Зарегистрироваться через Facebook

    Зарегистрируйтесь, используя электронную почту и пароль

    Опубликовать как гость

    Электронная почта

    Требуется, но не отображается

    Опубликовать как гость

    Электронная почта

    Требуется, но не отображается

    командная строка — Использование «SET /P» внутри оператора IF

    Вопрос

    Изменено 5 лет, 5 месяцев назад

    Просмотрено 10k раз

    Я создаю пакет, чтобы превратить свой ноутбук в Wi-Fi, чтобы облегчить себе жизнь каждый раз вводить строки в cmd.

    Проблема в том, что имя Wi-Fi всегда устанавливается на ключ = вместо того, которое я ввожу.

    Вот что я сделал:

     @эхо ВЫКЛ.
    set /p option="Введите 1, чтобы создать Wi-Fi, введите 2, чтобы отключить Wi-Fi"
    ЕСЛИ %опция% EQU 1 (
        установить / р
        установить ключ /p="Установить пароль:"
        netsh wlan set hostednetwork mode=allow ssid = %id% key = %key%
        netsh wlan запустить размещенную сеть
    )
    ЕСЛИ %опция% EQU 2 (
    netsh wlan set hostednetwork mode=disallow
    )
    тайм-аут /t 5
     
    • командная строка
    • пакетный файл
    • cmd

    Хотя у вас не должно быть пробелов между переключателем и знаком равенства или знаком равенства и параметром, настоящий виновник заключается в том, что вы используете SET /P внутри инструкции IF .

    Чтобы исправить это, вам нужно сделать две вещи:

    1. Добавить Setlocal EnableDelayedExpansion в начало вашего пакетного файла после оператора @ECHO OFF (чтобы переменные в IF блок может быть расширен во время выполнения).

    2. Поскольку мы сейчас используем EnableDelayedExpansion , вызовите все свои переменные, используя !! вместо %% , например:

      netsh wlan set hostednetwork mode=allow ssid=!id! ключ =! ключ!

    6

    Есть решение

     @echo off
    эхо Что делать?
    эхо 1 для создания Wi-Fi
    эхо 2, чтобы остановить Wi-Fi
    установить / p ввод =
    если %input%==1 перейти к 1
    если %input%==2 перейти к 2
    :1
    клс
    set /p name=Введите имя Wi-Fi
    set /p pass=Введите пароль Wi-Fi
    echo Создание Wi-Fi с помощью
    эхо-имя = %name%
    эхо-пароль = %pass%
    netsh wlan set hostednetwork mode=allow ssid="%name%" key="%pass%"
    netsh wlan запустить размещенную сеть
    тайм-аут /t 5
    выход;
    :2
    клс
    netsh wlan set hostednetwork mode=disallow
    выход;
    тайм-аут /t 5
     

    1

     @эхо выключено
    setlocal enabledelayedexpansion
    SET /P myvar="Введите переменные: "
    установить аргкаунт = 0
    для %%x в (%myvar%) сделать (
       установить /A argCount+=1
       установить "argVec[!argCount!]=%%~x"
    )
    echo Количество обработанных аргументов: %argCount%
    for /L %%i in (1,1,%argCount%) делать (
        echo %%i- "!argVec[%%i]!"
    )
     

    Результатом вызова функции будет:

     function. bat
    Введите переменные: a b c
    1- "а"
    2- "б"
    3- "в"
     

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

    2

    Вот еще один способ сделать это. Я также удалил пробелы вокруг ssid= и key=, так как это может быть проблемой.

     @эхо ВЫКЛ.
    установить «опция =»
    set /p "option=Введите имя, чтобы создать Wi-Fi, или просто нажмите Enter, чтобы остановить Wi-Fi: "
    ЕСЛИ опция не определена (
    netsh wlan set hostednetwork mode=disallow
    перейти :EOF
    )
        установить ключ /p="Установить пароль:"
        netsh wlan set hostednetwork mode=разрешить ssid=%option% key=%key%
        netsh wlan запустить размещенную сеть
    тайм-аут /t 5
     

    Не знаю, в чем проблема, у меня эта упрощенная версия кода работает нормально:

     @echo OFF
    set /p option="Введите 1, чтобы создать Wi-Fi, введите 2, чтобы отключить Wi-Fi"
    ЕСЛИ %опция% EQU 1 (
        эхо Вариант 1
    )
    ЕСЛИ %опция% EQU 2 (
        эхо Вариант 2
    )
    тайм-аут /t 5
     

    Это мои выходные данные — пакетный файл был назван «z. bat»

     C:\z>z
    Введите 1, чтобы создать Wi-Fi, введите 2, чтобы остановить Wi-Fi 1
    Опция 1
    Подождав 2 секунды, нажмите клавишу для продолжения...
    С:\г>г
    Введите 1, чтобы создать Wi-Fi, введите 2, чтобы остановить Wi-Fi 2
    Вариант 2
    Подождав 4 секунды, нажмите клавишу для продолжения...
    С:\г>
    C:\z>команда /версия
    Microsoft Windows [версия 6.1.7601]
    Авторское право (с) 2009Корпорация Майкрософт. Все права защищены.
     

    1

    Твой ответ

    Зарегистрируйтесь или войдите в систему

    Зарегистрируйтесь с помощью Google

    Зарегистрироваться через Facebook

    Зарегистрируйтесь, используя электронную почту и пароль

    Опубликовать как гость

    Электронная почта

    Требуется, но не отображается

    Опубликовать как гость

    Электронная почта

    Требуется, но не отображается

    Пакетные файлы — Как.

    .. Проверить ввод из SET /P Пакетные файлы — Как… Проверить ввод из SET /P

    В сентябре 2014 г. компания The Security Factory раскрыла уязвимость, связанную со вставкой команд для сценариев командной оболочки (пакетных файлов), с болезненной ясностью показала, что пакетные файлы могут быть уязвимы для эксплойтов.

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

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

    Проверка командной строки и альтернативные файлы параметров обсуждаются на отдельной специальной странице.

     

    Безопасное использование

    SET /P приглашение для ввода
    Проблема: вставка кода

    Удобный способ запросить ввод данных пользователем — встроенная в Windows команда SET :

     SET /P "Ввод=Пожалуйста, введите что-нибудь и нажмите Enter: " 

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

    Пока нет риска…

    Попробуйте: при появлении запроса введите abc&ping ::1 и нажмите клавишу Enter.

    Пока ничего особенного не произошло…

    Введите команду SET Input , чтобы узнать, был ли ваш ввод сохранен в переменной среды Input :

     Ввод=abc&ping ::1 

    Однако при вводе команды ECHO %Input% вывод будет выглядеть так:

     азбука
    
    Пинг ::1 с 32 байтами данных:
    Ответ от ::1: время <1 мс
    Ответ от ::1: время <1 мс
    Ответ от ::1: время <1 мс
    Ответ от ::1: время <1 мс
    
    Статистика пинга для ::1:
        Пакеты: отправлено = 4, получено = 4, потеряно = 0 (0% потерь),
    Приблизительное время прохождения туда и обратно в миллисекундах:
        Минимум = 0 мс, Максимум = 0 мс, Среднее значение = 0 мс 

    Почему?

    Объяснение состоит в том, что амперсанд действует как «разделитель команд»: все, что следует за (одиночным) амперсандом, будет интерпретироваться как новая команда.
    ECHO %Input% оценивается как ECHO abc&ping ::1 , который, в свою очередь, интерпретируется как:

     ЭХО абв
    пинг :: 1 
    Примечание: Эта проблема аналогична некотируемой уязвимости %CD% , связанной со вставкой кода (хотя вероятность ее эксплуатации – пока меньше).

    Для уязвимости %CD% без кавычек решение состоит в том, чтобы поместить переменную между двойными кавычками: "%CD%" ; это работает, потому что %CD% никогда не будет содержать двойные кавычки (если, конечно, эта динамическая переменная не имеет статического значения).
    Однако с SET /P пользователь может ввести что угодно при появлении запроса, включая амперсанды и случайные двойные кавычки.

    Предположим, мы должны поместить %Input% между двойными кавычками; попробуйте:

     ЭХО "%Ввод%" 

    и на выходе будет:

     "abc&ping ::1" 

    Пока хорошо выглядит. ..
    Но теперь повторите команду SET /P и введите abc"&ping::1&echo"oops и посмотрите, что произойдет с ECHO "%Input%" :

     "азбука"
    
    Пинг ::1 с 32 байтами данных:
    Ответ от ::1: время <1 мс
    Ответ от ::1: время <1 мс
    Ответ от ::1: время <1 мс
    Ответ от ::1: время <1 мс
    
    Статистика пинга для ::1:
        Пакеты: отправлено = 4, получено = 4, потеряно = 0 (0% потерь),
    Приблизительное время прохождения туда и обратно в миллисекундах:
        Минимум = 0 мс, Максимум = 0 мс, Среднее = 0 мс
    "ой" 

    Ой, действительно!

    Решение: расширение переменной с задержкой

    До недавнего времени я считал, что безопасный синтаксический анализ ввода — это игра в кошки-мышки, и никогда не выиграют.

    Затем Кан-Че Сун предложил гениальное и удивительно простое решение проблемы: используйте раскрытие переменной с задержкой!

    Я прочитал вашу страницу о проверке SET /P и информацию об уязвимости внедрения команд (которую я также обнаружил во время написания кода).
    Мое личное решение состоит в том, чтобы просто использовать Delayed Expansion для этой переменной, и (согласно моему тесту) ничего не будет выполнено или неправильно проанализировано, и точка.

    Я действительно считаю, что Delayed Expansion является окончательным решением этой проблемы SET /P, и с ним вам не нужны никакие трюки с эхо-конвейером для findstr.

     SETLOCAL EnableDelayedExpansion
    SET /P var="Введите что-нибудь здесь:"
    ЭХО .!вар!.
    Кавычки полосы ECHO: .!var:"=!.
    REM Если вы действительно хотите отклонить переменную с любой кавычкой...
    ЭХО !вар! | НАЙТИ """" >NUL && SET var=
    РЭМ Вот именно. 

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

    Чтобы понять , почему это работает, нам нужно понять , как интерпретатор команд обрабатывает командные строки.

    Цитируя Тимоти Хилла из его книги «Сценарии оболочки Windows NT» (текст, выделенный красным цветом, добавлен вашим покорным слугой):

    1. Все ссылки на параметры и переменные разрешаются [. ..].
    2. Составные команды разбиваются на отдельные команды, каждая из которых обрабатывается по отдельности в соответствии со следующими шагами [...]. На этом этапе также обрабатываются линии продолжения.
    3. Разрешены отложенные ссылки на переменные. (1)
    4. Команда разделена на имя команды и аргументы.
    5. Если имя команды , а не указывает путь, оболочка пытается сопоставить имя команды со списком внутренних команд оболочки. Если совпадение найдено, выполняется внутренняя команда. В противном случае оболочка переходит к шагу 5.
    6. Если в имени команды указан путь, оболочка ищет по указанному пути исполняемый файл, соответствующий имени команды. Если совпадение найдено, выполняется внешняя команда (исполняемый файл). Если совпадений не найдено, оболочка сообщает об ошибке, и обработка команды завершается.
    7. Если в имени команды не указан путь, оболочка ищет в текущем каталоге исполняемый файл, соответствующий имени команды. Если совпадение найдено, выполняется внешняя команда (исполняемый файл). Если совпадений не найдено, оболочка переходит к шагу 7.
    8. Теперь оболочка ищет исполняемый файл, соответствующий имени команды, в каждом каталоге, указанном в переменной среды PATH, в указанном порядке. Если совпадение найдено, выполняется внешняя команда (исполняемый файл). Если совпадений не найдено, оболочка сообщает об ошибке, и обработка команды завершается.

    Расширение переменной с задержкой происходит на шаге 3 (отмечено красным), тогда как вставка кода может происходить только на шаге 2.

    Примечания: 1: Расширение переменной с задержкой (шаг 3, отмечен красным) не упоминается в книге Тима Хилла; этот шаг мне объяснил Кан-Че Сун.
      2: Шаги 5. .8 описывают, как находится исполняемый файл для указанной команды, эти шаги не относятся к этому объяснению вставки кода.

    Цитата из объяснения Кан-Че Сона:

    1. Расширение в процентах %var% и %1 ... %9
      (Этот шаг кратко объясняет, почему для токенов FOR нужны знаки двойного процента в сценариях. Поскольку этот шаг будет обрабатываться по-другому, если CMD находится в интерактивном режиме, то есть в режиме, в котором вы вводите команды)
    2. Разделение команд. Ручки "(" ")" "&" "|" Разделители "<" ">" (и новой строки). (Здесь происходит внедрение команды.)
    3. Задержка расширения. В это время ( ) & | < > больше не является специальным и поэтому не будет разбиваться на дополнительные команды или каналы.
    4. Разделение слов. Технически это просто определяет, какая часть является командой (%0), а какая частью является аргументами (%*). В отличие от сценариев Unix, где все части аргументов ($1 $2 $3...) на этом этапе разделяются, оболочки Windows просто передают всю строку аргументов внешней (вызываемой) программе и позволяют ей обрабатывать ее самостоятельно. (Это объясняет, почему сценарии оболочки Unix допускают «$@» в дополнение к «$*».)
    5. Остальные шаги с 5 по 8 касаются определения путей к командам и поэтому для нас не имеют значения.

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

    Следующий код проверит, содержит ли %Input% двойные кавычки, и если да, сотрет ввод:

     УСТАНОВИТЬ Ввод | НАЙТИ """" > NUL
    ЕСЛИ НЕ ОШИБКА УРОВЕНЬ 1 УСТАНОВИТЬ Ввод = 

    Аналогично, вы можете использовать НАЙТИ "&" для проверки наличия амперсандов, или FINDSTR /R /C:"[&""|()]" для проверки всех "сомнительных" символов:

     (
    УСТАНОВИТЬ ввод | FINDSTR/R/C:"[&""|()]"
    ЕСЛИ НЕ ОШИБКА УРОВЕНЬ 1 УСТАНОВИТЬ Ввод=
    ) >НУЛ
     
    Примечания: 3: Скотт Самнер отметил, что при перенаправлении вывода FINDSTR на NUL в пакетном файле код возврата ("ErrorLevel") всегда будет равен 0.
    Именно поэтому для FINDSTR , перенаправление на NUL выполняется после того, как сначала проверит код возврата.
      4: Более короткий код SET Input | FINDSTR /R /C:"[&""|()]" && SET Input= не работает в Windows 7 (не тестировалось в других версиях Windows).
    Хотя (SET Input | FINDSTR /R /C:"[&""|()]") && SET Input= работает с , вложенные круглые скобки, необходимые для перенаправления на NUL, могут привести к новым проблемам.
    Мой совет — сделать это простым и безопасным и использовать тест IF NOT ERRORLEVEL 1 .

     

    Альтернативы для
    КОМПЛЕКТ/P

    Вам не всегда нужен «бесплатный» ввод, часто вы хотите, чтобы пользователь выбирал только из списка вариантов.
    В этом случае рассмотрите возможность использования CHOICE вместо SET /P

    .

    Если вам действительно нужен "бесплатный" ввод, используйте либо описанную выше процедуру, либо другой язык сценариев, либо мой InputBox.