Переменные bat: Не работает переменная в кавычках, внутри цикла bat файла?

переменные — (bat) Доступ к переменной из if


Вопрос задан


Изменён
3 года 2 месяца назад


Просмотрен
941 раз

Понадобилось сгородить bat файл и столкнулся с проблемой.
Код с циклом, внутри которого есть условие. И переменная которая назначается если условие срабатывает. Ожидаю увидеть в echo qwe потом ewq, но вижу изначально только присвоенное значение вне цикла (2 раза).

 @echo off 
    SetLocal EnableExtensions
    Set a=q
    Set C=1 3 2
    FOR %%x IN (%C%) DO (
    IF %%x==1 ( 
    Set a=qwe
    echo %a%
    )
    IF %%x==2 (
    Set a=ewq
echo %a%
    )
    )
    pause

если убираю изначальное присваивание Set a=q то получаю и вовсе «режим вывода команд echo отключен» и все. Как назначить и обратиться к переменной?

  • bat
  • переменные

Ожидаю увидеть в echo qwe потом ewq, но вижу изначально только присвоенное значение вне цикла (2 раза).

Надо включить EnableDelayedExpansion и использовать !a!.

При выключенном (не установленном) EnableDelayedExpansion значение переменных фиксируется на момент начала блока, и любое изменение их игнорируется. Даже если оно было абы изменено предыдущей строкой.

При включенном EnableDelayedExpansion значение переменной аналогично фиксируется, и получается зафиксированное значение при обращении, если используется знак процента, либо изменённое, если используется восклицательный знак.

Код для разбора:

@echo off 
cls
SetLocal 
set test=test
echo Without EnableDelayedExpansion
for %%x in (1) do (
    set test=altered
    echo %test%
    echo !test!
)
echo finally: %test%
SetLocal EnableDelayedExpansion
set test=test
echo. 
echo With EnableDelayedExpansion
for %%x in (3) do (
    set test=altered
    echo %test%
    echo !test!
)
echo finally: %test%

если убираю изначальное присваивание Set a=q то получаю и вовсе «режим вывода команд echo отключен»

Надо предусматривать такое событие.

Вот правильный код:

@echo off 
SetLocal EnableExtensions EnableDelayedExpansion
Set a=q
Set C=1 3 2
FOR %%x IN (%C%) DO (
    IF "%%x"=="1" ( 
        Set a=qwe
        echo !a!
    )
    IF "%%x"=="2" (
        Set a=ewq
        echo !a!
    )
)
pause






2







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

Регистрация через Google

Регистрация через Facebook

Регистрация через почту

Отправить без регистрации

Почта

Необходима, но никому не показывается

Отправить без регистрации


Почта

Необходима, но никому не показывается





Нажимая на кнопку «Отправить ответ», вы соглашаетесь с нашими пользовательским соглашением, политикой конфиденциальности и политикой о куки


Пакетный скрипт — Переменные — CoderLessons.

com

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

Аргументы командной строки

Пакетные сценарии поддерживают концепцию аргументов командной строки, в которой аргументы могут быть переданы в пакетный файл при вызове. Аргументы можно вызывать из пакетных файлов через переменные% 1,% 2,% 3 и т. Д.

В следующем примере показан командный файл, который принимает 3 аргумента командной строки и выводит их на экран командной строки.

@echo off 
echo %1 
echo %2 
echo %3

Если вышеуказанный пакетный скрипт хранится в файле с именем test.bat, и мы должны были запустить пакет как

Test.bat 1 2 3

Ниже приведен скриншот того, как это будет выглядеть в командной строке при выполнении командного файла.

Приведенная выше команда производит следующий вывод.

1 
2 
3

Если бы мы запускали партию как

Example 1 2 3 4

Результат будет оставаться таким же, как указано выше. Однако четвертый параметр будет проигнорирован.

Установить команду

Другой способ инициализации переменных – команда set. Ниже приводится синтаксис команды set.

Синтаксис

set /A variable-name=value

где,

  • имя-переменной – это имя переменной, которую вы хотите установить.

  • значение – это значение, которое необходимо установить для переменной.

  • / A – этот переключатель используется, если значение должно иметь числовой характер.

