Компьютерный форум 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=344921)

Griboed0ff 20-04-2020 07:39 2918093

соединить три скрипта общим выводом.
 
доброго времени суток. Есть три скрипта, которые написали участники данного форума. Первый снимает
мак-адрес
Код:

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 2918355

было бы это в батнике, я бы просто слепил бы в один файл, а вывод настроил бы с помощью >, а второй и третий скрипт через >>. Тут оказалось сложнее как-то

Griboed0ff 21-04-2020 12:49 2918360

нашел два параметра -NoClobber -Force, вроде они выполняют функцию > >> подобно bat, но пока со значениями непонятно. Получается, что можно подобно батнику просто скопировать три скрипта в одно тело, а вывод у каждого свой, но в один и тот же файл. Первый скрипт будет перезаписывать файл, а два другие только дописывать.

YuS_2 21-04-2020 20:46 2918423

Цитата:

Цитата Griboed0ff
нашел два параметра -NoClobber -Force, вроде они выполняют функцию > >> подобно bat »

Не так... используйте параметр-переключатель -Append в Export-Csv, это позволит добавлять контент, а не перезаписывать его...

Griboed0ff 22-04-2020 16:13 2918554

Цитата:

Цитата YuS_2
используйте параметр-переключатель -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


YuS_2 22-04-2020 17:56 2918568

Цитата:

Цитата Griboed0ff
такой параметр нашел только у out-file. »

export-csv
Цитата:

Цитата Griboed0ff
появилась ошибка »

Параметры скрипта должны располагаться в самом начале скрипта, перед ними могут располагаться только комментарии.
В данном случае, это параметры скрипта:
Цитата:

Цитата Griboed0ff
param (
#[parameter(Mandatory=$true)]
$encode = 65001,
[string]$outfile = 'table.csv',
[int]$number = 1
) »


Цитата:

Цитата Griboed0ff
} Out-File 'D:\PowerShell\temp\общий.csv' -Append »

здесь пропущен оператор конвейера.

Griboed0ff 22-04-2020 19:03 2918576

Спасибо, все получилось. Я так понимаю, чтобы сделать это таблицей .csv надо перед Out-File еще команду вставить с оператором конвейером?

YuS_2 22-04-2020 20:25 2918587

Цитата:

Цитата Griboed0ff
чтобы сделать это таблицей .csv »

export-csv создает файл с разделителями, который Excel может конвертировать в таблицу. Никакого out-file не требуется.

Griboed0ff 22-04-2020 22:32 2918605

Цитата:

Цитата YuS_2
export-csv создает файл с разделителями, который Excel может конвертировать в таблицу. Никакого out-file не требуется. »

до того как я начал что-то сам делать так и было. Но проблема в том, что каждый скрипт переписывает файл, а не дописывает. Надо чтобы первый переписывал, остальные дописывали. Либо хитроумный вывод из трех, но тут я вообще не имею даже гипотез.

YuS_2 23-04-2020 06:29 2918619

Цитата:

Цитата Griboed0ff
Либо хитроумный вывод из трех, но тут я вообще не имею даже гипотез. »

Monster_Frankenstein
Код:

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 2923062

новая проблема, накидан
скрипт
Код:

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|VRN_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;
если второго монитора нет то просто записать какой-нибудь символ или слово в столбец. Но проблема еще в том, что запрос мака и производителя возвращает множество значений (ван порты, модемы и пр.), хотя та же команда выполеная локально выдает мне одну сетевую карту. Нужна именно встроенная проводная карта. Или хотя записать всю инфу оп пк в одну строку, возможно дальше буду как-то парсить инфу.

Iska 29-05-2020 22:15 2923241

Цитата:

Цитата Griboed0ff
новая проблема, накидан »

Griboed0ff, проблема одна — Вы ринулись в бой, не продумав стройной системы сбора. Поэтому Вы парсите, собираете в строку, потом опять парсите, потом опять собирате — и так по кругу.

Griboed0ff 02-06-2020 15:35 2923712

Цитата:

Цитата Iska
Вы ринулись в бой, не продумав стройной системы сбора. »

вы абсолютно правы, но дело не в том, что я не хочу этого делать, дело в том, что не могу из-за отсутствия знаний в 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

не могу понять как из этого вычленить сначала первый монитор, а потом второй и записать в одну строку подобно остальной инфе. И как заполнить пустые столбики чем-либо если конфигурация одним монитором.

А точнее, лучше не вычленять из результата, а сразу писать результат как надо.

