Diskuze: PowerShell - sortovanie


- otevrit csv
- prevest na pole
- vlastni sortCompare (a,b) {if (a[5]==b[5]) return 0; if (a[5]>b[5]) return +1; return -1}, porovnava sloupec sislo 5
- sort(pole, sortCompare)
Takhle to umi treba javascript, tvuj jazyk, netusim.
https://webapp.fpf.slu.cz/…as3-view.htm
Jirka Jr:14.8.2019 20:40
to co tam pouzivas, je hvezdickova konvence pouzivana v cmd v prikazu dir apod.
operator -match pouziva regularni vyrazy
Where-Object { $_.IP_adresa.TrimStart() -match "^10\.14\..*"}
^ je zacatek retezce
\. je tecka ( . je libovolny znak)
.* je libovolny znak libovolnekrat (vcetne prazdneho retezce)
a ten TrimStart() je metoda z C# (ano v Powershellu lze pouzivat metody C#
), ktera orizne bile znaky na
zacatku retezce
cesky clanek o operatoru -match v Powershellu:
https://blogs.technet.microsoft.com/…shell-st-20/
Patrik Živčák:21.8.2019 9:24
ahoj nevedel by si poradit mam taky problem mam csv vlastne to suvisi s typ predtym. V Headers pod MAC mam MAC adresy pre tlačiarne akurat niektore tlačiarne maju dve MAC oddelene čiarkou a ja potrebujem oddelit len tu prvu alebo inac len prvych 17 znakov a ta druha MAC nieje podstatna musi to byt pre cely stlpec respektive všetky bunky pod stlpcom MAC. Ukažka je v obrazku (2. v poradi). Viem, že ked orežem tie bunky toho stlpca na prvych 17 znakov musi to ist len neviem ako.
$getFile = Get-Content $file | ConvertFrom-Csv -Delimiter ";" -Header "Tiskarna","Model","MAC", "IP_adresa", "ID_terminalu" | Sort-Object -Property MAC, IP_adresa | Group-Object MAC | ForEach {$_.Group | Select-Object -First 1 } | ConvertTo-Csv -NoTypeInformation | % {$_.Replace('"','')} | Select-Object -SkipLast 1
Ono to ide len mi potom spravi to co je ukazane v obrazku (1. v poradi). Teda Mam tam MAC a druha MAC je na mieste kde ma byt IP a cely ten riadok je posunuty.
Prosim o radu ako to vyselektovat. Najlepsie by bolo najskor ten MAC stlpec osekat na 17 znakov a potom spravit to co mam v tom kode.
Jirka Jr:21.8.2019 18:51
treba takto pomoci dotnet metody substring? (je to jen vyrez. je to treba doplnit do tveho megaonelineru)
ConvertFrom-Csv -Delimiter ";" -Header "Tiskarna","Model","MAC", "IP_adresa", "ID_terminalu" | %{ $_.MAC = $_.MAC.TrimStart().Substring(0,17); $_ }
nebo takto pomoci select-object a calculated property? (opet jen nastrel ... je treba zapracovat do tveho kodu)
ConvertFrom-Csv -Delimiter ";" -Header "Tiskarna","Model","MAC", "IP_adresa", "ID_terminalu" | select-object Tiskarna, Model, @{label="MAC";expression={($_.MAC -split ',')[0]}}, IP_adresa, ID_terminalu
P.S.: pokud ti neco ode me v tomhle diskuznim vlaknu pomohlo ci pomuze, tak
urcite nepohrdnu akceptovanym resenim
Patrik Živčák:21.8.2019 19:56
ak sa možem opytat mna ako prve napadol substring ešte som to neskusil ale
skusim zajtra.
K tvojmu kodu čo znamena v druhom rieešeni nakonci: [0] Viem,
6e split() rozdeli retazec na pole podretazcov podla nejakeho seperatora tak to
bolo v .NET kurze.
Ja som to riešil 2 dni skušal som priklad samozrejme to nešlo:
$getFile = (Get-Content $file | ConvertFrom-Csv -Delimiter ";" -Header 'Tiskarna','Model','MAC','IP_adresa','ID_terminalu') |
select Tiskarna, Model, @{Name="MAC".Substring(0,17);Expression={$_."MAC"}}
Potom aj ine niečo na štyl možnosti napr ale tiež mimo.
$getFile = (Get-Content $file | ConvertFrom-Csv -Delimiter ";" -Header 'Tiskarna','Model','MAC','IP_adresa','ID_terminalu') | foreach-object MAC | % {$_.Substring(0,16)}
A plno inych možnosti som skušal niektore s ich boli skladbou prikazov tak na 90% rovnake ako tie dve tvoje a lišili sa len v drobnostiach.
Odkiaľ vieš v akom tvare všeobecne som sa pohyboval velmi blizko oboch
tych riešeni čo si napisal ale proste nikdy to nešlo.
Napr. aky je rozdiel medzi:
.... | foreach-object MAC | {$_.xxx}
a
.... | foreach-object MAC | % {$_.xxx}
Aky je rozdiel ked das % a čo vlastne znamena
$_. percento viem, že to niekde použivaju a nieekdy to
funguje inokedy nie
Niekde som videl dokonca v kode použil a šlo to potom pri osekani MAC mi to
nešlo vobec:
.... | xxxx | % {$_.Substring(x,x)}
Jirka Jr:21.8.2019 23:40
zacnu od druhe casti:
- % je to same co foreach-object .... stejne jako ? je to same co where-object (powershell ma takovych zkratek-aliasu vic a muzes si vytvaret i vlastni)
- {$_.xxx} je vyraz generujici jeden jediny objekt typu scriptblock
- %{$_.xxx} je commandlet foreach-object prijimajici objekty/radky na vstupu a na vystupu vyhazujici pouze sloupec/vlastnost xxx .... commandlet foreach-object je neco jako funkce, ktera na vstupu prijima jeden objekt za druhym, nad kazdym objektem vyhodnoti vyraz uzavreny v {} a vysledek vyhodnoceni plivne na vystup {neco jako takovy zpracovavac objektu}
krasne to uvidis, kdyz si spustis dva nasledujici kody
{neexistujici_funkce}
vs
%{neexistujici_funkce}
prvni ti vypise text skriptu/vyrazu uzavreneho ve slozenych zavorkach a dal ho neresi
druhy se pokusi zanalyzovat skript/vyraz ve slozenych zavorkach, aby ho mohl provest (nebude provadet, protoze nema nic na vstupu, ale stejne zanalyzuje a vyhodi chybu o neexistujici funkci)
4. $_ je docasna promenna, ktera znamena aktualne zpracovavany objekt ..... proste, kdyz ti dojde pres rouru do %{ } jeden objekt s celym radkem z CSVcka, tak je ten objekt ulozenej v $_ a ty v tech slozenejch zavorkach pouzijes $_, abys s tim prichozim objektem pracoval
+20 Zkušeností
+2,50 Kč

