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

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

Ответить
Настройки темы
CMD/BAT - Переменная внутри цикла

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


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

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


Есть батник который проверяет наличие приложения в иис и удаляет его.
Код: Выделить весь код
FOR /f %%a in ('C:\Windows\system32\inetsrv\appcmd list app /path:"/EnergySuite/PR320/Utility.FinanceService" /text:path') Do (
SET AppPath="%%a" 
IF DEFINED AppPath (
echo "%AppPath%"
C:\Windows\system32\inetsrv\appcmd delete app "%AppPath%"
if errorlevel 0 (Echo Delete app "%AppName%" >> CreateApp.log)
))
В консоли такой результат:
Код: Выделить весь код
FOR /F %a in ('C:\Windows\system32\inetsrv\app
cmd list app /path:"/EnergySuite/PR320/Utility.FinanceService" /text:path') Do (
SET AppPath="/EnergySuite/PR320/Utility.FinanceService"
 IF DEFINED AppPath (
echo ""
 C:\Windows\system32\inetsrv\appcmd delete app ""
 if errorlevel 0 (Echo Delete app ""  1>>CreateApp.log )
)
)
Почему пустая переменная AppPath, хотя присвоение есть SET AppPath="/EnergySuite/PR320/Utility.FinanceService"

Отправлено: 13:24, 06-06-2014

 

Ветеран


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

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


Цитата VAbramyak:
Почему пустая переменная AppPath, хотя присвоение есть SET AppPath="/EnergySuite/PR320/Utility.FinanceService" »
Потому что раскрытие переменных окружения происходит в момент входа в «скобки». Т.е., в «echo "%AppPath%"» — переменная окружения «AppPath» будет раскрыта в момент входа в скобки, когда она ещё не существует (а не в сосент выполнения команды «echo …»).

«setlocal enableextensions enabledelayedexpansion» в начале пакетного файла и «!AppPath!» вместо «%AppPath%».

Отправлено: 13:43, 06-06-2014 | #2



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

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


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


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

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


сделал, выводит просто echo !AppPath!, а не значение переменной.

Отправлено: 13:51, 06-06-2014 | #3


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


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

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


тем более я делаю проверку
Код: Выделить весь код
IF DEFINED AppPath

Отправлено: 14:20, 06-06-2014 | #4


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


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

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


Можно прокоментировать в чем моя ошибка?

Отправлено: 14:30, 06-06-2014 | #5


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


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

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


Вложения
Тип файла: rar CreateApp.rar
(651 байт, 7 просмотров)

а почему теперь не работает код
Код: Выделить весь код
set APPCMD=%windir%\system32\inetsrv\appcmd
for /f %%i in ("%0") do set IniFile=%%~dpi\CreateApp.ini


FOR /f "tokens=1,2,3,4,5 Delims=;" %%i in (%IniFile%) do (

for /f "delims=" %%j in ('
 C:\Windows\system32\inetsrv\appcmd list app /path:"/EnergySuite/PR320/Utility.FinanceService" /text:path') do (
set AppPath2="%%j" 
 )
if defined AppPath2 (
 echo %AppPath2%
 C:\Windows\system32\inetsrv\appcmd delete app %AppPath2%
 if errorlevel 0 (
  echo Delete app %AppPath2%>> CreateApp.log
  )
 )

FOR /f %%a in ('%APPCMD% list app /path:"%%i" /text:path') do (
SET AppPath="%%a"
) 
if defined AppPath (
echo %AppPath%
%APPCMD% delete app %AppPath%
if errorlevel 0 (
Echo Delete app %AppPath% >> CreateApp.log
)
)
)
Тестовые файлы прикрепил.

Отправлено: 15:08, 06-06-2014 | #6


Ветеран


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

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


Цитата VAbramyak:
сделал, выводит просто echo !AppPath!, а не значение переменной. »
Стало быть забыли про:
Цитата Iska:
«setlocal enableextensions enabledelayedexpansion» в начале пакетного файла »
Цитата VAbramyak:
тем более я делаю проверку »
Проверка выполняется — поскольку в ней нет раскрытия переменной, а только её имя.

Смотрите:
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sVar=aaaaaaaaaa

(
	set sVar=bbbbbbbbbb

	if defined sVar (
		echo [%sVar%]
		echo [!sVar!]
	)
)

endlocal
exit /b 0
Цитата:
Код: Выделить весь код
[aaaaaaaaaa]
[bbbbbbbbbb]
— в случае «echo [%sVar%]» выводится то значение, которое переменная окружения имела до входа в скобки.

Цитата VAbramyak:
а почему теперь не работает код »
По тому же — повторяю: раскрытие переменных окружения происходит ДО входа в скобки. И уберите пробелы в конце «set AppPath2="%%j" »

Отправлено: 15:14, 06-06-2014 | #7


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


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

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


Цитата Iska:
выводится то значение, которое переменная окружения имела до входа в скобки »
"скобки" - какие именно скобки?

Отправлено: 15:23, 06-06-2014 | #8


Ветеран


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

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


Примерно так (не проверялось):
Код: Выделить весь код
@echo off
setlocal enableextensions enabledelayedexpansion

set sExeFile=%SystemRoot%\system32\inetsrv\appcmd

for /f %%i in ("%0") do set sIniFile=%%~dpi\CreateApp.ini

for /f "usebackq tokens=1,2,3,4,5 Delims=;" %%i in ("%sIniFile%") do (
	for /f "delims=" %%j in ('
		"%sExeFile%" list app /path:"/EnergySuite/PR320/Utility.FinanceService" /text:path'
	) do set sAppPath2=%%j
	
	if defined sAppPath2 (
		"%sExeFile%" delete app "!sAppPath2!" && >>"CreateApp.log" echo Delete app !sAppPath2!
	)
	
	for /f %%a in ('"%sExeFile%" list app /path:"%%i" /text:path') do set sAppPath=%%a
	
	if defined sAppPath (
		"%sExeFile%" delete app "!sAppPath!" && >>"CreateApp.log" echo Delete app !sAppPath!
	)
)

endlocal
exit /b 0
Ваше условие «if errorlevel 0 …» являлось бессмысленным, поскольку всегда истинно («если код возврата равен или больше нуля …»).

Цитата VAbramyak:
"скобки" - какие именно скобки? »
Внутри которых происходит раскрытие. В Вашем случае — самых внешних:
Код: Выделить весь код
…
FOR /f "tokens=1,2,3,4,5 Delims=;" %%i in (%IniFile%) do ()

Отправлено: 15:36, 06-06-2014 | #9


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


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

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


спасибо, буду пробовать

Отправлено: 15:59, 06-06-2014 | #10



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

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

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
CMD/BAT - [решено] Как работать с переменной внутри цикла FOR? alex_past Скриптовые языки администрирования Windows 42 28-11-2018 16:19
CMD/BAT - Переменная из цикла ntro123 Скриптовые языки администрирования Windows 2 23-02-2014 16:25
CMD/BAT - [решено] %errorlevel% внутри цикла всегда 0 apozlevich Скриптовые языки администрирования Windows 5 22-11-2013 18:55
Delphi - Переменная цикла и UInt64 novashdima Программирование и базы данных 12 12-02-2013 19:50
CMD/BAT - [решено] Условия внутри цикла for blackmane Скриптовые языки администрирования Windows 4 02-08-2012 10:01




 
Переход