имя-переменной – это имя переменной, которую вы хотите установить.

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

/ A – этот переключатель используется, если значение должно иметь числовой характер.

В следующем примере показан простой способ использования команды set.

пример

@echo off 
set message=Hello World 
echo %message%
  • В приведенном выше фрагменте кода переменная с именем message определяется и устанавливается со значением «Hello World».

  • Чтобы отобразить значение переменной, обратите внимание, что переменная должна быть заключена в знак%.

В приведенном выше фрагменте кода переменная с именем message определяется и устанавливается со значением «Hello World».

Чтобы отобразить значение переменной, обратите внимание, что переменная должна быть заключена в знак%.

Выход

Приведенная выше команда производит следующий вывод.

Hello World

Работа с числовыми значениями

В пакетном скрипте также можно определить переменную для хранения числового значения. Это можно сделать с помощью переключателя / A.

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

@echo off 
SET /A a = 5 
SET /A b = 10 
SET /A c = %a% + %b% 
echo %c%
  • Сначала мы устанавливаем значение 2 переменных, a и b, равным 5 и 10 соответственно.

  • Мы добавляем эти значения и сохраняем в переменной c.

  • Наконец, мы отображаем значение переменной c.

Сначала мы устанавливаем значение 2 переменных, a и b, равным 5 и 10 соответственно.

Мы добавляем эти значения и сохраняем в переменной c.

Наконец, мы отображаем значение переменной c.

Результат вышеупомянутой программы будет 15.

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

@echo off 
SET /A a = 5 
SET /A b = 10 
SET /A c = %a% + %b% 
echo %c% 
SET /A c = %a% - %b% 
echo %c% 
SET /A c = %b% / %a% 
echo %c% 
SET /A c = %b% * %a% 
echo %c%

Приведенная выше команда производит следующий вывод.

15 
-5 
2 
50

Локальные и глобальные переменные

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

В сценариях DOS также есть определение для локальных и глобальных переменных. По умолчанию переменные являются глобальными для всего сеанса командной строки. Вызовите команду SETLOCAL, чтобы сделать переменные локальными для области действия вашего скрипта. После вызова SETLOCAL любые переменные возвращаются после вызова ENDLOCAL, вызова EXIT или когда выполнение достигает конца файла (EOF) в вашем сценарии. В следующем примере показано различие, когда в сценарии установлены локальные и глобальные переменные.

пример

@echo off 
set globalvar = 5
SETLOCAL
set var = 13145
set /A var = %var% + 5
echo %var%
echo %globalvar%
ENDLOCAL

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

  • «Globalvar» определен с глобальной областью действия и доступен по всему сценарию.

  • Переменная ‘var’ определена в локальной области видимости, потому что она заключена между блоками ‘SETLOCAL’ и ‘ENDLOCAL’. Следовательно, эта переменная будет уничтожена, как только будет выполнен оператор ENDLOCAL.

«Globalvar» определен с глобальной областью действия и доступен по всему сценарию.

Переменная ‘var’ определена в локальной области видимости, потому что она заключена между блоками ‘SETLOCAL’ и ‘ENDLOCAL’. Следовательно, эта переменная будет уничтожена, как только будет выполнен оператор ENDLOCAL.

Выход

Приведенная выше команда производит следующий вывод.

13150
5

Вы заметите, что команда echo% var% ничего не даст, потому что после оператора ENDLOCAL переменная ‘var’ больше не будет существовать.

Работа с переменными среды

Если у вас есть переменные, которые будут использоваться в пакетных файлах, то всегда предпочтительнее использовать переменные среды. Как только переменная среды определена, к ней можно получить доступ через знак%. В следующем примере показано, как увидеть JAVA_HOME, определенный в системе. Переменная JAVA_HOME является ключевым компонентом, который обычно используется широким спектром приложений.

@echo off 
echo %JAVA_HOME%

Вывод покажет каталог JAVA_HOME, который будет зависеть от системы к системе. Ниже приведен пример вывода.

окон — разница между %variable% и !variable! в пакетном файле

спросил

Изменено
2 года, 10 месяцев назад

Просмотрено
64к раз

