Войти

Показать полную графическую версию : [решено] Криво работает сочетание for и set


Boa Soft
30-05-2011, 00:32
Есть задача читать настройки из файла и заносить их в переменные


rem читаем файл и присваиваем переменные
for /F "eol=; tokens=1,2 delims==" %%I in (settings.ini) do (
if not "%%J"=="" (
set %%I=%%~J
set %%I>> prepare.log
)
)

rem тут пропущено

if defined OEM_URL_File (
echo Add corp shite shortcut to faworites
set OEM_URL_File = %USERPROFILE%\Избранное\%OEM_URL_File%
echo "%OEM_URL_File%" >> prepare.log
echo [DEFAULT] > "%OEM_URL_File%"
echo BASEURL=%OEM_Shite% >> "%OEM_URL_File%"
echo. >> "%OEM_URL_File%"
echo [InternetShortcut] >> "%OEM_URL_File%"
echo URL=%OEM_Shite% >> "%OEM_URL_File%"
echo IDList= >> "%OEM_URL_File%"
echo IconFile=file:///%systemroot%\system32\OOBE\IMAGES\%OEM_Icon%>> "%OEM_URL_File%"
echo IconIndex=1 >> "%OEM_URL_File%"
)

кусок settings.ini

OEM_Manufacturer=System Builder
OEM_Model=PC 2011
OEM_Pfone=X (XXXX) XX-XX-XX
OEM_EMail=test@test.ru
OEM_Shite=http://test.ru
OEM_Logo=oemlogo.bmp
OEM_Icon=main.ico
OEM_EULA=OEM_EULA.txt
;OEM codepage!!!
OEM_URL_File=Техническая поддержка производителя.url

Так вот, странностей две:

1. не работает

set OEM_URL_File = %USERPROFILE%\Избранное\%OEM_URL_File%


OEM_URL_File все равно получается Техническая поддержка производителя.url

2.

OEM_URL_File=%USERPROFILE%\Избранное\Техническая поддержка производителя.url

%OEM_URL_File% получается %USERPROFILE%\Избранное\Техническая поддержка производителя.url

т.е. %USERPROFILE% не раскрывается, например, в C:\Users\Yuri


Уже вечер с этим бьюсь и думаю уже переписать скрипты на vbs...

amel27
30-05-2011, 04:37
В блоке кода - тот что в круглых скобках после if defined - осуществляется подстановка переменной OEM_URL_File, значение которой изменяется в самом блоке. Подстановка %OEM_URL_File% всегда подставляет значение переменной ДО входа в команду или блок - т.е. все последующие изменения игнорируются. Выхода два:

1. Присваивать значение до входа в блок или отказаться от блоков вообще:rem читаем файл и присваиваем переменные
for /F "tokens=1,2 delims==" %%I in (settings.ini) do (
if not "%%~J"=="" (
set %%I=%%~J
set %%I>>prepare.log
)
)

rem тут пропущено

if not defined OEM_URL_File GoTo :OEM_URL_File_Skip
echo Add corp shite shortcut to faworites
set OEM_URL_File=%USERPROFILE%\Избранное\%OEM_URL_File%

echo "%OEM_URL_File%">>prepare.log
(echo [DEFAULT]
echo BASEURL=%OEM_Shite%
echo/
echo [InternetShortcut]
echo URL=%OEM_Shite%
echo IDList=
echo IconFile=file:///%systemroot%\system32\OOBE\IMAGES\%OEM_Icon%
echo IconIndex=1
)>"%OEM_URL_File%"

:OEM_URL_File_Skip
2. Использовать отложенное раскрытие переменных !OEM_URL_File!:rem читаем файл и присваиваем переменные
for /F "tokens=1,2 delims==" %%I in (settings.ini) do (
if not "%%~J"=="" (
set %%I=%%~J
set %%I>> prepare.log
)
)

rem тут пропущено

if defined OEM_URL_File (
echo Add corp shite shortcut to faworites
set OEM_URL_File=%USERPROFILE%\Избранное\%OEM_URL_File%

SETLOCAL EnableDelayedExpansion
>> prepare.log echo "!OEM_URL_File!"
(echo [DEFAULT]
echo BASEURL=%OEM_Shite%
echo/
echo [InternetShortcut]
echo URL=%OEM_Shite%
echo IDList=
echo IconFile=file:///%systemroot%\system32\OOBE\IMAGES\%OEM_Icon%
echo IconIndex=1
)>"!OEM_URL_File!"
ENDLOCAL
)
кроме того, в строке:set OEM_URL_File = %USERPROFILE%\Избранное\%OEM_URL_File%присваивается значение переменной "OEM_URL_File ", а не "OEM_URL_File" (пробелов быть не должно)

P.S. отсутствие раскрытия %USERPROFILE% не могу подтвердить, в этих примерах всё раскрывается

amel27
30-05-2011, 05:04
Перечитал заголовок и вроде понял о чем речь в п.2.

При подстановке в цикле "set %%I=%%~J" переменные и не должны раскрываться, так как раскрытие переменных производится интерпретатором ДО раскрытия параметров FOR (%%I,%%J), как один из вариантов - использовать "двойное раскрытие" через CALL:call set %%I=%%~J

lohi1234567
02-06-2011, 17:19
Урок bat-аники (http://www.rsdn.ru/article/winshell/batanyca.xml)

Boa Soft
16-06-2011, 16:37
При подстановке в цикле "set %%I=%%~J" переменные и не должны раскрываться, так как раскрытие переменных производится интерпретатором ДО раскрытия параметров FOR (%%I,%%J), как один из вариантов - использовать "двойное раскрытие" через CALL: »

Я уже решил проблему именно таким методом. Но, уже после создания темы. А потом забыл пометить тему решенной.




© OSzone.net 2001-2012