Лучший отвечающий
foreach и continue

Вопрос
-
Объясните дураку почему не работает так как надо данный скрипт:
$proc = Get-Process
$Proc | Foreach {
If ($_.Name -eq "Explorer") {Continue}
$_.Name
}
echo !!!!!!!!!Как только в процесе итерации натыкаемся на процесс Explorer работа скрипта прекращается, хотя по идее должен пропустится один проход. С break такая же история
- Изменено Rinat Moustafin 22 ноября 2011 г. 14:31
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Отвечающий