none
PoSh: Ошибка при перенаправлении вывода Write-Output. RRS feed

  • Вопрос

  • Добрые сутки, уважаемые.
    Помогите пожалуйста разобраться в ситуации.

    Есть два текстовых файла. В одном полный список компьютеров домена, в другом - лишь заблокированных учетных записей компьютеров.
    Получаем список незаблокированных.
    $all = c:\all.txt
    $blocked = c:\blocked.txt
    Foreach-object ($computer in $all) {If (Select-string -inputobject $blocked -pattern $computer) {} Else {Write-output $computer}}

    (If конечно несколько коряво записан, но не суть) Всё работает так, как хочется - выводится соотв. список строк файла all.txt, не имеющие пересечений в blocked.txt
    Однако стоит дописать в конце конструкции >> unblocked.txt, т.е.
    Foreach-object ($computer in $all) {If (Select-string -inputobject $blocked -pattern $computer) {} Else {Write-output $computer}} >> unblocked.txt
    Как после вывода на экран появляется сообщение
    "Имя ">>" не распознано как имя командлета, функции, файла скрипта или выполняемой программы."

    Почему подобное происходит?
    14 декабря 2009 г. 10:01

Ответы

  • Во-первых, ваш код лучше записать так:
    $all | where {$blocked -notcontains $_}

    Во-вторых, вы путаете командлет Foreach-Object с конструкцией языка Foreach. Это разные вещи (даже несмотря на то что у foreach-object есть псевдоним foreach). Подозреваю что в оригинале у вас был именно Foreach, потому как то что вы запостили выдает ошибку уже когда Foreach-Object пытается понять что за in вы ему пытаетесь скормить :)
    Unexpected token 'in' in expression or statement.
    At line:1 char:29
    + Foreach-object ($computer in <<<<  $all) {If (Select-string -inputobject $blocked -pattern $computer) {}
    Else {Write-output $computer}} >> unblocked.txt
        + CategoryInfo          : ParserError: (in:String) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : UnexpectedToken

    В-третьих вы используете Select-String не по назначению. -Pattern ожидает регулярное выражение, а вы передаете туда имя компьютера. Это конечно будет работать, но далеко не всегда так как вы того ожидаете.

    Что касается корявого If он там тоже не нужен.
    1. У Select-String есть параметр -NotMatch
    2. Можно обратить результат логического сравнения с помощью оператора -not (или !)
    3. Лучше вообще использовать Where-Object чем заключать if в foreach


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Предложено в качестве ответа Vasily GusevModerator 14 декабря 2009 г. 11:34
    • Помечено в качестве ответа anyaspid 14 декабря 2009 г. 11:49
    14 декабря 2009 г. 11:34
    Модератор
  • Ах да, на ">>" PS ругается из за того что он не привык к тому чтобы сразу после конструкции foreach шел командлет (>> хитрый псевдоним для out-file). Заключение конструкции в $(чтототам) >> file.txt помогло бы. Но лучше конечно $all | where {$blocked -notcontains $_} | out-file file.txt -append


    PS: Еще так можно:
    Compare-Object $all $blocked | select -ExpandProperty inputobject


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Помечено в качестве ответа anyaspid 14 декабря 2009 г. 11:49
    14 декабря 2009 г. 11:37
    Модератор

Все ответы

  • Во-первых, ваш код лучше записать так:
    $all | where {$blocked -notcontains $_}

    Во-вторых, вы путаете командлет Foreach-Object с конструкцией языка Foreach. Это разные вещи (даже несмотря на то что у foreach-object есть псевдоним foreach). Подозреваю что в оригинале у вас был именно Foreach, потому как то что вы запостили выдает ошибку уже когда Foreach-Object пытается понять что за in вы ему пытаетесь скормить :)
    Unexpected token 'in' in expression or statement.
    At line:1 char:29
    + Foreach-object ($computer in <<<<  $all) {If (Select-string -inputobject $blocked -pattern $computer) {}
    Else {Write-output $computer}} >> unblocked.txt
        + CategoryInfo          : ParserError: (in:String) [], ParentContainsErrorRecordException
        + FullyQualifiedErrorId : UnexpectedToken

    В-третьих вы используете Select-String не по назначению. -Pattern ожидает регулярное выражение, а вы передаете туда имя компьютера. Это конечно будет работать, но далеко не всегда так как вы того ожидаете.

    Что касается корявого If он там тоже не нужен.
    1. У Select-String есть параметр -NotMatch
    2. Можно обратить результат логического сравнения с помощью оператора -not (или !)
    3. Лучше вообще использовать Where-Object чем заключать if в foreach


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Предложено в качестве ответа Vasily GusevModerator 14 декабря 2009 г. 11:34
    • Помечено в качестве ответа anyaspid 14 декабря 2009 г. 11:49
    14 декабря 2009 г. 11:34
    Модератор
  • Ах да, на ">>" PS ругается из за того что он не привык к тому чтобы сразу после конструкции foreach шел командлет (>> хитрый псевдоним для out-file). Заключение конструкции в $(чтототам) >> file.txt помогло бы. Но лучше конечно $all | where {$blocked -notcontains $_} | out-file file.txt -append


    PS: Еще так можно:
    Compare-Object $all $blocked | select -ExpandProperty inputobject


    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    • Помечено в качестве ответа anyaspid 14 декабря 2009 г. 11:49
    14 декабря 2009 г. 11:37
    Модератор
  • Большое спасибо за ваши развёрнутые ответы, Василий. Ими вы очень меня выручаете.
    PS: Get-help about_if не даёт информации по not, а экспериментировать с синтаксисосм я не решился.
    14 декабря 2009 г. 11:59
  • >Большое спасибо за ваши развёрнутые ответы, Василий. Ими вы очень меня выручаете.
    Рад помочь :)

    >PS: Get-help about_if не даёт информации по not
    Ага, эти операторы не спецефичны для if, они много где встречаются:
    Get-Help about_logical_operators
    AKA Xaegr, MCSE: Security, Messaging; MCITP: Server\Enterprise Administrator; Блог: http://xaegr.wordpress.com
    14 декабря 2009 г. 12:18
    Модератор