Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Криво работает сочетание for и set (http://forum.oszone.net/showthread.php?t=207829)

Boa Soft 30-05-2011 00:32 1684834

Криво работает сочетание for и set
 
Есть задача читать настройки из файла и заносить их в переменные


Код:

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 1684864

В блоке кода - тот что в круглых скобках после 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 1684869

Перечитал заголовок и вроде понял о чем речь в п.2.

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

call set %%I=%%~J

lohi1234567 02-06-2011 17:19 1687200

Урок bat-аники

Boa Soft 16-06-2011 16:37 1695691

Цитата:

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

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


Время: 23:36.

Время: 23:36.
© OSzone.net 2001-