IT rekvalifikace s garancí práce. Seniorní programátoři vydělávají až 160 000 Kč/měsíc a rekvalifikace je prvním krokem. Zjisti, jak na to!
Hledáme nové posily do ITnetwork týmu. Podívej se na volné pozice a přidej se do nejagilnější firmy na trhu - Více informací.

Diskuze: PowerShell - pouzitie Parallel processing - Workflow a vratenie vystupnych premenych

Aktivity
Avatar
Patrik Živčák:29.8.2019 13:50

Pomalsia verzia skriptu mi ide snažim sa použit tzv. Parallel processing na zistenie statusu online a offline statusu u PC.

Zkusil jsem: Cele to ide len sa snažim aby sda to rozdelilo na vlakna proste každy PC otestovat zvlast v rovnakom čase a dostat spoločny vypis

foreach($computer in $computers)
{
Remove-Variable lastboot -ErrorAction SilentlyContinue

    if(Test-Connection -BufferSize 32 -Count 1 -ComputerName $computer -Quiet)
    {
        try
        {
            $lastboot = Get-WmiObject win32_operatingsystem -ComputerName $computer
            $lastboot = $lastboot.ConvertToDateTime($lastboot.LastBootUpTime).ToString("dddd dd.MMMM.yyyy o HH:mm")
            $type = (Get-WmiObject win32_ComputerSystem -ComputerName $computer)
            $Network_Info = Get-WmiObject win32_networkadapterconfiguration -ComputerName $computer  ` | Select-Object -Property @{name='IPAddress';Expression={($_.IPAddress[0])}},MacAddress  ` | Where IPAddress -match '10.*'
            [string] $IP_MAC = "IP: "+($Network_Info | select IPAddress -ExpandProperty IPAddress) + " | MAC: "+($Network_Info | select MACAddress -ExpandProperty MACAddress)

            if($type.Manufacturer.Equals("HP") -or $type.Manufacturer -like 'VM*')
            {
                $computerType = $type.Model
            }
            else
            {
                $computerType = $type.Manufacturer+" "+$type.Model
            }
            $online += $computer+" - Online --> "+$ComputerType +" | $IP_MAC | Posledný reštart: $lastboot `n"
        }
        catch
        {
            $online += $computer+" - Online `n"
        }
    }
    else
    {
        $offline += $computer+" - Offline `n"
    }
}

# Vypis ziskanych informacii + osetrenia --> vzdy vypise co moze zavisi od prav
if($computers)
{
    try
    {
        # select z DB
        $Info_ID = SQL_Info($users.ToString().Substring(1,5))
        $phone = $Info_ID | select Lin1 -ExpandProperty Lin1
        $room = $Info_ID | select Mistnost -ExpandProperty Mistnost
        If(!$offline)
        {
            Write-Host "`nVypis zariadení pre: $displayName ($user) | Telefón: $phone | Miestnosť: $room"
            Write-Host "`n$online" -ForegroundColor Green
        }
        ElseIf(!$online)
        {
            Write-Host "`nVypis zariadení pre: $displayName ($user) | Telefón: $phone | Miestnosť: $room"
            Write-Host "`n$offline" -ForegroundColor Red
        }
        else
        {
            Write-Host "`nVypis zariadení pre: $displayName ($user) | Telefón: $phone | Miestnosť: $room"
            Write-Host "`n$online" -ForegroundColor Green
            Write-Host "$offline" -ForegroundColor Red
        }
    }
    catch
    {
        If(!$offline)
        {
            Write-Host "`nVypis zariadení pre: $displayName ($user)"
            Write-Host "`n$online" -ForegroundColor Green
        }
        ElseIf(!$online)
        {
            Write-Host "`nVypis zariadení pre: $displayName ($user)"
            Write-Host "`n$offline" -ForegroundColor Red
        }
        else
        {
            Write-Host "`nVypis zariadení pre: $displayName ($user)"
            Write-Host "`n$online" -ForegroundColor Green
            Write-Host "$offline" -ForegroundColor Red
        }
    }
}
else
{
    try
    {
        # select z DB
        $Info_ID = SQL_Info($users.ToString().Substring(1,5))
        $phone = $Info_ID | select Lin1 -ExpandProperty Lin1
        $room = $Info_ID | select Mistnost -ExpandProperty Mistnost
        Write-Host "`nVypis zariadení pre: $displayName ($user) | Telefón: $phone | Miestnosť: $room"
        Write-Host "Zvolenemu uzivatelovi, nebol podla zaznamov prideleny ziadny PC alebo notebook!" -ForegroundColor Yellow
    }
    catch
    {
        Write-Host "`nVypis zariadení pre: $displayName ($user)"
        Write-Host "Zvolenemu uzivatelovi, nebol podla zaznamov prideleny ziadny PC alebo notebook!" -ForegroundColor Yellow
    }
}

