У меня есть требование сообщать о локальных группах и членах из определенного списка серверов. У меня есть следующий скрипт, который я собрал из других скриптов. При запуске сценария он записывает имя запрашиваемого сервера, имена локальных групп сервера и членов этих групп. Я хотел бы вывести текст в файл, но везде, где я добавляю | Команда 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
}
}
Спасибо, Кевин
Ответ 1 · Matt
Вы говорите, что используете 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