Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Переменная внутри цикла (http://forum.oszone.net/showthread.php?t=283245)

VAbramyak 06-06-2014 13:24 2360729

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

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 2360737

Цитата:

Цитата VAbramyak
Почему пустая переменная AppPath, хотя присвоение есть SET AppPath="/EnergySuite/PR320/Utility.FinanceService" »

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

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

VAbramyak 06-06-2014 13:51 2360741

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

VAbramyak 06-06-2014 14:20 2360748

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

IF DEFINED AppPath

VAbramyak 06-06-2014 14:30 2360752

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

VAbramyak 06-06-2014 15:08 2360766

Вложений: 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
)
)
)

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

Iska 06-06-2014 15:14 2360773

Цитата:

Цитата 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" »

VAbramyak 06-06-2014 15:23 2360776

Цитата:

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

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

Iska 06-06-2014 15:36 2360782

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

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

)


VAbramyak 06-06-2014 15:59 2360794

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


Время: 03:45.

Время: 03:45.
© OSzone.net 2001-