Переменная внутри цикла
Есть батник который проверяет наличие приложения в иис и удаляет его.
Код:
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"
|
Цитата:
Цитата VAbramyak
Почему пустая переменная AppPath, хотя присвоение есть SET AppPath="/EnergySuite/PR320/Utility.FinanceService" »
|
Потому что раскрытие переменных окружения происходит в момент входа в «скобки». Т.е., в «echo "%AppPath%"» — переменная окружения «AppPath» будет раскрыта в момент входа в скобки, когда она ещё не существует (а не в сосент выполнения команды «echo …»).
«setlocal enableextensions enabledelayedexpansion» в начале пакетного файла и « !AppPath !» вместо «%AppPath%».
|
сделал, выводит просто echo !AppPath!, а не значение переменной.
|
тем более я делаю проверку
|
Можно прокоментировать в чем моя ошибка?
|
Вложений: 1
а почему теперь не работает код
Код:
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
)
)
)
Тестовые файлы прикрепил.
|
Цитата:
Цитата 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" »
|
Цитата:
Цитата 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
"скобки" - какие именно скобки? »
|
Внутри которых происходит раскрытие. В Вашем случае — самых внешних:
Код:
…
FOR /f "tokens=1,2,3,4,5 Delims=;" %%i in (%IniFile%) do (
…
)
|
Время: 03:45.
© OSzone.net 2001-