2015-11-08 1 views
0

У меня есть текстовый файл с именами обновления MS Windows:Переменная не работает внутри, если заявление, когда используется в цикле с enabledelayedexpansion

... 
KB3072019 
KB3044374 
KB3011780 
KB3083711 
... 

И имея папку с

downloaded updates

:

Моя цель - проверить, обновляется ли загрузка или нет в соответствии с текстовым файлом.

@echo off 
set /a x=0 
setlocal ENABLEDELAYEDEXPANSION 

for /F "tokens=*" %%A in (d:\WindowsUpdate.log) do (
set /a x=x+1 
echo Update number !x!, name %%A, state: 
IF EXIST d:\!Del\Win8Updates_x64\Merged\*%%A*.cab (echo Downloaded) ELSE (echo MISSING!) 
) 
pause 

Результат должен быть таким:

Update number 83, name KB3045999, state: 
MISSING 
Update number 84, name KB3045746, state: 
Downloaded 
Update number 85, name KB3066441, state: 
Downloaded 
Update number 86, name KB3071663, state: 
MISSING 

Но на самом деле это выглядит следующим образом:

Update number 83, name KB3045999, state: 
MISSING 
Update number 84, name KB3045746, state: 
MISSING 
Update number 85, name KB3066441, state: 
MISSING 
Update number 86, name KB3071663, state: 
MISSING 

Мой вопрос: почему %% А, не работает внутри, если заявление?

Важно: Я не хочу пропустить номера строк, потому что они представляют порядок обновлений. Позже я изменить сценарий, чтобы скопировать/переместить существующие обновления в другое место с приставкой это порядковый номер, как 83_windows8.1-kb3045999-x64.cab

ответ

1

Существует путь, содержащий восклицательный знак, d:\!Del, что вызывает проблему, потому что когда включено замедленное расширение, удаляется !. Это также верно для эхо-текста MISSING!. Удаление @echo off временно позволит вам увидеть это поведение при просмотре вывода.

Чтобы избежать этого, есть (по крайней мере) следующие параметры:

  1. Экранирования восклицательных знаков:

    @echo off 
    set /A x=0 
    setlocal EnableDelayedExpansion 
    
    for /F "tokens=*" %%A in (d:\WindowsUpdate.log) do (
        set /A x+=1 
        echo Update number !x!, name %%A, state: 
        if exist "d:\^!Del\Win8Updates_x64\Merged\*%%A*.cab" (
         echo Downloaded 
        ) else (
         echo MISSING^^! 
        ) 
    ) 
    endlocal 
    pause 
    
  2. Отключение замедленного расширения временно:

    @echo off 
    set /A x=0 
    setlocal EnableDelayedExpansion 
    
    for /F "tokens=*" %%A in (d:\WindowsUpdate.log) do (
        set /A x+=1 
        echo Update number !x!, name %%A, state: 
        setlocal DisableDelayedExpansion 
        if exist "d:\!Del\Win8Updates_x64\Merged\*%%A*.cab" (
         echo Downloaded 
        ) else (
         echo MISSING! 
        ) 
        endlocal 
    ) 
    endlocal 
    pause 
    
  3. Включение задержанного расширения только там, где это необходимо:

    @echo off 
    set /A x=0 
    setlocal DisableDelayedExpansion 
    
    for /F "tokens=*" %%A in (d:\WindowsUpdate.log) do (
        set /A x+=1 
        setlocal EnableDelayedExpansion 
        echo Update number !x!, name %%A, state: 
        endlocal 
        if exist "d:\!Del\Win8Updates_x64\Merged\*%%A*.cab" (
         echo Downloaded 
        ) else (
         echo MISSING! 
        ) 
    ) 
    endlocal 
    pause 
    
+0

Отлично, спасибо большое, удаление или замена '!' 'С ^!' Решить эту проблему! Мне определенно нужно прекратить использование восклицательных знаков в моем коде. :) – Paleee

Смежные вопросы