Chci docílit: Prve pokusy ide to ale vypisuje len online PC a hej je to rychlejšie len nechapem ako vratit premennu. Idealne by bolo aby sa to cele rozdelilo a spracovalo paralelne myslim tym ten kod hore zatial mam ale problem aj ulozit do premennej online a offline PC

workflow Ping
{
    param($computers)
    $online = @()
    $offline = @()

    foreach -parallel ($computer in $computers)
    {
        $status = Test-Connection -ComputerName $computer -Count 1 -Quiet

        if ($status)
            {  $WORKFLOW:online += $computer }
        else
            {  $WORKFLOW:offline += $computer}

    }
}

$computers =  Get-ADComputer -SearchBase "OU=CZ900000,OU=CSCR,DC=cs,DC=mfcr,DC=cz" -LDAPFilter "(&(name=*12481*))" | select name -ExpandProperty Name


$exist = Ping $computers
Write-Host $exist
 
Odpovědět
29.8.2019 13:50
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Patrik Živčák
Jirka Jr:29.8.2019 14:36

ten workflow jsem ještě nezkoušel, ani foreach parallel

ale mohl by to vyresit Start-Job a souvisejici commandlety na joby

uvidim, jestli budu mit vecer vic casu na to mrknout a neco vic k tomu napsat

 
Nahoru Odpovědět
29.8.2019 14:36
Avatar
Odpovídá na Jirka Jr
Patrik Živčák:29.8.2019 16:54
workflow PingTestOnline
{
    param($computers)
    foreach -parallel ($computer in $computers)
    {
        $TestResult = Test-Connection -ComputerName $computer -Count 1 -Quiet
        if($TestResult)
        {
            Write-Output $computer
        }
        elseif(!$TestResult)
        {
            Write-Output $computer
        }
    }
}

$computers = Get-ADComputer -SearchBase "***" -LDAPFilter "(&(name=*12481*))" | select name -ExpandProperty Name

PingTestOnline $computers

Ak by sa dalo aspon toto rozdelit aby mu vracalo $online a $offline premennu tak u6 bz som dalej vedel ale to sa proste neda asi.

Editováno 29.8.2019 16:55
 
Nahoru Odpovědět
29.8.2019 16:54
Avatar
Patrik Živčák:29.8.2019 18:19

Takže som prišiel na toto:

Workflow Test-MultiConnection {
param([string[]] $ComputerName)
foreach -Parallel ($Computer in $ComputerName) {
sequence {
$online = Test-Connection -ComputerName $Computer -Count 1 -Quiet
$Obj = New-Object -Type PSObject -Property @{
ComputerName = $Computer
Online = $online
}
$Obj
}
}
}

$computers = Get-ADComputer -SearchBase "OU=***" -LDAPFilter "(&(name=*24519*))" | select name -ExpandProperty Name
$output = Test-MultiConnection $computers | Select -Property ComputerName, Online | Format-Table -AutoSize #DO TADIAL TO IDE
$online = $output | select ComputerName
$online

V obrazku je to spohladu debugeru preco boze nemozem vyselectovat tie ktore maju Pod Property Online status true. Dokonca nemozem ani selectovat vseobecne cely stlpec a pritom riadok 16 to bez problemu robi omg.

Sorry obrazok je nanic ale je to to vpravo precitat sa to da. A teda riadok 16 este funguje :

$output = ....
Editováno 29.8.2019 18:22
 
Nahoru Odpovědět
29.8.2019 18:19
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Patrik Živčák
Jirka Jr:29.8.2019 22:27

tak to jsem rád, že jsi mi ušetřil luštění a už ti to jede ;-)

jinak k tomu selectovani .... mam pocit ze pletes selectovani a filtrovani

