Имя пользователя:
Пароль:  
Помощь | Регистрация | Забыли пароль?  | Правила  

Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Сбор сведений на удаленных компьютерах и вывод в консоль

Ответить
Настройки темы
PowerShell - Сбор сведений на удаленных компьютерах и вывод в консоль

Старожил


Сообщения: 173
Благодарности: 4

Профиль | Отправить PM | Цитировать


Добрый день,

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


Евгений

Отправлено: 18:00, 14-03-2011

 

Старожил


Сообщения: 173
Благодарности: 4

Профиль | Отправить PM | Цитировать


Так. В чем причина вывода в четыре раза, я нашел.
Если выбросить весь хлам из скрипта, то вот где собака порылась:
Код: Выделить весь код
$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, 17-03-2011 в 11:24.


Отправлено: 10:47, 17-03-2011 | #2



Для отключения данного рекламного блока вам необходимо зарегистрироваться или войти с учетной записью социальной сети.

Если же вы забыли свой пароль на форуме, то воспользуйтесь данной ссылкой для восстановления пароля.


Старожил


Сообщения: 173
Благодарности: 4

Профиль | Отправить PM | Цитировать


Вообщем я сдался
Нашел как это можно скинуть в ячейки 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:19, 18-03-2011 | #3



Компьютерный форум OSzone.net » Программирование, базы данных и автоматизация действий » Скриптовые языки администрирования Windows » PowerShell - Сбор сведений на удаленных компьютерах и вывод в консоль

Участник сейчас на форуме Участник сейчас на форуме Участник вне форума Участник вне форума Автор темы Автор темы Шапка темы Сообщение прикреплено

Похожие темы
Название темы Автор Информация о форуме Ответов Последнее сообщение
Любой язык - Сбор информации о железе удаленных ПК OstJoker Скриптовые языки администрирования Windows 9 21-11-2012 13:38
Интерфейс - [решено] Пропала область сведений Vlad_Master Microsoft Windows 7 6 28-07-2011 18:43
V. 2007 - Изменение учетных записей outlook2007 на удаленных компьютерах boalni Microsoft Exchange Server 6 16-02-2010 12:10
2007 - Изменение учетных записей outlook 2007 на удаленных компьютерах boalni Microsoft Office (Word, Excel, Outlook и т.д.) 0 15-02-2010 12:14
Разное - [решено] Пропала область сведений! cuentagotas Microsoft Windows Vista 1 06-01-2009 13:00




 
Переход