Iska 02-06-2020 19:56 2923762

В данном случае Вы получаете массив из двух значений.

Griboed0ff 02-06-2020 21:38 2923778

Цитата:

Цитата Iska
В данном случае Вы получаете массив из двух значений. »

похоже что нет (рассматриваю пока модель), если выполняю
Код:

$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 2923799

в общем что-то получилось
Скрытый текст
Код:

$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 2923805

еще многие компы ответили так
Скрытый текст
Код:

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 2923806

Цитата:

Цитата Griboed0ff
не правильно запрашиваю производителя и модель? »

заменил Get-CimInstance на Get-WmiObject работает. Осталось только
Цитата:

Цитата Griboed0ff
но есть проблема. Если мониторов вообще нет то записываются предыдущие данные. Как оставить поле пустым или его заполнить например "-"?!
Скрытый текст
ну и как то избавиться от красноты, так где нет мониторов вообще такие вот ошибки:
Скрытый текст »


Fors1k 03-06-2020 01:45 2923814

Код:

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 2923822

ваш код так же записывает прошлое значение если нет мониторов, например, 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_object

Код:

Name                          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"


Griboed0ff 03-06-2020 11:26 2923833

не знаю как, но проблема с заполнением полей сама ушла
Итого:
Код:

Param( #powershell
        [string]$Region,
#[parameter(Mandatory=$true)]
    [String]$a=((Get-Date).ToShortDateString() | Foreach-Object {$_ -replace "\.", ""}) ,
        [string]$outfile = "D:\PowerShell\франкин\test\all_$a.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|VRN_B|RND_B|NSK_B]" 
            exit
    }

    $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 "Прошлись по $Region. Получили $counter записей" -ForegroundColor Yellow
     
  $pcs2|% {
        $name = $_.name
        if ((Test-Connection -Cn $name -Count 1 -quiet -ErrorAction SilentlyContinue) -eq $False) {
                Write-host "$name;не пингуется" -ForegroundColor Yellow
                $forLog = $name+";"+"не пингуется"
        $ofs = ''
        [string]$Region2 = $Region[0..2]
        [string]$Region3 = $Region[4]
        $hash_object1 = [ordered] @{"on\off" = "no ping"; Region = $Region2; "B\S\TT" = $Region3; "PSComputerName" = $name; Manufacturer = " "; Model = " "; Serialnumber = " ";"IPv4" = " "; MACAddress = " "; name = " "; AdapterType = " "; Speed = " "; "Monitor 1" = " "; "Monitor SN 1" = " "; "Monitor 2" = " "; "Monitor SN 2" = " ";  }
        $ps_object1 = [pscustomobject]$hash_object1
        $ps_object1 | export-csv $outfile -notype -enc utf8 -d ';' -append
                } else {
$ofs = ''
Write-host "$name пингуется, выполняем проверку" -ForegroundColor Green
$ip = gwmi -ComputerName $name Win32_NetworkAdapterConfiguration | foreach { $_.IPAddress }
#$ipv4 = $ip.Split(",")[-1]
$ip1 = gwmi -ComputerName $name Win32_NetworkAdapterConfiguration |Where { $_.DefaultIPGateway}|foreach {$_.DefaultIPGateway}
$PSComputerName = Get-WmiObject -computername $name Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.PSComputerName}
$MACAddress = Get-WmiObject -computername $name Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.MACAddress}
$namenet = Get-WmiObject -computername $name Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.name}
$AdapterType = Get-WmiObject -computername $name Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.AdapterType}
$Speed = Get-WmiObject -computername $name Win32_NetworkAdapter -Filter "NetConnectionStatus>0" |foreach {$_.Speed}
$Manufacturer = Get-WmiObject -computername $name -ClassName Win32_ComputerSystem  |foreach {$_.Manufacturer} 
$Model = Get-WmiObject -computername $name -ClassName Win32_ComputerSystem  |foreach {$_.Model}
$SN = Get-WmiObject -computername $name Win32_BaseBoard | foreach {$_.SerialNumber}       
$mm = [char[]]((gwmi wmimonitorid -Namespace root\wmi -ComputerName $name).UserFriendlyName)-join ""
[string]$mmod1 = $mm[0..12]
[string]$mmod2 = $mm[13..26]
$msn = [char[]]((gwmi wmimonitorid -Namespace root\wmi -ComputerName $name).SerialNumberID)-join ""
[string]$msn1 = $msn[0..15]
[string]$msn2 = $msn[16..32]
[string]$Region4 = $Region[0..2]
[string]$Region5 = $Region[4]
$hash_object = [ordered] @{"on\off" = "ping"; Region = $Region4; "B\S\TT" = $Region5; "PSComputerName" = $PSComputerName; Manufacturer = $Manufacturer; Model = $Model; Serialnumber = $SN; "IPv4" = "$ipv4"; MACAddress = $MACAddress; name = $namenet; AdapterType = $AdapterType; Speed = $Speed; "Monitor 1" = $mmod1; "Monitor SN 1" = $msn1; "Monitor 2" = $mmod2; "Monitor SN 2" = $msn2;  }
$ps_object = [pscustomobject]$hash_object
$ps_object | export-csv $outfile -notype -enc utf8 -d ';' -append
}}

