Geek tričko zdarma Geek tričko zdarma
Tričko zdarma! Stačí před dobitím bodů použít kód TRIKO15. Více informací zde

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

Aktivity (1)
Avatar
Patrik Živčák:29. srpna 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. srpna 13:50
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Patrik Živčák
Jirka Jr:29. srpna 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. srpna 14:36
Avatar
Odpovídá na Jirka Jr
Patrik Živčák:29. srpna 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. srpna 16:55
 
Nahoru Odpovědět 29. srpna 16:54
Avatar
Patrik Živčák:29. srpna 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. srpna 18:22
 
Nahoru Odpovědět 29. srpna 18:19
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Patrik Živčák
Jirka Jr:29. srpna 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í
+1 bodů
Řešení problému
 
Nahoru Odpovědět 29. srpna 22:27
Tento výukový obsah pomáhají rozvíjet následující firmy, které dost možná hledají právě tebe!
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Patrik Živčák
Jirka Jr:29. srpna 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. srpna 22:48
Avatar
Patrik Živčák:30. srpna 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. srpna 7:36
 
Nahoru Odpovědět 30. srpna 7:34
Avatar
Odpovídá na Patrik Živčák
Patrik Živčák:30. srpna 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. srpna 8:13
Avatar
Jirka Jr
Člen
Avatar
Odpovídá na Patrik Živčák
Jirka Jr:30. srpna 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. srpna 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.