Jirka Jr:21.8.2019 23:47
.... | xxxx | % {$_.Substring(x,x)}
nekde ti tohle muze fachcit, nekde ne
pokud zacatek roury ....|xxxx| plive jeden string za druhym, tak ok, na vystupu budes mit substringy tech stringu
pokud ale ....|xxxx| plive jiny typ objektu nez stringy (csv radky, objekty windowsich servis, etc), tak ti to zarve, protoze to v tech objektech nenajde metodu substring
kdyz nevis, jestli ti na vstup | % {$_.Substring(x,x)} prichazi stringy nebo neco jineho, je dobre overit si typ prichazjicich objektu
treba takto
.... | xxxx |select -first 1| % {$_.gettype()}
to ti vytahne prvni objekt a ostatni zahodi .... a na vytazenem objektu ti to zjisti typ a vypise nazev toho typu
Jirka Jr:22.8.2019 0:11
tak, tema vlakna se rozsiruje o dalsi a dalsi otazky a brzy by se z vlakna stal celotydenni vyukovy kurz
zkus zacit od
Get-Content $file | ConvertFrom-Csv -Delimiter ";" -Header "Tiskarna","Model","MAC", "IP_adresa", "ID_terminalu" | %{ $_.MAC = $_.MAC.TrimStart().Substring(0,17); $_ }
jak jsem psal driv
pokud ti to vypise tabulku s vynechanymi sekundarnimi mac adresami, tak jsem ti v tomto vlakne vyresil uz druhy dotaz plus vysvetlil nektere aspekty jazyka Powershell a tudiz bych prosil jedno akceptovane reseni, jinak prestavam s konverzaci, jelikoz netusim, kolik jeste otazek budu muset vyresit, aby toto vlakno bylo povazovano za vyresene
az budes potrebovat resit dalsi problemy v powershellu, tak prosim dalsi,
nove, vlakno a uz se tesim na dalsi spolupraci .... milovniku powershellu je tu
malo a kazdy novy milovnik a vlakno potesi
a na zaver tohoto prispevku jednu dobrou radu: kdyz ti nejaky dlouhy prikaz v powershellu nejede, tak si ho rozsekej podle rour a zleva zkousej, jestli kazda cast prikazu haze co ma
napr. mam prikaz, ktery vygeneruje cisla od 1 do 10 , ke kazdemu pricte jednicku a pak vynasobi vysledek dvema .... tedy na vystupu budou cisla mezi 4 a 22 vcetne
1..10 | %{$_+1} | %{$*2}
jenze prikaz nefacha a ja hned nevidim, kde je chyba
nejdriv zkusim 1..10 a je to ok - cisla od 1 do 10
pak zkusim 1..10|%{$_+1} a je to ok - cisla od 2 do 11
pak zkusim 1..10|%{$_+1}|%{$*2} a vidim ze problem je v polsedni casti a uz
vidim, ze tam misto $_ mam jen $
tenhle priklad je sice kokotina, ale kdyz tenhle postup aplikujes na nejaky ten delsi prikaz na zpracovani CSV, tak uvidis, jak ti to pomuze se vyznat v tom, kde je chyba .... aspon me to pomaha
Riešenie ide dik akurat som zle označil predpokladal som, že ich můžem označiř aj viac (chcel som 2).
%{ $_.MAC = $_.MAC.TrimStart().Substring(0,17);
Posledna otazka: $_.MAC = $_.MAC. je klasicky ekvivalent napr.
$a= "Hura"
$a=$a.Substring(x,x)
Spravne tomu rozumiem?
Jirka Jr:22.8.2019 9:02
kazde vlakno ma jen jedno akceptovane reseni, pokud vim, ale to uz neres
k te otazce. odpoved by mela byt ano, jestli jsem te spravne pochopil. ale pro jistotu vysvetlim
$_.MAC = $_.MAC.TrimStart().Substring(0,17)
= je prirazeni a to se vyhodnocuje zprava doleva jako ve vetsine jinych
jazyku
tj. nejdriv se otrimuje a substringuje $_.MAC a tim vznikne 17-timistny retezec
v mezipameti
jako druhy krok se vezme ten retezec z mezipameti a priradi zpet do $_.MAC
a na zaver maly bonus .... pekne video, ktere vysvetluje pouzivani $_
https://www.youtube.com/watch?…
Zobrazeno 11 zpráv z 11.