Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Сбор сведений на удаленных компьютерах и вывод в консоль (http://forum.oszone.net/showthread.php?t=201993)

tarasov.evgeny 14-03-2011 18:00 1634790

Сбор сведений на удаленных компьютерах и вывод в консоль
 
Добрый день,

Есть скрипт, который на удаленных компьютерах должен собрать информацию:
информация берется из некоторых ключей реестра и файла INI - определенные строки и их значения
далее всё это должно выводиться в таблицу:
Имя хоста, первое значение, второе значение, третье значение и т.д.
В принципе скрипт работает - информацию собирает, но выводит её несколько раз подряд. Т.е. если я хочу собрать информацию с одного компьютера - он её выведет на экран четыре раза. Не как не могу понять, где "накосячил".
Сам скрипт:
Код:

$pslist = Get-Content pslist.txt

foreach ($1 in $pslist) {
 IF (Test-connection -Quiet -Delay 1 -Count 2 -ErrorAction SilentlyContinue  -ComputerName $1)
 {
 $type = [Microsoft.Win32.RegistryHive]::LocalMachine
 $regkey = [Microsoft.Win32.RegistryKey]::OpenRemoteBaseKey($type, "$1")
 $regkey1 = $regkey.OpenSubKey("SOFTWARE\ODBC\ODBC.INI\CRM")
 $REG = $regkey1.GetValueNames() | Select-Object @{Name="Name"; Expression={$_}}, @{Name="Value"; Expression={$regKey1.GetValue($_)}}
 $INI = Get-Content -Path "\\$1\c$\windows\file.ini"
 $CRM = $INI | Select-String "WSID","CTIAgentTelefon","isSip","CTILogFile"
 $INI | Select-String "WSID","CTIAgentTelefon","isSip","CTILogFile" | `
 Format-Table -AutoSize `
 @{Name="Host";Expression={$1}},`
 @{Name="WSID";Expression={$CRM[0]}},`
 @{Name="Phone";Expression={$CRM[1]}},`
 @{Name="Path LogFile";Expression={$CRM[2]}},`
 @{Name="isSip";Expression={$CRM[3]}},`
 @{Name="REGISTER_SERVER"; Expression={$REG[1]}}
 }
 Else {"Компьютер $1 выключен"}
                        }

на выходе получаем вот такой результат:
Код:

Host      WSID      Phone              Path LogFile                    isSip  REGISTER_SERVER                 
----      ----      -----              ------------                    -----  ---------------                 
comp01 WSID=0012 CTIAgentTelefon=512 CTILogFile=C:\CRM.log isSip=0 @{Name=Server; Value=Ser1}
comp01 WSID=0012 CTIAgentTelefon=512 CTILogFile=C:\CRM.log isSip=0 @{Name=Server; Value=Ser1}
comp01 WSID=0012 CTIAgentTelefon=512 CTILogFile=C:\CRM.log isSip=0 @{Name=Server; Value=Ser1}
comp01 WSID=0012 CTIAgentTelefon=512 CTILogFile=C:\CRM.log isSip=0 @{Name=Server; Value=Ser1}

В создание $REG - знаю очень муторно, просто подсмотрел в книжке - как сделать по проще пока не знаю.


Евгений

tarasov.evgeny 17-03-2011 10:47 1636915

Так. В чем причина вывода в четыре раза, я нашел.
Если выбросить весь хлам из скрипта, то вот где собака порылась:
Код:

$pslist = Get-Content pslist.txt
foreach ($1 in $pslist) {
$INI = Get-Content -Path "\\$1\c$\windows\file.ini"
$INI1 = $INI | Select-String "String1", "String2"
$Str = $INI1 | Select-String "String1"
$StrR = $WSID -replace "String=",""
$INI1 | Format-Table `
@{Name="Host";Expression={$1}},`
@{Name="String1";Expression={$StrR}}
                        }

Если в подчеркнутой строке убрать второй элемент (выделено красным), то информация выводится один раз, если поставить два элемента, то два, если три то три...
Похоже это связанно с тем, что я форматирую вывод в таблицу из основного массива, где есть все мне нужные строки и параллельно создаю столбцы из других массивов.

Возникает вопрос:
Есть несколько массивов, в каждом из них есть нужный мне элемент - данные в строке.
Как можно объединить несколько массивов или как передать команде Format-Table информацияю во входные данные с более одного массива, чтобы в одной таблице сформировать данные из нескольких массивов?

С уважением, Евгений

tarasov.evgeny 18-03-2011 17:19 1638096

Вообщем я сдался :(
Нашел как это можно скинуть в ячейки Excel
Создается файл, затем в ячейки через цикл вносятся данные:
Сразу могу сказать, что не получилось:
1. удаление листов не срабатывает - закоментировал.
2. при закрытие таблицы, процесс excel висит в памяти
3. нужно искать, чтобы он это всё сам сохранял
Код:

$excel = New-Object -ComObject Excel.Application
$excel.Visible = $true
#добавляем рабочую книгу
$workbook = $excel.workbooks.add()
#обращаемся к первому листу-книге
$sheet = $workbook.worksheets.Item(1)
#удаляем лишние книги
#$workbook.workSheets.item(2).delete()
#$workbook.WorkSheets.item(3).delete()
#Задаем массив имен компьютеров
$pslist = Get-Content pslist.txt
#Переименновываем таблицу
$workbook.WorkSheets.item(1).Name = "Processes"
#Получаем ссылку на переименовыванную таблицу
$sheet = $workbook.WorkSheets.Item("Processes")
#Начинаем отчет от второй строки, поскольку в первой строке - имя столбца
$x = 2
#Что-то сложное и не понятное - судя по названию для форматирования
$lineStyle = "microsoft.office.interop.excel.xlLineStyle" -as [type]
$colorIndex = "microsoft.office.interop.excel.xlColorIndex" -as [type]
$borderWeight = "microsoft.office.interop.excel.xlBorderWeight" -as [type]
$chartType = "microsoft.office.interop.excel.xlChartType" -as [type]
#Форматируем первую строку - Жирный шрифт и т.д.
For ($b = 1; $b -le 2; $b++)
{
 $sheet.cells.item(1,$b).font.bold = $true
 $sheet.cells.item(1,$b).borders.LineStyle = $lineStyle::xlDashDot
 $sheet.cells.item(1,$b).borders.ColorIndex = $colorIndex::xlColorIndexAutomatic
 $sheet.cells.item(1,$b).borders.weight = $borderWeight::xlMedium
}
#Задаем названия столбцов - первая строка
$sheet.cells.item(1,1) = "Host Name"
$sheet.cells.item(1,2) = "Str1"
$sheet.cells.item(1,3) = "Str2"
$sheet.cells.item(1,4) = "Str3"
$sheet.cells.item(1,5) = "Ctr4"
# Обрабатываем данные в цикле

foreach ($1 in $pslist)
{
 $INI = Get-Content -Path "\\$1\c$\windows\file.ini"
 $Str1 = ($ini | Select-String Str1) -replace "Str1=",""
 $Str2 = ($ini | Select-String Str2) -replace "Str2",""
 $Str3 = ($ini | Select-String Str3) -replace "Str3",""
 $Str4 = ($ini | Select-String Str4) -replace "Str4",""
#начинаем писать в ячейки полученные значения
$sheet.cells.item($x,1) = $1
 $sheet.cells.item($x,2) = $Str1
 $sheet.cells.item($x,3) = $Str2
 $sheet.cells.item($x,4) = $Str3
 $sheet.cells.item($x,5) = $Str4
 $x++
}
#делаем ячейки по ширине данных
$range = $sheet.usedRange
$range.EntireColumn.AutoFit() | out-null
#end foreach


С уважением, Евгений


Время: 17:42.

Время: 17:42.
© OSzone.net 2001-