результат
Код:

"on\off";"Region";"B\S\TT";"PSComputerName";"Manufacturer";"Model";"Serialnumber";"IPv4";"MACAddress";"name";"AdapterType";"Speed";"Monitor 1";"Monitor SN 1";"Monitor 2";"Monitor SN 2"
"ping";"ekt";"s";"6-SERVER";"Hewlett-Packard";"HP ProDesk 400 G2 MT";"CZC4483YKL";"";"A0:D3:C1:4D:52:C1";"Realtek PCIe GBE Family Controller #4";"Ethernet 802.3";"1000000000";"";"";"";""
"ping";"ekt";"b";"PC-PANOV";"KRAFTWAY";"GEG";"                      ";"";"D0:27:88:72:3F:98";"Realtek PCIe GBE Family Controller";"Ethernet 802.3";"100000000";"HP E231      ";"3CQ3470WJF      ";"HP E231      ";"3CQ4070QH5      "
"no ping";"ekt";"b";"PC-CHIOV";" ";" ";" ";" ";" ";" ";" ";" ";" ";" ";" ";" "
"ping";"ekt";"b";"PC-BYCHA";"Hewlett-Packard";"HP ProDesk 400 G2 MT";"CZC44846ZW";"";"A0:D3:C1:4E:85:E8";"Realtek PCIe GBE Family Controller #4";"Ethernet 802.3";"100000000";"HP W2072a    ";"CNC238PNJN      ";"";""
"ping";"ekt";"t";"008-5";"Hewlett-Packard";"HP ProDesk 400 G1 SFF";"CZC4483ZWL";"";"64:51:06:3B:4A:8D";"Realtek PCIe GBE Family Controller #3";"Ethernet 802.3";"1000000000";"HP W2072a    ";"CNC435PJ5D      ";"";""

проблема еще в том, что теперь скрипт на сильно удаленных пк довольно медленно работает. И траблы с получением ipv4, нужно выловить только с активной карты и только тот адрес, который начинается с 10.*.*.*; Начинаю думать как теперь по хитрецки записывать ответы в таблицу (или уже базу создать), надо сделать как-то чтобы дубли не писал. Перед записью проверить наличие записываемой инфомации о пк в файле, если ее там нет то записать, если она изменилась то записать новую удалив старую, если уже есть и актуальная то пропустить. Есть мысли в какую сторону подумать?

Iska 03-06-2020 20:06 2923874

Цитата:

Цитата Griboed0ff
…(или уже базу создать), надо сделать как-то чтобы дубли не писал. »

Вы плавно движетесь в правильном направлении.

Цитата:

Цитата Griboed0ff
то записать новую удалив старую, »

А не надо «удалять старую». Совсем не надо.

Griboed0ff 03-06-2020 20:48 2923880

Цитата:

Цитата Iska
А не надо «удалять старую». Совсем не надо. »

Почему не удалять? Оставить для истории изменений? Тогда дату добавить что ли.. Можете подсказать как можно ускорить выполнение скрипта? А то выполняется очень медленно. Мб как-то делать меньше запросов в один и тот же класс, а потом уже вычленять нужное в переменные? Но как ума не приложу. Я уже пробовал запараллелить через кор, но там проблемы с Get-WmiObject, gwmi и модулем AD, на Get-Ciminstance 90% компов ответили ошибками.

Fors1k 03-06-2020 21:02 2923882

Цитата:

Цитата Griboed0ff
записывает прошлое значение если нет мониторов

Monitor9 HP E231 [3CQ4070X4Z]
Monitor10 HP E231 [6CM4221RHC] »

