Проблема назначения переменной в пакетном файле DOS для цикла

У меня проблема с назначением переменных внутри цикла DOS-скрипта for. Он никогда не присваивает значение, оно всегда пустое. Ниже пример кода

@echo off
set ans=%1
SET STRING=%ans:"=%

echo Parsing the string "%STRING%":
for /f "tokens=1-2" %%a in ("%STRING%") do (
 set Word1 =%%a
 echo Word 1: %%a
 echo Word 1: %Word1%
 set Word2 =%%b
 if %%b.==. (Set server =\\.\pipe\mssql$microsoft##ssee\sql\query ) else (Set server =%%b)
)
echo Server name "%server%"
sqlcmd -s %server%

значение %%a не присвоено переменной Word1. Но когда я повторяю %%a, он показывает правильное значение. Также в последнем пустом значении проверьте условие, переменная сервера никогда не устанавливается. Я очень запутался здесь. Кто-нибудь может мне помочь??

P.S: вводом для скрипта является любая строка из двух слов (например: a.bat "l dev-server")


person RameshVel    schedule 06.09.2010    source источник


Ответы (1)


Вам нужно использовать отложенное расширение - !Word1! вместо %Word1%.

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

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

person Michael Madsen    schedule 06.09.2010
comment
Однако будьте осторожны, как объясняется на этой странице ss64.com/nt/setlocal.html, расширение не включено по умолчанию. Чтобы включить его, вам нужно добавить эту строку в свой скрипт: SETLOCAL EnableDelayedExpansion - person Diego Tercero; 31.10.2012