CMD/BAT - Переменная внутри цикла

Ответить
Аватара пользователя
VAbramyak

CMD/BAT - Переменная внутри цикла

Сообщение VAbramyak »

Есть батник который проверяет наличие приложения в иис и удаляет его.



Код:

Код: Выделить всё

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"
Аватара пользователя
Iska

Re: CMD/BAT - Переменная внутри цикла

Сообщение Iska »

Цитата VAbramyak:



Почему пустая переменная AppPath, хотя присвоение есть SET AppPath="/EnergySuite/PR320/Utility.FinanceService"
CMD/BAT - Переменная внутри цикла




Потому что раскрытие переменных окружения происходит в момент входа в «скобки». Т.е., в «echo "%AppPath%"» — переменная окружения «AppPath» будет раскрыта в момент входа в скобки, когда она ещё не существует (а не в сосент выполнения команды «echo …»).



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

Re: CMD/BAT - Переменная внутри цикла

Сообщение VAbramyak »

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

Re: CMD/BAT - Переменная внутри цикла

Сообщение VAbramyak »

тем более я делаю проверку



Код:

Код: Выделить всё

IF DEFINED AppPath
Аватара пользователя
VAbramyak

Re: CMD/BAT - Переменная внутри цикла

Сообщение VAbramyak »

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

Re: CMD/BAT - Переменная внутри цикла

Сообщение VAbramyak »

а почему теперь не работает код



Код:

Код: Выделить всё

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
)
)
)

Тестовые файлы прикрепил.
Вложения
CreateApp.rar
(651 байт) 0 скачиваний
CreateApp.rar
(651 байт) 0 скачиваний
Аватара пользователя
Iska

Re: CMD/BAT - Переменная внутри цикла

Сообщение Iska »

Цитата VAbramyak:



сделал, выводит просто echo !AppPath!, а не значение переменной.
CMD/BAT - Переменная внутри цикла




Стало быть забыли про:


Цитата Iska:



«setlocal enableextensions enabledelayedexpansion» в начале пакетного файла
CMD/BAT - Переменная внутри цикла





Цитата VAbramyak:



тем более я делаю проверку
CMD/BAT - Переменная внутри цикла




Проверка выполняется — поскольку в ней нет раскрытия переменной, а только её имя.



Смотрите:



Код:

Код: Выделить всё

@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:



а почему теперь не работает код
CMD/BAT - Переменная внутри цикла




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

Re: CMD/BAT - Переменная внутри цикла

Сообщение VAbramyak »

Цитата Iska:



выводится то значение, которое переменная окружения имела до входа в скобки
CMD/BAT - Переменная внутри цикла




"скобки" - какие именно скобки?
Аватара пользователя
Iska

Re: CMD/BAT - Переменная внутри цикла

Сообщение Iska »

Примерно так (не проверялось):



Код:

Код: Выделить всё

@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:



"скобки" - какие именно скобки?
CMD/BAT - Переменная внутри цикла




Внутри которых происходит раскрытие. В Вашем случае — самых внешних:



Код:

Код: Выделить всё

…
FOR /f "tokens=1,2,3,4,5 Delims=;" %%i in (%IniFile%) do (
…
)
Аватара пользователя
VAbramyak

Re: CMD/BAT - Переменная внутри цикла

Сообщение VAbramyak »

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

Вернуться в «Скриптовые языки администрирования Windows»