Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Криво работает сочетание for и set

Ответить
Настройки темы
CMD/BAT - [решено] Криво работает сочетание for и set

Аватара для Boa Soft

Компьютерный шаман


Сообщения: 2910
Благодарности: 956


Конфигурация

Профиль | Сайт | Отправить PM | Цитировать


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


Код: Выделить весь код
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...

-------
Человеческая лень - главная движущая сила технического прогресса.


Отправлено: 00:32, 30-05-2011

 

Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


В блоке кода - тот что в круглых скобках после 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% не могу подтвердить, в этих примерах всё раскрывается
Это сообщение посчитали полезным следующие участники:

Отправлено: 04:37, 30-05-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

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


Googler


Сообщения: 3665
Благодарности: 1563

Профиль | Отправить PM | Цитировать


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

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

Последний раз редактировалось amel27, 30-05-2011 в 07:33. Причина: уточнение

Это сообщение посчитали полезным следующие участники:

Отправлено: 05:04, 30-05-2011 | #3


Новый участник


Сообщения: 24
Благодарности: 4

Профиль | Отправить PM | Цитировать


Урок bat-аники

Отправлено: 17:19, 02-06-2011 | #4


Аватара для Boa Soft

Компьютерный шаман


Сообщения: 2910
Благодарности: 956

Профиль | Сайт | Отправить PM | Цитировать


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

-------
Человеческая лень - главная движущая сила технического прогресса.


Отправлено: 16:37, 16-06-2011 | #5



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » CMD/BAT - [решено] Криво работает сочетание for и set

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Драйвер - [решено] Криво работает звук в Win 7 на Audigy SE alb20 Поиск драйверов, прошивок и руководств 1 04-05-2010 07:54
Прочие - Web-камера не работает. Ошибка 80004005 cannot set frame rate for preview Raspytnik Microsoft Windows 7 3 17-03-2010 22:41
SoundMAX Integrated Digital HD Audio Криво работает. Kelor Непонятные проблемы с Железом 6 02-05-2009 04:39
Решено | не работает сочетание <window>+D,R.. trotsak Microsoft Windows 2000/XP 2 29-04-2006 08:17
Firewall IPFW криво работает kryo Общий по FreeBSD 10 24-06-2005 13:51




 
Переход