Пакетный файл повторяется до тех пор, пока не отобразится определенный текст

В настоящее время есть пакетный файл для замены разрешений NTFS с помощью команд takeown и icacls, я добавил эти команды в цикл, и он отлично работает.

Есть ли способ выйти из цикла, когда отображается определенный ответ? например "Ошибка обработки 0 файлов" или что-то в этом роде? код, который я использую, приведен ниже, надеюсь, это поможет и другим людям.

@echo off
setlocal enabledelayedexpansion
for /l %%x in (1,1,1000) do (

    echo Taking ownsership of Folders & Files - loop %%x
    for /f "delims=" %%i in ('takeown.exe /R /A /F "F:\Shares\NetBackup Clients" /D N ^| findstr /i /C:"Failed processing 0 files"') do (
        set "error=%%i"
        if "!errorlevel!"=="0" goto :end
    )

    echo Applying permissions to filestore - loop %%x
    icacls.exe "F:\Shares\NetBackup Clients" /grant "Domain\Group":F /grant "Domain\Group":R /T /C

    echo Finished applying permissions to filestore - loop %%x >> C:\Loopy.txt
)
goto :eof
:end
echo %error% 

Огромное спасибо


person Mark Mckie    schedule 21.03.2019    source источник
comment
Проверьте условие с помощью if и goto :label за пределами for (блок кода)   -  person    schedule 21.03.2019


Ответы (1)


Я думаю, что у вас может быть ошибка в неправильном направлении, поэтому вам нужно будет настроить ее соответствующим образом, но мы используем findstr, и если мы удовлетворяем требованию (errorlevel равно 0), мы выходим из цикла.

@echo off
setlocal enabledelayedexpansion
for /l %%x in (1,1,1000) do (
    echo %%x
    for /f "delims=" %%i in ('takeown.exe /R /A /F "\\fileserver\share\" /D N ^| findstr /i "Failed processing 0 files"') do (
        set "error=%%i"
        if "!errorlevel!"=="0" goto :end
    )
    echo Finished takeown >> C:\Loopy.txt
    icacls.exe "\\fileserver\share\" /grant "Domain\Group":F /grant "Domain\Group":R /T /C
    echo Finished icacls >> C:\Loopy.txt
    echo Loop %%x >> C:\Loopy.txt
)
goto :eof
:end
echo %error% 
person Gerhard    schedule 21.03.2019
comment
Да, спасибо за это, команда takeown должна быть внутри цикла! но это здорово! большое спасибо! действительно помогло. - person Mark Mckie; 21.03.2019
comment
Извините, возможно, я что-то перепутал, команда takeown создает текст, из которого нужно выйти из цикла. после того, как произойдет ошибка обработки 0 файлов, я в последний раз запущу команду icacls вручную. Так происходит takeown -> icacls -> takeown -> icacls -> takeown и т. д., пока не отобразится текст из команды takeown. Прости - person Mark Mckie; 21.03.2019
comment
затем просто замените командную строку icacls в цикле на процесс снятия.. т.е. for /f "delims=" %%i in ('takedown...)... - person Gerhard; 21.03.2019
comment
отредактированный ответ, чтобы продемонстрировать, что я имею в виду ... вам нужно будет изменить и протестировать, поскольку я не могу воспроизвести среду. - person Gerhard; 21.03.2019
comment
Я сделал это, но процесс, похоже, не завершается, он просто снова запускает цикл. - person Mark Mckie; 21.03.2019
comment
Ааа, так мне не нужно использовать findstr? - person Mark Mckie; 21.03.2019
comment
Да, это то, что у меня есть сейчас, но все еще зацикливается - person Mark Mckie; 21.03.2019
comment
является ли строка findstr точно такой же, как Failed processing 0 files, вам нужно убедиться, что строка верна, иначе она не будет совпадать .. или лучше, вы хотите отловить только ошибку, содержащую failed? так было бы проще.. - person Gerhard; 21.03.2019
comment
Да, это работает, но сбой должен быть только в 0 файлах, так как это будет конец цикла. - person Mark Mckie; 21.03.2019
comment
Нет, он просто продолжает зацикливаться - person Mark Mckie; 21.03.2019
comment
Пожалуйста, добавьте echo EL !errorlevel! перед set "error=%%i" и сообщите мне номер уровня ошибки, который он возвращает. - person Gerhard; 21.03.2019
comment
Я добавил его в строке выше set error=%%i, и он ничего не выводит на экран. - person Mark Mckie; 21.03.2019
comment
тогда он не выдает цикл for, кажется. Не могли бы вы отредактировать свой вопрос и опубликовать точный сценарий, как сейчас? - person Gerhard; 21.03.2019
comment
о .. просто попробуйте что-нибудь еще .. из команды finstr удалите это /C: Я уже сделал это в ответе. - person Gerhard; 21.03.2019