none
foreach и continue RRS feed

  • Вопрос

  • Объясните дураку почему не работает так как надо данный скрипт:

    $proc = Get-Process
    $Proc | Foreach {
        If ($_.Name -eq "Explorer") {Continue}
        $_.Name
    }
    echo !!!!!!!!!

    Как только в процесе итерации натыкаемся на процесс Explorer работа скрипта прекращается, хотя по идее должен пропустится один проход. С break такая же история

     


    22 ноября 2011 г. 14:28

Ответы

  • Здесь Foreach это Foreach-Object, т.е. командлет, а не оператор цикла.

    Вот пример разницы http://blogs.msdn.com/b/jmanning/archive/2007/03/22/powershell-gotcha-foreach-keyword-vs-foreach-object-cmdlet.aspx


    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    • Предложено в качестве ответа KazunEditor 22 ноября 2011 г. 20:09
    • Помечено в качестве ответа Rinat Moustafin 23 ноября 2011 г. 5:48
    22 ноября 2011 г. 14:42
    Модератор
  • Здесь Foreach это Foreach-Object, т.е. командлет, а не оператор цикла.

    Вот пример разницы http://blogs.msdn.com/b/jmanning/archive/2007/03/22/powershell-gotcha-foreach-keyword-vs-foreach-object-cmdlet.aspx


    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/


    Вот из справки Powershell:

    Инструкция Continue в скрипте вызывает немедленный возврат
    программного потока в начало самого внутреннего цикла, управляемого
    любой из следующих инструкций: For, Foreach и While.

    Из Вашего примера я понял что Continue не работает при передаче массива объектов по конвееру, но работает если объекты создаются внутри командлета Foreach. Правильно?


    Continue работает,но ведет себя немного по другому,об этом в сылке сказано.Передается не массив,а скалярные значения(если вы передаете коллекцию через конвеер, PowerShell автоматически разбивает ее на части.Для того чтобы явно передать,что это коллекция,надо использовать "," - ,$proc.). Другое поведение continue наблюдается,когда используется цикл foreach(ключевое слово),о чем опять выше сказано. Foreach-Object - это комадлет,который имеет два псевдонима % и foreach.В PowerShell нельзя создавать псевдонимы на ключевые слова,но если не используется ,как первый оператор в команде,то можно использовать псевдонимы.

     


    • Изменено KazunEditor 22 ноября 2011 г. 20:17
    • Помечено в качестве ответа Rinat Moustafin 23 ноября 2011 г. 5:48
    22 ноября 2011 г. 19:50
    Отвечающий

Все ответы

  • Здесь Foreach это Foreach-Object, т.е. командлет, а не оператор цикла.

    Вот пример разницы http://blogs.msdn.com/b/jmanning/archive/2007/03/22/powershell-gotcha-foreach-keyword-vs-foreach-object-cmdlet.aspx


    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/
    • Предложено в качестве ответа KazunEditor 22 ноября 2011 г. 20:09
    • Помечено в качестве ответа Rinat Moustafin 23 ноября 2011 г. 5:48
    22 ноября 2011 г. 14:42
    Модератор
  • Здесь Foreach это Foreach-Object, т.е. командлет, а не оператор цикла.

    Вот пример разницы http://blogs.msdn.com/b/jmanning/archive/2007/03/22/powershell-gotcha-foreach-keyword-vs-foreach-object-cmdlet.aspx


    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/


    Вот из справки Powershell:

    Инструкция Continue в скрипте вызывает немедленный возврат
    программного потока в начало самого внутреннего цикла, управляемого
    любой из следующих инструкций: For, Foreach и While.

    Из Вашего примера я понял что Continue не работает при передаче массива объектов по конвееру, но работает если объекты создаются внутри командлета Foreach. Правильно?

    22 ноября 2011 г. 19:21
  • Здесь Foreach это Foreach-Object, т.е. командлет, а не оператор цикла.

    Вот пример разницы http://blogs.msdn.com/b/jmanning/archive/2007/03/22/powershell-gotcha-foreach-keyword-vs-foreach-object-cmdlet.aspx


    Сазонов Илья http://www.itcommunity.ru/blogs/sie-wl/


    Вот из справки Powershell:

    Инструкция Continue в скрипте вызывает немедленный возврат
    программного потока в начало самого внутреннего цикла, управляемого
    любой из следующих инструкций: For, Foreach и While.

    Из Вашего примера я понял что Continue не работает при передаче массива объектов по конвееру, но работает если объекты создаются внутри командлета Foreach. Правильно?


    Continue работает,но ведет себя немного по другому,об этом в сылке сказано.Передается не массив,а скалярные значения(если вы передаете коллекцию через конвеер, PowerShell автоматически разбивает ее на части.Для того чтобы явно передать,что это коллекция,надо использовать "," - ,$proc.). Другое поведение continue наблюдается,когда используется цикл foreach(ключевое слово),о чем опять выше сказано. Foreach-Object - это комадлет,который имеет два псевдонима % и foreach.В PowerShell нельзя создавать псевдонимы на ключевые слова,но если не используется ,как первый оператор в команде,то можно использовать псевдонимы.

     


    • Изменено KazunEditor 22 ноября 2011 г. 20:17
    • Помечено в качестве ответа Rinat Moustafin 23 ноября 2011 г. 5:48
    22 ноября 2011 г. 19:50
    Отвечающий