Я пишу пакетный файл, в котором мне нужно вывести строку, содержащую ‘!’ в другой файл. Но когда я повторяю эту строку в другом файле, он удаляет «!» с выхода.

Например:
Ввод:

 set LINE=Привет! выход
эхо !LINE!>>new_file.txt
 

Вывод в new_file.txt:

 Привет, это вывод
 

Кроме того, если вводится

, установите LINE=Hello!! это выход!!
эхо !LINE!>>new_file. txt
 

Вывод в new_file.txt:

 Привет
 

Следовательно, он пропускает ! (восклицательный знак) из вывода в новый_файл.
Если я использую% LINE%, то он просто отображает «эхо включено» в выходной файл.

Пожалуйста, предложите способ решения этой проблемы.

  • окна
  • командная строка
  • пакетный файл

2

Если у вас включено отложенное расширение и вы хотите вывести восклицательный знак, вам нужно экранировать его.

Для экранирования восклицательных знаков не требуется ни одного, один или два знака вставки, в зависимости от размещения.

 @эхо выключено
REM Экранирование не требуется, если отложенное расширение отключено
установить test1=Test1!
setlocal EnableDelayedExpansion
REM Требуется одна каретка
REM Отложенное расширение использует знаки вставки независимо от кавычек, чтобы избежать восклицательного знака.
установите "test2=Test2^!"
REM Требуется два знака вставки
REM Первый знак вставки избегает второго знака вставки в фазе 2 синтаксического анализатора. !
эхо !test1!
эхо !test2!
эхо !test3!
 

Разница между !var! и %var% в блоках объясняются в пакете DOS: почему мои установленные команды ничего не сохраняют?

Объяснение пакетного синтаксического анализатора можно найти в разделе Как интерпретатор команд Windows (CMD.EXE) анализирует сценарии?

1

Кажется, вы вызвали SETLOCAL EnableDelayedExpansion где-то выше в коде. Взгляните сюда, чтобы увидеть, каковы эффекты от этого.

2

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

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

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

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

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

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

Требуется, но никогда не отображается

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

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

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

Функция

— использование переменных .

bat в качестве параметров при вызове сценария PS1 в пакетном сценарии

Я запускаю отчеты в пакетных файлах на нескольких серверах, и мне нужно отправлять электронные письма из этих пакетных файлов, вызывающих сценарий PS1. При использовании определенного набора получателей, темы и тела все работает нормально. Проблема в том, что мне нужен сценарий PS1, чтобы выбрать эти 3 параметра из того, что они есть в файле BAT, поскольку они меняются в каждом отчете. Я глава LINUX, поэтому борюсь с логикой здесь, и любая помощь высоко ценится. Спасибо

Сценарий PS1… (все переменные $ определены в сценарии ps1, а $arg1,2,3 определены, как показано ниже)

 $arg1=$args[0]
$arg2=$args[1]
$arg3=$args[2]
Send-MailMessage -From $MailFrom -To $args1 -Subject $args2 -Body $arg3 -SmtpServer $SMTPServer -Port $SMTPPort -UseSsl -Credential $MailCredential
 

Пакетный сценарий

 SET ROOT_DIR=\\FILEZ01.PATH.COM\INFO$\\OUTPUT\REPORTS
установить FILE_NAME=%s_date%_MY_FILE. txt
установить [email protected]
powershell.exe -ExecutionPolicy Unrestricted -Command ". 'C:\Tasks\scripts\SMTP.ps1' -To %REC_LIST% -Subject "ART Delta Patron test" -Body "%ROOT_DIR%\%FILE_NAME%""
 
  • функция
  • powershell
  • пакетный файл
  • параметры

5

Чтобы именованные параметры работали, объявите блок param(...) в первой строке скрипта:

 param($To,$Subject,$Body)
 

Теперь PowerShell будет автоматически связывать любой аргумент, переданный в -To , с переменной $To внутри скрипта.

Поскольку все параметры имеют одинаковые имена в вашем скрипте и в целевом командлете, вы можете передать их все вместе, пометив $PSBoundParameters :

 Send-MailMessage -From $MailFrom @PSBoundParameters -SmtpServer $SMTPServer -Port $SMTPPort -UseSsl -Credential $MailCredential
 

Вместо этого используйте $Env:BatchVar.