А Вас номера мониторов совсем не смущают?))
Если планируете запускать скрипт много раз в одной сессии, то замените первую строку на Param($rv=(rv * -ea 0), .

Griboed0ff 03-06-2020 23:41 2923908

Цитата:

Цитата Fors1k_m
А Вас номера мониторов совсем не смущают?)) »

Да вот как раз номера то и смутили. Я просто не понимаю возможно как вашим кодом пользоваться. Сделал так
Код:

Param($rv=(rv * -ea 0),
    $a=((Get-Date).ToShortDateString() | Foreach-Object {$_ -replace "\.", ""}) ,
    $outfile = "E:\video\1111.csv",
    $pp = "10.10.10.7"
)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-WmiObject -computername $pp -ClassName Win32_ComputerSystem  |foreach {$_.Manufacturer} 
$Model = Get-WmiObject -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 "")+']')}

$ps_object = [pscustomobject]$hash_object
$ps_object | export-csv $outfile -notype -enc utf8 -d ';' -append

вывод получился такой:
Код:

"PSComputerName";"Manufacturer";"Model";"Serialnumber";"MACAddress";"name";"AdapterType";"Speed";"Monitor11"
"DESKTOP-84S5RK8 DESKTOP-84S5RK8 DESKTOP-84S5RK8 DESKTOP-84S5RK8 DESKTOP-84S5RK8 DESKTOP-84S5RK8 DESKTOP-84S5RK8";"Gigabyte Technology Co., Ltd.";"To be filled by O.E.M.";"To be filled by O.E.M.";"74:D4:35:08:86:7C      ";"Realtek PCIe GbE Family Controller VirtualBox Host-Only Ethernet Adapter VirtualBox Host-Only Ethernet Adapter VirtualBox Host-Only Ethernet Adapter VirtualBox Host-Only Ethernet Adapter VirtualBox Host-Only Ethernet Adapter VirtualBox Host-Only Ethernet Adapter";"Ethernet 802.3      ";"100000000      ";"HP W2072a [CNC401NT3L]"

И еще из-за того, что имя столбца всегда разное export-csv не может записать инфу файл больше одного раза получается ошибка:
Код:

export-csv : Не удается присоединить содержимое CSV к следующему файлу: E:\video\1111.csv. У присоединяемого объекта отсутствует свойство, соответствующее сл
едующему столбцу: Monitor11. Чтобы продолжить работу при наличии несоответствий свойств, добавьте параметр -Force и выполните команду снова.
строка:20 знак:14
+ $ps_object | export-csv $outfile -notype -enc utf8 -d ';' -append
+              ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (Monitor11:String) [Export-Csv], InvalidOperationException
    + FullyQualifiedErrorId : CannotAppendCsvWithMismatchedPropertyNames,Microsoft.PowerShell.Commands.ExportCsvCommand

Так же модель и серийник записываются в одну ячейку, а не в две. Надеюсь я просто не понимаю как правильно вывести результат..

DJ Mogarych 04-06-2020 10:38 2923937

Цитата:

Цитата Griboed0ff
$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-WmiObject -computername $pp -ClassName Win32_ComputerSystem |foreach {$_.Manufacturer}
$Model = Get-WmiObject -computername $pp -ClassName Win32_ComputerSystem |foreach {$_.Model}
$SN = Get-WmiObject -computername $pp Win32_BaseBoard | foreach {$_.SerialNumber} »

Зачем сто раз запрашивать одно и то же? Достаточно сделать один запрос, а потом получить данные.
И зачем там foreach?
Код:

$adapter = gwmi -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0"

$adapter.macaddress
$adapter.AdapterType
$adapter.speed

Вообще, прежде чем браться за подобные монструозные проекты, желательно поизучать то, на чём вы это всё пытаетесь реализовать, иначе так и будете пытаться составить лоскутное одеяло из разнородных скриптов, написанных разными людьми по-разному, и создавать километровые темы.

Busla 04-06-2020 11:44 2923947

Цитата:

Цитата DJ Mogarych
прежде чем браться за подобные монструозные проекты, желательно поизучать то, на чём вы это всё пытаетесь реализовать »

зачем? - предприятие деньги на инвентаризации сэкономило, offer выполнен, премия получена

DJ Mogarych 04-06-2020 12:42 2923959

Ну получена и получена, мне-то всё равно. Я о другом. Всё равно работает-то через одно место это детище Франкенштейна.
И улучшать его, лезть и разбираться уже не хочется, видя отношение ТС к процессу и нежелание нормально разобраться с написанием скриптов самому.
А ведь с момента первых сообщений по этой теме прошло уже немало времени.

