PDA

Показать полную графическую версию : Сбор сведений на удаленных компьютерах и вывод в консоль


tarasov.evgeny
14-03-2011, 18:00
Добрый день,

Есть скрипт, который на удаленных компьютерах должен собрать информацию:
информация берется из некоторых ключей реестра и файла 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
Так. В чем причина вывода в четыре раза, я нашел.
Если выбросить весь хлам из скрипта, то вот где собака порылась:

$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
Вообщем я сдался :(
Нашел как это можно скинуть в ячейки 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


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




© OSzone.net 2001-2012