....selectovani (Select-Object) rika, ktere sloupce (vlastnosti) ze vsech vstupnich maji projit dal
....filtrovani (Where-Object) rika, ktere radky (objekty) ze vsech vstupnich maji projit dal

priklad .... mas tabulku(pole objektu) $lide

Cislo Jmeno Prijmeni
1 Pepa Novak
2 Jirka Kolar
3 Antonin Novy

$lide | select -Property Cislo, Prijmeni

Cislo Prijmeni
1 Novak
2 Kolar
3 Novy

$lide | where { $_.Cislo -lt 3 }

Cislo Jmeno Prijmeni
1 Pepa Novak
2 Jirka Kolar

takze pokud chces jen radky s pocitacema, ktery jsou online, tak vybiras radky - potrebujes filtrovat pomoci where-object / where

Akceptované řešení
+20 Zkušeností
+2,50 Kč
Řešení problému
 
Nahoru Odpovědět
29.8.2019 22:27
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Patrik Živčák
Jirka Jr:29.8.2019 22:48

tedy videl bych to na neco jako

$online = $output | where {$_.Online -eq $True } | select ComputerName
$online

to nejdriv pusti dal jen ty radky, ktere jsou online
potom to z kazdeho 'online' radku vybere pouze sloupec s nazvem pocitace

defacto select a where tady funguje jako v SQL, pokud jsi uz nekdy v SQL neco delal ... pokud ne, tak po tomhle bude lehci se ho naucit ;-)

 
Nahoru Odpovědět
29.8.2019 22:48
Avatar
Patrik Živčák:30.8.2019 7:34

Hej ja som to skušal ale toto sa sprava velmi zvlaštne akoby tohadam ani nešlo skus si to je to vlastne obdoba tamtoho, len testujeme webove stranky debugni si to na online a uvidiš aky je vystup ani sa mi tomu verit nechce:

Workflow Test-MultiConnection {
param([string[]] $ComputerName)
foreach -Parallel ($Computer in $ComputerName) {
sequence {
$online = Test-Connection -ComputerName $Computer -Count 1 -Quiet
$Obj = New-Object -Type PSObject -Property @{
ComputerName = $Computer
Online = $online
}
$Obj
}
}
}

$computers = "dsl.sk", "pokec.sk", "google.com","hfgfh.sk", "yacloskj.sk"
$output = Test-MultiConnection $computers | Select -Property ComputerName, Online | Format-Table -AutoSize #DO TADIAL TO IDE
$online = $output | where {$_.Online -eq $true } | select ComputerName
$online
Editováno 30.8.2019 7:36
 
Nahoru Odpovědět
30.8.2019 7:34
Avatar
Odpovídá na Patrik Živčák
Patrik Živčák:30.8.2019 8:13

Robi to to format table omg kurnik vcera 3 hodiny asi som nato nemohol prist do 19 som bol v praci a to som chcel odist o 15 xD. Format-Table znici tu tabulku akokeby a uz z nej sa neda selectovat. Nevieš prečo je to tak?

 
Nahoru Odpovědět
30.8.2019 8:13
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Patrik Živčák
Jirka Jr:30.8.2019 9:59

jj, takových zásekových situací jsem si taky užil... a jeste užiju :-D

format-table ti prevede objekty na textovou reprezentaci plus formatovaci instrukce.... tedy puvodni objekty uz nejsou/byly zahozeny (da se ale resit... jsou zpusoby jak vypsat a dal zpracovavat)

tady se hodi poznamenat, že powershell rozlisuje mezi zpracovavanymi objekty a jejich textovou reprezentaci, kterou vypisuje na konzoli.... narozdil od cmd nebo bash, ktere zpracovavaji stringy/znaky a ty same stringy/znaky vypisuji

powershell na konci kazdeho radku, ktery mu odEntrujes, automaticky pusti defaultni formatovac na objekty, ktere po zpracovani radku na konci vylezly

takovych ficurek a tajemnych vlastnosti ma powershell vic a i proto mě přitahuje :-)

 
Nahoru Odpovědět
30.8.2019 9:59
Děláme co je v našich silách, aby byly zdejší diskuze co nejkvalitnější. Proto do nich také mohou přispívat pouze registrovaní členové. Pro zapojení do diskuze se přihlas. Pokud ještě nemáš účet, zaregistruj se, je to zdarma.

Zobrazeno 9 zpráv z 9.