Войти

Показать полную графическую версию : Переменная внутри цикла


VAbramyak
06-06-2014, 13:24
Есть батник который проверяет наличие приложения в иис и удаляет его.
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
06-06-2014, 13:43
Почему пустая переменная AppPath, хотя присвоение есть SET AppPath="/EnergySuite/PR320/Utility.FinanceService" »
Потому что раскрытие переменных окружения происходит в момент входа в «скобки». Т.е., в «echo "%AppPath%"» — переменная окружения «AppPath» будет раскрыта в момент входа в скобки, когда она ещё не существует (а не в сосент выполнения команды «echo …»).

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

VAbramyak
06-06-2014, 13:51
сделал, выводит просто echo !AppPath!, а не значение переменной.

VAbramyak
06-06-2014, 14:20
тем более я делаю проверку
IF DEFINED AppPath

VAbramyak
06-06-2014, 14:30
Можно прокоментировать в чем моя ошибка?

VAbramyak
06-06-2014, 15:08
а почему теперь не работает код

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


Тестовые файлы прикрепил.

Iska
06-06-2014, 15:14
сделал, выводит просто echo !AppPath!, а не значение переменной. »
Стало быть забыли про:
«setlocal enableextensions enabledelayedexpansion» в начале пакетного файла »

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

Смотрите:
@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%]» выводится то значение, которое переменная окружения имела до входа в скобки.

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

VAbramyak
06-06-2014, 15:23
выводится то значение, которое переменная окружения имела до входа в скобки »

"скобки" - какие именно скобки?

Iska
06-06-2014, 15:36
Примерно так (не проверялось):
@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 …» являлось бессмысленным, поскольку всегда истинно («если код возврата равен или больше нуля …»).

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

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

)

VAbramyak
06-06-2014, 15:59
спасибо, буду пробовать




© OSzone.net 2001-2012