none
PoSh: Конвеер и Switch RRS feed

  • Вопрос

  • Добрые сутки, уважаемые.
    Я по прежнему не просветлённый.
    $Id_672 и $Id_680 предварительно определены и приравнены нулю. Далее следует:
    PS > Get-EventLog security -newest 100 | Switch ($_.EventId) {672 {$Id_672++} 680 {$Id_680++} }

    Неожиданный токен "{" в выражении или инструкции.
    + Get-EventLog security -newest 100 | Switch ($_.EventId) {672 { <<<< $Id_672++} 680 {$Id_680++} }
        + CategoryInfo          : ParserError: ({:String) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : UnexpectedToken

    Что-то я путаю в логике конвейера или в синтаксисе, но никак не пойму - что именно.
    Заранее блгодарен за ответы.

    8 декабря 2009 г. 9:09

Ответы

  • >неужели нельзя обойтись без Foreach-Object-а ?

    Можно, только дело в том что switch, в отличии от Foreach-Object, не командлет, а оператор языка, и не поддерживает передачу в него данных по конвейеру :) Так что придётся сделать например так:
    Switch (Get-EventLog security -newest 100 | select -expandproperty eventid) {672 {$Id_672++} 680 {$Id_680++} }
    или
    Switch (Get-EventLog security -newest 100) {{$_.eventid -eq 672} {$Id_672++} {$_.eventid -eq 680} {$Id_680++} }

    Но ваша мысль мне нравится, это неплохая идея для v3. Я запостил соответствующее предложение на Microsoft Connect. Будет здорово если все кому эта идея кажется правильной проголосуют там, тогда будут вполне реальные шансы получить такую возможность в следующей версии.
    Вот ссылка - https://connect.microsoft.com/PowerShell/feedback/ViewFeedback.aspx?FeedbackID=518895 Для голосования необходимо зарегистрироваться и подключиться к программе PowerShell.
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Помечено в качестве ответа anyaspid 8 декабря 2009 г. 16:25
    8 декабря 2009 г. 16:09
    Модератор

Все ответы

  • Работает при использовании ForEach-Object.
    PS > Get-EventLog security -newest 100 | Foreach-object $_.EventId {Switch ($_.EventId) {672 {$I
    d_672++} 680 {$Id_680++} }}
    Однако всё равно остаётся вопрос по теме.
    Switch успешно работает с множеством строк при использования параметра -file, неужели нельзя обойтись без Foreach-Object-а ?

    8 декабря 2009 г. 12:54
  • >неужели нельзя обойтись без Foreach-Object-а ?

    Можно, только дело в том что switch, в отличии от Foreach-Object, не командлет, а оператор языка, и не поддерживает передачу в него данных по конвейеру :) Так что придётся сделать например так:
    Switch (Get-EventLog security -newest 100 | select -expandproperty eventid) {672 {$Id_672++} 680 {$Id_680++} }
    или
    Switch (Get-EventLog security -newest 100) {{$_.eventid -eq 672} {$Id_672++} {$_.eventid -eq 680} {$Id_680++} }

    Но ваша мысль мне нравится, это неплохая идея для v3. Я запостил соответствующее предложение на Microsoft Connect. Будет здорово если все кому эта идея кажется правильной проголосуют там, тогда будут вполне реальные шансы получить такую возможность в следующей версии.
    Вот ссылка - https://connect.microsoft.com/PowerShell/feedback/ViewFeedback.aspx?FeedbackID=518895 Для голосования необходимо зарегистрироваться и подключиться к программе PowerShell.
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Помечено в качестве ответа anyaspid 8 декабря 2009 г. 16:25
    8 декабря 2009 г. 16:09
    Модератор