Griboed0ff 04-06-2020 14:30 2923985

Цитата:

Цитата DJ Mogarych
нежелание нормально разобраться с написанием скриптов самому »

Сначала начальника хотел просто разовую выгрузку с небольшого количества пк, для чего и был сделан мелкий скрипт. Позже надо стало больше компов, потом вообще все регионы. Так же сначала надо было одни данные потом другие, но в целом количество данных растет. Я до этого форума вообще не знал что такое ps, по мере поступления задач\проблем погружаюсь в изучение PS. Не всем дается легко скриптописание когда ничего до этого не писал. Намного лучше получается если просто переделать чей-то скрипт. Хуже получается когда сам начинаю писать, получается невероятное громоздкое что-то. На форум надеюсь в плане подсказки. Потому что иногда не могу нагуглить что мне нужно, просто видимо не получается правильно сформировать запрос. Времени на от корки до корки пошик поучить нету, но задача есть и делать надо хоть как. Большинство этих франкенштейнчиков работает, их задача часто очень маленькая, даже если они работают через одно место.
Цитата:

Цитата DJ Mogarych
улучшать его, лезть и разбираться уже не хочется »

но уже залезли и дали подсказку
Цитата:

Цитата DJ Mogarych
Код:

$adapter = gwmi -computername $pp Win32_NetworkAdapter -Filter "NetConnectionStatus>0"
$adapter.macaddress
$adapter.AdapterType
$adapter.speed

»

И этого уже достаточно, на этом спасибо!
Цитата:

Цитата Busla
offer выполнен, премия получена »

Может кто-то и получил, меня просто не уволили.

Griboed0ff 04-06-2020 14:52 2923990

Цитата:

Цитата DJ Mogarych
Зачем сто раз запрашивать одно и то же? Достаточно сделать один запрос, а потом получить данные. »

вот я ранее об и думал, но не знал как.
Цитата:

Цитата Griboed0ff
Мб как-то делать меньше запросов в один и тот же класс, а потом уже вычленять нужное в переменные? »


DJ Mogarych 04-06-2020 21:30 2924015

Цитата:

Цитата Griboed0ff
уже залезли и дали подсказку »

Это лежит на поверхности, но я не собираюсь вникать в тот ужас, с которого эта тема началась.

Лично я освоил Powershell за несколько месяцев, прочитав книжку "Learn Windows PowerShell in a Month of Lunches", а потом выборочно - "PowerShell in Depth". Причём, никакого опыта программирования у меня не было - до этого я писал элементарнейшие скрипты CMD. То, что пишет в CMD, например, Megaloman, я не понимаю и сейчас.

Если не читаете на английском, есть куча русских источников, в этой ветке есть прикреплённая тема "Справочный материал Powershell".

Было бы желание, ну и читать надо последовательно и с начала, чтобы в голове складывалась какая-то система и понимание, что к чему.

Iska 04-06-2020 23:40 2924021

Цитата:

Цитата Griboed0ff
Тогда дату добавить что ли.. »

Да. ДатаВремя-Домен-Имя машины — набор полей для ключа таблицы.

DJ Mogarych, не, на русском нихрена до сих пор ничего вменяемого нет. Увы.

Но проблема и в том, что даже на английском нет даже вменяемой документации (читать блоги разработчиков, это, конечно, занимательно и пользительно, но не заменяет наличия полноценной документации). Всё дёргано, разнородно, здесь работает-здесь не работает, и требует обязательной проверки и опробования на практике.

DJ Mogarych 05-06-2020 10:43 2924056

Кто ищет - тот всегда найдёт.
А насчёт разнородности и проверок - это как у любого развивающегося языка, а особенно, которому надо поддерживать всякую совместимость со старыми технологиями.

Iska 06-06-2020 05:45 2924145

Цитата:

Цитата DJ Mogarych
Кто ищет - тот всегда найдёт. »

DJ Mogarych, ну, ежели что-нибудь за последние пару-тройку лет здесь изменилось — расскажите об этом в прикреплённых темах.

Цитата:

Цитата DJ Mogarych
А насчёт разнородности и проверок - это как у любого развивающегося языка, а особенно, которому надо поддерживать всякую совместимость со старыми технологиями. »

Аааааа… Проблема в том, что его создатели действовали аналогично коллеге Griboed0ff — не продумав ни стройной системы, ни общих принципов, ни концепции развития.


Время: 18:56.

Время: 18:56.
© OSzone.net 2001-