Местные группы и участники

У меня есть требование сообщать о локальных группах и членах из определенного списка серверов. У меня есть следующий скрипт, который я собрал из других скриптов. При запуске сценария он записывает имя запрашиваемого сервера, имена локальных групп сервера и членов этих групп. Я хотел бы вывести текст в файл, но везде, где я добавляю | Команда Out-File я получаю сообщение об ошибке «Пустой элемент канала не разрешен». Моя второстепенная проблема с этим скриптом заключается в том, будет ли выбранный мной метод отчета о запрашиваемом сервере работать при выводе в файл. Не могли бы вы помочь исправить ошибки этого скрипта для новичков, пожалуйста?

    $server=Get-Content "C:\Powershell\Local Groups\Test.txt"
    Foreach ($server in $server) 
    {

    $computer = [ADSI]"WinNT://$server,computer"
    "
    "
    write-host "==========================="
    write-host "Server: $server"
    write-host "==========================="
    "
    "
    $computer.psbase.children | where { $_.psbase.schemaClassName -eq     'group' } | foreach {
    write-host $_.name
    write-host "------"
    $group =[ADSI]$_.psbase.Path
    $group.psbase.Invoke("Members") | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
    write-host **
    write-host

    }
    }

Спасибо, Кевин


person KSpinnato    schedule 21.03.2015    source источник


Ответы (1)


Вы говорите, что используете Out-File и получаете эту ошибку. Вы не показываете_откуда_ в своем коде, откуда вызывается.

Учитывая код, который у вас есть, я думаю, что вы пытались что-то вроде этого

Foreach ($server in $server){
    # All the code in this block
} | Out-File c:\pathto.txt

Хотел бы я иметь техническую ссылку на эту интерпретацию, но, увы, я ее не нашел (думаю, это связано со старыми версиями PowerShell). По моему опыту, эта конструкция не передает стандартный вывод. Кроме того, ($server in $server) вводит в заблуждение, даже если это работает. Могу ли я предложить это небольшое изменение, дайте мне знать, если это сработает.

$servers=Get-Content "C:\Powershell\Local Groups\Test.txt"
$servers | ForEach-Object{
    $server = $_
    # Rest of code inside block stays the same
} | Out-File c:\pathto.txt

Если это не ваша скорость, я бы также рассмотрел возможность создания пустого массива вне блока и заполнения для каждого прохода цикла.

# Declare empty array to hold results
$results = @()
Foreach ($server in $server){
    # Code before this line
    $results += $group.psbase.Invoke("Members") | foreach {$_.GetType().InvokeMember("Name", 'GetProperty', $null, $_, $null)}
    # Code after this line
} 
$results | Set-Content c:\pathto.txt

Достойная внимания

Вы смешиваете вывод консоли со стандартным выводом. в зависимости от того, что вы хотите сделать со сценарием, вы не получите ожидаемого результата. Если вы хотите, чтобы в выходном файле были такие строки, как write-host "Server: $server", вам нужно использовать Write-Output

person Matt    schedule 22.03.2015
comment
Спасибо за вашу помощь, Мэтт. Я воспользовался вашим первым предложением, и оно отлично сработало! Я очень ценю вашу помощь в этом. Спасибо, - person KSpinnato; 23.03.2015