Показать полную графическую версию : соединить три скрипта общим выводом.
Griboed0ff
20-04-2020, 07:39
доброго времени суток. Есть три скрипта, которые написали участники данного форума. Первый снимает Get-WmiObject Win32_NetworkAdapter -Filter 'AdapterTypeId = 0 and MACAddress is not null' |
select @{n='Сетевая карта';e={$_.macaddress}}|
export-csv 'D:\PowerShell\mac2.csv' -Delimiter ';' -Encoding utf8 -NoTypeInformation пишет в файл, второй снимает данные о $ofs = ''
gwmi wmimonitorid -Namespace root\wmi | Select @{n='UserFriendlyName';e={([string][Char[]]$_.UserFriendlyName).SubString(0,$_.UserFriendlyNameLength)}}, @{n='SerialNumberID';e={[string][Char[]]$_.SerialNumberID}} | export-csv 'D:\PowerShell\monitor2.csv' -Delimiter ';' -Encoding utf8 -NoTypeInformation
пишет в файл, третий собирает данные с веб [CODE]param (
#[parameter(Mandatory=$true)]
$encode = 65001,
[string]$outfile = 'table.csv',
[int]$number = 1
)
function convert ($from, $to){
begin{
$fenc = [text.encoding]::getencoding($from)
$tenc = [text.encoding]::getencoding($to)
}
process{
$a = $tenc.getbytes($_)
$fenc.getstring($a)
}
}
[net.servicepointmanager]::securityprotocol = 'ssl3,tls,tls11,tls12'
[array]$arr = $((Get-Netipaddress |? ipaddress -match "^10\.").ipaddress -replace "\d+$")
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}
$ips|%{
$html = iwr $_
$tables = $html.parsedhtml.getelementsbytagname("table")
$tbl = ($tables|?{($_.getelementsbytagname('table')|%{$_}).count -eq 0})[$number]|%{
$headers = @();
$tr = $_|%{$_.getelementsbytagname("tr")}
if($headers = $tr|?{$_.firstchild().tagname -eq 'th'}|
%{$_.getelementsbytagname("th")}|select -exp innertext){
if ($headers -match [char]208){$headers=$headers|convert $encode 28591}
$headers = $headers.trim()
} else {
$headers = 1..([linq.parallelenumerable]::max(
[linq.parallelenumerable]::asparallel($tr.lastchild().cellindex)
)+1)|%{"H$_"}
}
$rowind = ,1 * $headers.count
$tr.where({$_.firstchild().tagname -eq 'td'})|%{
$row = $_.getelementsbytagname("td") |? innertext -ne $null| select innertext,rowspan,colspan
if($row.innertext -match [char]208){
for($i=0;$i -lt $row.count;$i++){
$row[$i].innertext = $row[$i].innertext|convert $encode 28591
}
}
try {
$str = [ordered]@{}
$k=0
foreach ($item in $row){
if ($rowind[$k] -gt 1){
while ($rowind[$k] -gt 1){
$str[$headers[$k]] = $null
$rowind[$k] -= 1
$k++
}
}
if (($colspan = $item.colspan) -gt 1) {
$str[$headers[$k]] = if($item.innertext){
$item.innertext.trim()
} else {$null}
if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan}
$k++
while ($colspan -gt 1){
$str[$headers[$k]] = $null
$colspan -=1
if ($rowind[$k] -gt 1){$rowind[$k]-=1}
$k++
}
} else {
$str[$headers[$k]] = if($item.innertext){
$item.innertext.trim()
} else {$null}
if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan}
$k++
}
}
[pscustomobject]$str
} catch {
write-host Разметка заголовков не соответствует размерам строк -for red
write-host $_ -for cyan
}
}
}
[pscustomobject]@{
'IP' = $_
'MAC-адрес' = $tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
'Номер телефона' = if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
$tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
} else {
$tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
}
'Серийный номер' = $tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
'Номер модели' = $tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
}
} |export-csv D:\PowerShell\123.csv -notype -enc utf8 -d ';' устройств пишет в файл. Просьба помочь собрать франкенштейна в один файл скрипта и сделать общий вывод в один файл всей инфы, что он собирает.
Griboed0ff
21-04-2020, 12:22
было бы это в батнике, я бы просто слепил бы в один файл, а вывод настроил бы с помощью >, а второй и третий скрипт через >>. Тут оказалось сложнее как-то
Griboed0ff
21-04-2020, 12:49
нашел два параметра -NoClobber -Force, вроде они выполняют функцию > >> подобно bat, но пока со значениями непонятно. Получается, что можно подобно батнику просто скопировать три скрипта в одно тело, а вывод у каждого свой, но в один и тот же файл. Первый скрипт будет перезаписывать файл, а два другие только дописывать.
нашел два параметра -NoClobber -Force, вроде они выполняют функцию > >> подобно bat »
Не так... используйте параметр-переключатель -Append в Export-Csv, это позволит добавлять контент, а не перезаписывать его...
Griboed0ff
22-04-2020, 16:13
используйте параметр-переключатель -Append в Export-Csv » такой параметр нашел только у out-file. Get-WmiObject Win32_NetworkAdapter -Filter 'AdapterTypeId = 0 and MACAddress is not null' |
select @{n='Системный блок';e={$_.macaddress}}|
Out-File 'D:\PowerShell\temp\общий.csv'
$ofs = ''
gwmi wmimonitorid -Namespace root\wmi | Select @{n='UserFriendlyName';e={([string][Char[]]$_.UserFriendlyName).SubString(0,$_.UserFriendlyNameLength)}}, @{n='SerialNumberID';e={[string][Char[]]$_.SerialNumberID}} | Out-File 'D:\PowerShell\temp\общий.csv' -Append
param (
#[parameter(Mandatory=$true)]
$encode = 65001,
[string]$outfile = 'table.csv',
[int]$number = 1
)
function convert ($from, $to){
begin{
$fenc = [text.encoding]::getencoding($from)
$tenc = [text.encoding]::getencoding($to)
}
process{
$a = $tenc.getbytes($_)
$fenc.getstring($a)
}
}
[net.servicepointmanager]::securityprotocol = 'ssl3,tls,tls11,tls12'
[array]$arr = gc 'D:\PowerShell\list_Net.txt'
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}
$ips|%{
if (test-connection $_ -count 1 -q){
try{
$html = iwr $_
$tables = $html.parsedhtml.getelementsbytagname("table")
$tbl = ($tables|?{($_.getelementsbytagname('table')|
%{$_}).count -eq 0})[$number]|%{
$headers = @();
$tr = $_|%{$_.getelementsbytagname("tr")}
if($headers = $tr|?{$_.firstchild().tagname -eq 'th'}|
%{$_.getelementsbytagname("th")}|select -exp innertext){
if ($headers -match [char]208){$headers=$headers|convert $encode 28591}
$headers = $headers.trim()
} else {
$headers = 1..([linq.parallelenumerable]::max(
[linq.parallelenumerable]::asparallel($tr.lastchild().cellindex)
)+1)|%{"H$_"}
}
$rowind = ,1 * $headers.count
$tr.where({$_.firstchild().tagname -eq 'td'})|%{
$row = $_.getelementsbytagname("td") |? innertext -ne $null|
select innertext,rowspan,colspan
if($row.innertext -match [char]208){
for($i=0;$i -lt $row.count;$i++){
$row[$i].innertext = $row[$i].innertext|convert $encode 28591
}
}
$str = [ordered]@{}
$k=0
foreach ($item in $row){
if ($rowind[$k] -gt 1){
while ($rowind[$k] -gt 1){
$str[$headers[$k]] = $null
$rowind[$k] -= 1
$k++
}
}
if (($colspan = $item.colspan) -gt 1) {
$str[$headers[$k]] = if($item.innertext){
$item.innertext.trim()
} else {$null}
if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan}
$k++
while ($colspan -gt 1){
$str[$headers[$k]] = $null
$colspan -=1
if ($rowind[$k] -gt 1){$rowind[$k]-=1}
$k++
}
} else {
$str[$headers[$k]] = if($item.innertext){
$item.innertext.trim()
} else {$null}
if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan}
$k++
}
}
[pscustomobject]$str
}
}
[pscustomobject]@{
'IP' = $_
'MAC-адрес' = $tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
'Номер телефона' = if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
$tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
} else {
$tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
}
'Серийный номер' = $tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
'Номер модели' = $tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
}
} catch {
write-host Ошибка: $_ -for red
}
}
} Out-File 'D:\PowerShell\temp\общий.csv' -Appendпервые два отрабатывали, а когда добавил третий появилась ошибкастрока:10 знак:12
+ $encode = 65001,
+ ~~~~~
Недопустимое условие назначения. Входным значением оператора назначения должен быть объект, способный принимать назначения, такой как переменная или свойство.
строка:11 знак:21
+ [string]$outfile = 'table.csv',
+ ~~~~~~~~~~~
Недопустимое условие назначения. Входным значением оператора назначения должен быть объект, способный принимать назначения, такой как переменная или свойство.
+ CategoryInfo : ParserError: (:) [], ParentContainsErrorRecordException
+ FullyQualifiedErrorId : InvalidLeftHandSideя так понимаю неправильно приписал к третьему out-file. если взять только третий и out-flie то: write-host Ошибка: $_ -for red
}
}
} Out-File 'D:\PowerShell\temp\общий.csv' -Append
ForEach-Object : Не удается привязать параметр "RemainingScripts". Не удается преобразовать значение "Out-File" типа "System.String" в тип "System.Management.Automation.ScriptBlock".
строка:22 знак:6
+ $ips|%{
+ ~~
+ CategoryInfo : InvalidArgument: (:) [ForEach-Object], ParameterBindingException
+ FullyQualifiedErrorId : CannotConvertArgumentNoMessage,Microsoft.PowerShell.Commands.ForEachObjectCommand
такой параметр нашел только у out-file. »
export-csv (https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/export-csv?view=powershell-5.1)
появилась ошибка »
Параметры скрипта должны располагаться в самом начале скрипта, перед ними могут располагаться только комментарии.
В данном случае, это параметры скрипта:
param (
#[parameter(Mandatory=$true)]
$encode = 65001,
[string]$outfile = 'table.csv',
[int]$number = 1
) »
} Out-File 'D:\PowerShell\temp\общий.csv' -Append »
здесь пропущен оператор конвейера.
Griboed0ff
22-04-2020, 19:03
Спасибо, все получилось. Я так понимаю, чтобы сделать это таблицей .csv надо перед Out-File еще команду вставить с оператором конвейером?
чтобы сделать это таблицей .csv »
export-csv создает файл с разделителями, который Excel может конвертировать в таблицу. Никакого out-file не требуется.
Griboed0ff
22-04-2020, 22:32
export-csv создает файл с разделителями, который Excel может конвертировать в таблицу. Никакого out-file не требуется. » до того как я начал что-то сам делать так и было. Но проблема в том, что каждый скрипт переписывает файл, а не дописывает. Надо чтобы первый переписывал, остальные дописывали. Либо хитроумный вывод из трех, но тут я вообще не имею даже гипотез.
Либо хитроумный вывод из трех, но тут я вообще не имею даже гипотез. »
param (
#[parameter(Mandatory=$true)]
[string]$outfile = 'D:\PowerShell\temp\общий.csv',
[string]$list = 'D:\PowerShell\list_Net.txt',
$enc1 = 65001,
$enc2 = 28591,
[int[]]$SelectTable = 1
)
Get-WmiObject Win32_NetworkAdapter -Filter 'AdapterTypeId = 0 and MACAddress is not null' |
select @{n='Системный блок';e={$_.macaddress}}| convertto-csv -d ';' -notype|
out-file $outfile -enc utf8
$ofs = ''
gwmi wmimonitorid -Namespace root\wmi |
Select @{n='UserFriendlyName';e={
([string][Char[]]$_.UserFriendlyName).SubString(0,$_.UserFriendlyNameLength)
}}, @{n='SerialNumberID';e={[string][Char[]]$_.SerialNumberID}} | convertto-csv -d ';' -notype|
out-file $outfile -enc utf8 -app
#---Эту секцию можно удалить после однократного запуска скрипта от имени админа ------------------
# Установка дополнительного модуля PowerHTML, для независимого парсинга HTML
# Может потребоваться ручное подтверждение установки.
if (!(get-module -list powerhtml)) {
write-verbose "Installing PowerHTML module for the current user..."
install-module powerhtml #-scope currentuser
}
#-----------------------------------------------------------------------------------------
function convert ($from, $to){
begin{
$fenc = [text.encoding]::getencoding($from)
$tenc = [text.encoding]::getencoding($to)
}
process{
$a = $tenc.getbytes($_)
$fenc.getstring($a)
}
}
[net.servicepointmanager]::securityprotocol = 'ssl3,tls,tls11,tls12'
[array]$arr = gc $list
$ips = 130..190 |%{$n=$_;$arr|%{"$_"+$n}}|sort|?{test-connection $_ -count 1 -q}
$ips|%{
if (test-connection $_ -count 1 -q){
try {
$a = (iwr $_).content
$content = if ($a -match [char]208){
if ($a -match 'windows-1251'){$enc1,$enc2 = 1251,1252}
$a|convert $enc1 $enc2
} else {$a}
$html = [net.webutility]::htmldecode($content)|convertfrom-html
[array]$tables = $html.selectnodes('//table')
# Исключение вложенных таблиц:
$tables = $tables|?{$_.innerhtml -notmatch 'table'}
if ([string]::isnullorempty($selecttable)){
$number = 0..($tables.count-1)
} else {$number = $selecttable}
$tbl = $tables[$number]|%{$n=0}{
$tr = if($_.element('tbody')){
$_.element('tbody').elements('tr')
} else {$_.elements('tr')}
$headers = @()
if($headers = $tr|?{$_.element('th') -ne $null}|
%{$_.elements('th')}|select -exp innertext){
$headers=$headers.trim()
} else {
$headers = 1..(
[linq.parallelenumerable]::max(
[linq.parallelenumerable]::asparallel(($tr|
%{($_.elements('td')|? innertext -ne ''|%{$_}).count}))
)
)|%{"H$_"}
}
$rowind = ,1 * $headers.count
$tr|?{$_.elements('td') -ne ''}|%{
$row = $_.elements('td')|? innertext -ne ''|%{
$attr = $_.attributes
if ($attr){
$rowspan = ($attr|? name -eq 'rowspan'|select value).value
$colspan = ($attr|? name -eq 'colspan'|select value).value
}
[pscustomobject]@{
'InnerText' = $_.innertext
'RowSpan' = if($rowspan){[int]$rowspan} else {1}
'ColSpan' = if($colspan){[int]$colspan} else {1}
}
}
$str = [ordered]@{}
$k=0
foreach ($item in $row){
if ($rowind[$k] -gt 1){
while ($rowind[$k] -gt 1){
$str[$headers[$k]] = $null
$rowind[$k] -= 1
$k++
}
}
if (($colspan = $item.colspan) -gt 1) {
$str[$headers[$k]] = if($item.innertext){
$item.innertext.trim()
} else {$null}
if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan}
$k++
while ($colspan -gt 1){
$str[$headers[$k]] = $null
$colspan -=1
if ($rowind[$k] -gt 1){$rowind[$k]-=1}
$k++
}
} else {
$str[$headers[$k]] = if($item.innertext){
$item.innertext.trim()
} else {$null}
if ($item.rowspan -gt 1){$rowind[$k] = $item.rowspan}
$k++
}
}
[pscustomobject]$str
}
}
[pscustomobject]@{
'IP' = $_
'MAC-адрес' = if ([array]::indexof($tbl.h1,'MAC-адрес') -ne -1){
$tbl[([array]::indexof($tbl.h1,'MAC-адрес'))].h2
} else {$tbl[([array]::indexof($tbl.h1,'MAC Address'))].h2}
'Номер телефона' = if ([array]::indexof($tbl.h1,'Номер телефона') -ne -1){
$tbl[([array]::indexof($tbl.h1,'Номер телефона'))].h2
} elseif ([array]::indexof($tbl.h1,'Номер телефона 1') -ne -1){
$tbl[([array]::indexof($tbl.h1,'Номер телефона 1'))].h2
} else {
$tbl[([array]::indexof($tbl.h1,'Phone DN'))].h2
}
'Серийный номер' = if ([array]::indexof($tbl.h1,'Серийный номер') -ne -1){
$tbl[([array]::indexof($tbl.h1,'Серийный номер'))].h2
} else {$tbl[([array]::indexof($tbl.h1,'Serial Number'))].h2}
'Номер модели' = if ([array]::indexof($tbl.h1,'Номер модели') -ne -1){
$tbl[([array]::indexof($tbl.h1,'Номер модели'))].h2
} else {$tbl[([array]::indexof($tbl.h1,'Model Number'))].h2}
}
} catch {
write-host Ошибка: $_ -for red
}
}
} | convertto-csv -d ';' -notype|out-file $outfile -enc utf8 -app
Griboed0ff
28-05-2020, 11:41
новая проблема, накидан Param( #powershell
[string]$Region,
#[parameter(Mandatory=$true)]
[string]$outfile = 'D:\PowerShell\франкин\test\model.csv',
[string]$outfile2 = 'D:\PowerShell\франкин\test\mac.csv',
[string]$outfile3 = 'D:\PowerShell\франкин\test\mon.csv',
[string]$outfile4 = 'D:\PowerShell\франкин\test\no_ping.csv'
)
$myscripname=$myInvocation.ScriptName
if ($Region -eq "MSK_TT") {
$OU = "OU=Workstations,OU=TT,OU=Computers,OU=MSK,DC=tsretail,DC=ru"
} elseif ($Region -eq "MSK_S") {
$OU = "OU=Servers,OU=TT,OU=Computers,OU=MSK,DC=tsretail,DC=ru"
} elseif ($Region -eq "VLK_TT") {
$OU = "OU=Workstations,OU=TT,OU=Computers,OU=VLK,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "VLK_S") {
$OU = "OU=Servers,OU=TT,OU=Computers,OU=VLK,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "SMR_TT") {
$OU = "OU=Workstations,OU=TT,OU=Computers,OU=SMR,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "SMR_S") {
$OU = "OU=Servers,OU=TT,OU=Computers,OU=SMR,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "UFA_TT") {
$OU = "OU=Workstations,OU=TT,OU=Computers,OU=UFA,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "UFA_S") {
$OU = "OU=1C-servers,OU=TT,OU=Computers,OU=UFA,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "SPB_TT") {
$OU = "OU=Workstations,OU=TT,OU=Computers,OU=SPB,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "SPB_S") {
$OU = "OU=Servers,OU=TT,OU=Computers,OU=SPB,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "EKT_TT") {
$OU = "OU=Workstations,OU=TT,OU=Computers,OU=EKT,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "EKT_S") {
$OU = "OU=Servers,OU=TT,OU=Computers,OU=EKT,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "VRN_TT") {
$OU = "OU=Workstations,OU=TT,OU=Computers,OU=VRN,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "VRN_S") {
$OU = "OU=Servers,OU=TT,OU=Computers,OU=VRN,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "RND_TT") {
$OU = "OU=Workstations,OU=TT,OU=Computers,OU=RND,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "RND_S") {
$OU = "OU=Servers,OU=TT,OU=Computers,OU=RND,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "NSK_TT") {
$OU = "OU=Workstations,OU=TT,OU=Computers,OU=NSK,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "NSK_S") {
$OU = "OU=Servers,OU=TT,OU=Computers,OU=NSK,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "MSK_B") {
$OU = "OU=MainOffice,OU=Computers,OU=MSK,DC=tsretail,DC=ru"
} elseif ($Region -eq "VLK_B") {
$OU = "OU=Office,OU=Computers,OU=VLK,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "SMR_B") {
$OU = "OU=Office,OU=Computers,OU=SMR,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "UFA_B") {
$OU = "OU=Office,OU=Computers,OU=UFA,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "SPB_B") {
$OU = "OU=Office,OU=Computers,OU=SPB,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "EKT_B") {
$OU = "OU=Office,OU=Computers,OU=EKT,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "VRN_B") {
$OU = "OU=Office,OU=Computers,OU=VRN,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "RND_B") {
$OU = "OU=Office,OU=Computers,OU=RND,OU=Regions,DC=tsretail,DC=ru"
} elseif ($Region -eq "NSK_B") {
$OU = "OU=Office,OU=Computers,OU=NSK,OU=Regions,DC=tsretail,DC=ru"
} Else {
Write-Host "Usage: powershell $myscripname <filename with SQL query> [VLK_TT|MSK_TT|SMR_TT|UFA_TT|SPB_TT|EKT_TT|VRN_TT|RND_TT|NSK_TT|VLK_B|MSK_B|SMR_B|UFA_B|SPB_B|EKT_B|V RN_B|RND_B|NSK_B]"
exit
}
$logdate = $((get-date).tostring("ddMMyy HH_mm"))
$log = $outfile4
$pcs2 = get-adcomputer -Filter {Enabled -eq 'True'} -Properties Name, whenCreated, CanonicalName, OperatingSystem, OperatingSystemServicePack, OperatingSystemVersion, LastLogonDate -SearchBase $OU | Select-Object Name, whenCreated, CanonicalName, LastLogonDate, OperatingSystem, OperatingSystemServicePack, OperatingSystemVersion
$counter = $pcs2.count
write-host "Прошлись по $OU. Получили $counter записей" -ForegroundColor Yellow
"Имя ПК;OperatingSystem;доступность;результат проверки;LastLogonDate;CanonicalName;" #| Out-File $log -Append -Encoding utf8
$pcs2|% {
$Res = @()
$forLog = @()
$name = $_.name
$logon = $_.LastLogonDate.tostring("dd.MM.yyyy")
write-host $name -ForegroundColor Green
if ((Test-Connection -Cn $name -Count 1 -quiet -ErrorAction SilentlyContinue) -eq $False) {
Write-host "$name;не пингуется"
$forLog = $name+";"+$_.OperatingSystem+";"+"не пингуется;"+";$logon"+";"+$_.CanonicalName
$forLog | Out-File $log -Append -Encoding utf8
} else {
Write-host "$name пингуется, выполняем проверку"
Get-CimInstance -ClassName Win32_ComputerSystem -computername $name | convertto-csv -d ';' -notype| Out-File $outfile -enc utf8 -Append
Get-WmiObject Win32_NetworkAdapter -Filter 'AdapterTypeId = 0 and MACAddress is not null' -computername $name | convertto-csv -d ';' -notype| Out-File $outfile2 -enc utf8 -Append
$ofs = ''
gwmi wmimonitorid -Namespace root\wmi -ComputerName $name |
Select @{n='UserFriendlyName';e={([string][Char[]]$_.UserFriendlyName).SubString(0,$_.UserFriendlyNameLength)}}, @{n='SerialNumberID';e={[string][Char[]]$_.SerialNumberID}} |%{
[pscustomobject]@{
'Name' = $name
'UserFriendlyName' = $_.UserFriendlyName.trim([char]0x0000)
'SerialNumberID' = $_.SerialNumberID.trim([char]0x0000)
} | Out-File $outfile3 -enc utf8 -Append
}
} }
собирает с аушек ад имена компов и опрашивает информацию о фирме модели пк, мак адресе, модель и серийник мониторов. Проблема в том, что я пробовал обьединять вывод в один файл, но получается неворятнейшая каша из почти необрабатываемой инфы. Я стремлюсь записать всю инфу полученную от пк в одну строку. Пример как хотелось бы:ekt_tt;d909-2;Hewlett-Packard;HP ProDesk 400 G1 SFF;64:51:06:3B:4A:8D;HP W2072a;CNC435PJ5D;HP E231;3CQ3470WJF;
если второго монитора нет то просто записать какой-нибудь символ или слово в столбец. Но проблема еще в том, что запрос мака и производителя возвращает множество значений (ван порты, модемы и пр.), хотя та же команда выполеная локально выдает мне одну сетевую карту. Нужна именно встроенная проводная карта. Или хотя записать всю инфу оп пк в одну строку, возможно дальше буду как-то парсить инфу.
новая проблема, накидан »
Griboed0ff, проблема одна — Вы ринулись в бой, не продумав стройной системы сбора. Поэтому Вы парсите, собираете в строку, потом опять парсите, потом опять собирате — и так по кругу.
Griboed0ff
02-06-2020, 15:35
Вы ринулись в бой, не продумав стройной системы сбора. » вы абсолютно правы, но дело не в том, что я не хочу этого делать, дело в том, что не могу из-за отсутствия знаний в PS, а делать уже надо. Я начал изучать ps, но пока мало знаю. С последнего сообщения переделал скрипт и получил часть того чего хотел. Param(
[String]$a=((Get-Date).ToShortDateString() | Foreach-Object {$_ -replace "\.", ""}) ,
[string]$outfile = "D:\PowerShell\франкин\test\1111.csv",
$pp = "05server"
)
$PSComputerName = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.PSComputerName}
$MACAddress = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.MACAddress}
$namenet = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.name}
$AdapterType = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.AdapterType}
$Speed = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.Speed}
$Manufacturer = Get-CimInstance -computername $pp -ClassName Win32_ComputerSystem |foreach {$_.Manufacturer}
$Model = Get-CimInstance -computername $pp -ClassName Win32_ComputerSystem |foreach {$_.Model}
$SN = Get-WmiObject -computername $pp Win32_BaseBoard | foreach {$_.SerialNumber}
$hash_object = [ordered] @{PSComputerName = $PSComputerName; Manufacturer = $Manufacturer; Model = $Model; Serialnumber = $SN; MACAddress = $MACAddress; name = $namenet; AdapterType = $AdapterType; Speed = $Speed; }
$ps_object = [pscustomobject]$hash_object
$ps_object | export-csv $outfile -notype -enc utf8 -d ';' -append
"PSComputerName";"Manufacturer";"Model";"Serialnumber";"MACAddress";"name";"AdapterType";"Speed"
"05server";"Hewlett-Packard";"HP ProDesk 400 G2 MT";"CZC44843RP";"A0:D3:C1:4D:6B:CE";"Realtek PCIe GBE Family Controller #4";"Ethernet 802.3";"1000000000"
как всегда есть проблема, не могу допереть умом как в это все еще добавить инфу о мониторах, в соседней теме подсказали как получить инфу $m = gwmi wmimonitorid -Namespace root\wmi
[string][char[]] ($m.UserFriendlyName) -join ""
[string][char[]] ($m.SerialNumberID) -join "" результат HP E231 HP E231
3CQ4070X4Z 6CM4221RHCне могу понять как из этого вычленить сначала первый монитор, а потом второй и записать в одну строку подобно остальной инфе. И как заполнить пустые столбики чем-либо если конфигурация одним монитором.
А точнее, лучше не вычленять из результата, а сразу писать результат как надо.
В данном случае Вы получаете массив из двух значений.
Griboed0ff
02-06-2020, 21:38
В данном случае Вы получаете массив из двух значений. »
похоже что нет (рассматриваю пока модель), если выполняю $a = ((gwmi wmimonitorid -Namespace root\wmi -ComputerName t-pc-nori).UserFriendlyName)
$a получаю 72
80
32
69
50
51
49
0
0
0
0
0
0
76
71
32
73
80
83
32
70
85
76
76
72
68 я попробовал выловить то что нужно через [string]$b = $a[0..7] работает корректно до того момента как модель с другим названием имеет другие числа для фильтрации. Есть ли способ выловить именно первое значение (модель первого монитора) или второе для записи в переменную. Или вообще не правильно вас понял?
хм, заметил, что всегда возвращает 26 значений независимо от моделей, по идее можно делать по 13 на каждое значение, далее уже в тексте обрезать лишние пробелы.
72
80
32
69
50
51
49
0
0
0
0
0
0
72
80
32
69
50
51
49
0
0
0
0
0
0
Griboed0ff
02-06-2020, 22:54
в общем что-то получилось $PSComputerName = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.PSComputerName}
$MACAddress = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.MACAddress}
$namenet = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.name}
$AdapterType = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.AdapterType}
$Speed = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.Speed}
$Manufacturer = Get-CimInstance -computername $pp -ClassName Win32_ComputerSystem |foreach {$_.Manufacturer}
$Model = Get-CimInstance -computername $pp -ClassName Win32_ComputerSystem |foreach {$_.Model}
$SN = Get-WmiObject -computername $pp Win32_BaseBoard | foreach {$_.SerialNumber}
$mm = [char[]]((gwmi wmimonitorid -Namespace root\wmi -ComputerName $pp).UserFriendlyName)-join ""
[string]$mmod1 = $mm[0..12]
[string]$mmod2 = $mm[13..26]
$msn = [char[]]((gwmi wmimonitorid -Namespace root\wmi -ComputerName $pp).SerialNumberID)-join ""
[string]$msn1 = $msn[0..15]
[string]$msn2 = $msn[16..32]
$hash_object = [ordered] @{PSComputerName = $PSComputerName; Manufacturer = $Manufacturer; Model = $Model; Serialnumber = $SN; MACAddress = $MACAddress; name = $namenet; AdapterType = $AdapterType; Speed = $Speed; "Monitor 1" = $mmod1; "SN 1" = $msn1; "Monitor 2" = $mmod2; "SN 2" = $msn2; }
$ps_object = [pscustomobject]$hash_object
$ps_object | export-csv $outfile -notype -enc utf8 -d ';' -append
но есть проблема. Если мониторов вообще нет то записываются предыдущие данные. Как оставить поле пустым или его заполнить например "-"?!"PSComputerName";"Manufacturer";"Model";"Serialnumber";"MACAddress";"name";"AdapterType";"Speed";"Monitor 1";"SN 1";"Monitor 2";"SN 2"
"E";"Hewlett-Packard";"HP ProDesk 400 G2 MT";"CZC4483YK7";"A0:D3:C1:4D:51:2D";"Realtek PCIe GBE Family Controller";"Ethernet 802.3";"100000000";"HP E231 ";"3CQ3510L75 ";"HP E231 ";"CNC238NS0G "
"05-SERVER";"Hewlett-Packard";"HP ProDesk 400 G2 MT";"CZC44843RP";"A0:D3:C1:4D:6B:CE";"Realtek PCIe GBE Family Controller #4";"Ethernet 802.3";"1000000000";"";"3CQ3510L75 ";"";"CNC238NS0G "
"05-SERVER";"Hewlett-Packard";"HP ProDesk 400 G2 MT";"CZC44843RP";"A0:D3:C1:4D:6B:CE";"Realtek PCIe GBE Family Controller #4";"Ethernet 802.3";"1000000000";"";"3CQ3510L75 ";"";"CNC238NS0G "
"TT-PC-AV";"Dell Inc.";"OptiPlex 5050";"/C7JLBS2/CNFCW0087V029Y/";"54:BF:64:7E:FE:E3";"Intel(R) Ethernet Connection (5) I219-V";"Ethernet 802.3";"100000000";"HP E243 ";"CNK91733GB ";"";""
ну и как то избавиться от красноты, так где нет мониторов вообще такие вот ошибки:gwmi : Не поддерживается
D:\PowerShell\test\3.ps1:15 знак:17
+ ... = [char[]]((gwmi wmimonitorid -Namespace root\wmi -ComputerName $pp). ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Get-WmiObject], ManagementException
+ FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
gwmi : Не поддерживается
D:\PowerShell\test\3.ps1:18 знак:18
+ ... = [char[]]((gwmi wmimonitorid -Namespace root\wmi -ComputerName $pp). ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [Get-WmiObject], ManagementException
+ FullyQualifiedErrorId : GetWMIManagementException,Microsoft.PowerShell.Commands.GetWmiObjectCommand
Не удается индексировать в массив NULL.
D:\PowerShell\test\3.ps1:19 знак:1
+ [string]$msn1 = $msn[0..15]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : NullArray
Не удается индексировать в массив NULL.
D:\PowerShell\test\3.ps1:20 знак:1
+ [string]$msn2 = $msn[16..32]
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : InvalidOperation: (:) [], RuntimeException
+ FullyQualifiedErrorId : NullArray
Griboed0ff
02-06-2020, 23:29
еще многие компы ответили так Get-CimInstance : Службе WS-Management не удается обработать запрос. URI ресурса DMTF был использован для доступа к классу, отличному от DMTF. Повторите попытку с использованием URI ресурса, отличного от DMTF.
D:\PowerShell\франкин\test\test.ps1:93 знак:17
+ ... ufacturer = Get-CimInstance -computername $name -ClassName Win32_Comp ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (root\cimv2:Win32_ComputerSystem:String) [Get-CimInstance], CimException
+ FullyQualifiedErrorId : HRESULT 0x80338139,Microsoft.Management.Infrastructure.CimCmdlets.GetCimInstanceCommand
+ PSComputerName : EKT-PC-KISELEVA
Get-CimInstance : Службе WS-Management не удается обработать запрос. URI ресурса DMTF был использован для доступа к классу, отличному от DMTF. Повторите попытку с использованием URI ресурса, отличного от DMTF.
D:\PowerShell\франкин\test\test.ps1:94 знак:10
+ $Model = Get-CimInstance -computername $name -ClassName Win32_Compute ...
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (root\cimv2:Win32_ComputerSystem:String) [Get-CimInstance], CimException
+ FullyQualifiedErrorId : HRESULT 0x80338139,Microsoft.Management.Infrastructure.CimCmdlets.GetCimInstanceCommand
+ PSComputerName : EKT-PC-KISELEVA не правильно запрашиваю производителя и модель?
Griboed0ff
02-06-2020, 23:46
не правильно запрашиваю производителя и модель? » заменил Get-CimInstance на Get-WmiObject работает. Осталось только но есть проблема. Если мониторов вообще нет то записываются предыдущие данные. Как оставить поле пустым или его заполнить например "-"?!
Скрытый текст
ну и как то избавиться от красноты, так где нет мониторов вообще такие вот ошибки:
Скрытый текст »
Param(
$a=((Get-Date).ToShortDateString() | Foreach-Object {$_ -replace "\.", ""}) ,
$outfile = "D:\PowerShell\франкин\test\1111.csv",
$pp = "localhost"
)cls
$PSComputerName = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.PSComputerName}
$MACAddress = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.MACAddress}
$namenet = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.name}
$AdapterType = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.AdapterType}
$Speed = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.Speed}
$Manufacturer = Get-CimInstance -computername $pp -ClassName Win32_ComputerSystem |foreach {$_.Manufacturer}
$Model = Get-CimInstance -computername $pp -ClassName Win32_ComputerSystem |foreach {$_.Model}
$SN = Get-WmiObject -computername $pp Win32_BaseBoard | foreach {$_.SerialNumber}
$hash_object = [ordered] @{PSComputerName = $PSComputerName; Manufacturer = $Manufacturer; Model = $Model; Serialnumber = $SN; MACAddress = $MACAddress; name = $namenet; AdapterType = $AdapterType; Speed = $Speed; }
gwmi -ea 0 wmimonitorid -Namespace root\wmi|%{$hash_object.add("Monitor"+ ++$i,(($_.UserFriendlyName|?{($_ -ne 0)}|%{[char]$_}) -join "")+' ['+(($_.SerialNumberID|?{($_ -ne 0)}|%{[char]$_}) -join "")+']')}
$hash_object
Griboed0ff
03-06-2020, 09:35
ваш код так же записывает прошлое значение если нет мониторов, например, 05-server не имеет мониторов, но однако записал результаты от прошлого запуска.Param(
$a=((Get-Date).ToShortDateString() | Foreach-Object {$_ -replace "\.", ""}) ,
$outfile = "D:\PowerShell\франкин\test\1111.csv",
$pp = "05-server"
)cls
$PSComputerName = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.PSComputerName}
$MACAddress = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.MACAddress}
$namenet = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.name}
$AdapterType = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.AdapterType}
$Speed = Get-WmiObject -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.Speed}
$Manufacturer = Get-CimInstance -computername $pp -ClassName Win32_ComputerSystem |foreach {$_.Manufacturer}
$Model = Get-CimInstance -computername $pp -ClassName Win32_ComputerSystem |foreach {$_.Model}
$SN = Get-WmiObject -computername $pp Win32_BaseBoard | foreach {$_.SerialNumber}
$hash_object = [ordered] @{PSComputerName = $PSComputerName; Manufacturer = $Manufacturer; Model = $Model; Serialnumber = $SN; MACAddress = $MACAddress; name = $namenet; AdapterType = $AdapterType; Speed = $Speed; }
gwmi -ea 0 wmimonitorid -Namespace root\wmi|%{$hash_object.add("Monitor"+ ++$i,(($_.UserFriendlyName|?{($_ -ne 0)}|%{[char]$_}) -join "")+' ['+(($_.SerialNumberID|?{($_ -ne 0)}|%{[char]$_}) -join "")+']')}
$hash_objectName Value
---- -----
PSComputerName 05-SERVER
Manufacturer Hewlett-Packard
Model HP ProDesk 400 G2 MT
Serialnumber CZC44843RP
MACAddress A0:D3:C1:4D:6B:CE
name Realtek PCIe GBE Family Controller #4
AdapterType Ethernet 802.3
Speed 1000000000
Monitor9 HP E231 [3CQ4070X4Z]
Monitor10 HP E231 [6CM4221RHC]
А вывод в файл через $hash_object | export-csv $outfile -notype -enc utf8 -d ';' -append
Выдал результат видимо свойства"Count";"IsReadOnly";"Keys";"Values";"IsFixedSize";"SyncRoot";"IsSynchronized"
"10";"False";"System.Collections.Specialized.OrderedDictionary+OrderedDictionaryKeyValueCollection";"System.Collections.Specialized.OrderedDictionary+OrderedDictionaryKeyValueCollection";"False";"System.Object";"False"
"10";"False";"System.Collections.Specialized.OrderedDictionary+OrderedDictionaryKeyValueCollection";"System.Collections.Specialized.OrderedDictionary+OrderedDictionaryKeyValueCollection";"False";"System.Object";"False"
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.