12

Click here to load reader

Datum u CSV i prvi susret s petljom

Embed Size (px)

DESCRIPTION

Uvod u PowerShell.

Citation preview

Page 1: Datum u CSV i prvi susret s petljom

Evo, složio sam nekakvu diskusiju sa samim sobom i PowerShellom. Koja je poanta? Dijeljenje znanja, probijanje leda itd. Kako mi trenutno nisu dostupni svi silni sustavi, drilao sam po FS-u lokalnog stroja.

Tema ove diskusije je prikupljanje podataka o datumu prije pohranjivanja u CSV datoteku za daljnju manipulaciju. Nedavno sam naletio na koristan primjer, kakvih možda nema mnogo. Upotrebna vrijednost skripte je zanemariva, važnije je što se spomene veliki broj pojmova koji su zanimljivi. Ne tvrdim da je ovo nešto nepobitno univerzalno točno ili štogod slično, koristim svoje znanje do one mjere koje mi odgovara. Toliko o uvodu…

Ove dvije naredbe će prikazati informaciju o svim datotekama i direktorijima pod AppData\Roaming trenutno prijavljenog korisnika. Dalo bi se to svesti na jednu naredbu, naravno. Odabrana su samo ciljana svojstva i prikazana u obliku tablice.

Set-Location $env:APPDATAGet-ChildItem -Recurse | Select-Object -Property LastWriteTime, FullName | Format-Table -AutoSize

Ako te informacije želimo pohraniti u CSV datoteku, umjesto prikaza na ekranu, možemo koristiti sljedeće naredbe:

Set-Location $env:APPDATAGet-ChildItem -Recurse | ForEach-Object { "$($_.LastWriteTime);$($_.FullName)" >> $env:USERPROFILE\test.csv }

Nešto detaljniji opis dijelova naredbi će uslijediti kasnije. Ovo je trenutno primjer kako to ne treba raditi.

Page 2: Datum u CSV i prvi susret s petljom

Nakon što je to pohranjeno u CSV, otvorimo li to s Excelom, vidjet ćemo da je datum i vrijeme u obliku poput „03/18/2015 08:34:25“, što će naš Excel prevesti kao „treći dan osamnaestog mjeseca“ odnosno, neće.

Kako bi to izbjegli, možemo podatke pripremiti u drugom obliku. Sada slijedi primjer kako to treba raditi:

Set-Location $env:APPDATA"LastWriteTime;FullName" > $env:USERPROFILE\test.csv Get-ChildItem -Recurse | ForEach-Object {

$LastWriteTime = $_.LastWriteTime.ToShortDateString().TrimEnd(".") $LastWriteTime += " " + $_.LastWriteTime.ToShortTimeString() "$LastWriteTime;$($_.FullName)" >> $env:USERPROFILE\test.csv }

Tada je u CSV pohranjena informacija o datumu i vremenu koju Excel može prepoznati.

U nastavku je ponešto seciranja i sjeckanja ovih naredbi, prijedlog alternative i slično.

Page 3: Datum u CSV i prvi susret s petljom
Page 4: Datum u CSV i prvi susret s petljom

Seciranje i sjeckanje

Pa počnimo s pogledom na ono što radi:

Set-Location $env:APPDATA"LastWriteTime;FullName" > $env:USERPROFILE\test.csv Get-ChildItem -Recurse | ForEach-Object {

$LastWriteTime = $_.LastWriteTime.ToShortDateString().TrimEnd(".") $LastWriteTime += " " + $_.LastWriteTime.ToShortTimeString() "$LastWriteTime;$($_.FullName)" >> $env:USERPROFILE\test.csv }

Set-Location, Get-ChildItem, ForEach-Object imaju svoje aliase. Alias za Set-Location je cd ili sl. Alias za Get-ChildItem je dir ili gci, za ForEach-Object je foreach ili %. Ovdje su puni nazivi.

$env:APPDATA vraća vrijednost varijable okruženja (environment variable) APPDATA. Sve varijable okruženja je moguće pregledati u Command Prompt naredbenoj ljusci naredbom SET.

Image removed

Za uvid u vrijednost pojedine varijable okruženja, u Command Prompt naredbenoj ljusci se koristi npr. „echo %appdata%“.

Page 5: Datum u CSV i prvi susret s petljom

U PowerShellu, za uvid u sve varijable okruženja, može se koristiti naredba „Get-ChildItem Env:“.

Image removed

Naredbom „$env:Path“ će biti prikazana samo vrijednost varijable PATH.

Na Technetu je više informacija o izmjeni varijabli okruženja:https://technet.microsoft.com/en-us/library/ff730964.aspx#EHC

Pojednostavljeno, PowerShell radi s objektima, pri čemu svaki objekt ima svoja svojstva (npr. SamAccountName, PrimarySmtpAddress) i metode kojima su moguće manipulacije. Vrlo često, PowerShell vraća nizove objekata, te kako bi bilo moguće dohvatiti njihova svojstva, potrebno je koristiti petlje. Najčešće se koristi petlja ForEach-Object koja kao ulaz prima izlaz iz prethodne naredbe (niz objekata).

Pristup objektu u petlji (njegovim svojstvima itd.), tada je moguć njegovim pozivom. Objekt u petlji se poziva sa „$_“. Tako se za pristup svojstvu LastWriteTime koristi poziv $_.LastWriteTime (za pristup varijabli, između varijable i željenog svojstva upisujemo točku).

Recimo da želimo pogledati samo prvi objekt u nizu, možemo ga povezati s varijablom test ovim pozivom:„$test = Get-ChildItem -Recurse | Select-Object -First 1“.

Tada imamo pristup svim svojstvima objekta, tako i svojstvu LastWriteTime.

Page 6: Datum u CSV i prvi susret s petljom

LastWriteTime je objekt tipa System.DateTime koji pak ima svoja svojstva i metode. Jeste li još tu? Prikaz tih svojstva i atributa možemo dobiti ovim pozivom: „$test.LastWriteTime | Get-Member“. Na popisu su ove metode:

ToString() ToShortDateString ToShortTimeString ToLongTimeString()

U nastavku su pozivi kojima možemo vidjeti njihove vrijednosti…

Poziv Vrijednost$test.LastWriteTime.ToString() 18.3.2015. 8:34:25$test.LastWriteTime.ToShortDateString() 18.3.2015.$test.LastWriteTime.ToShortTimeString() 8:34$test.LastWriteTime.ToLongTimeString() 8:34:25

Excel ne podnosi točku na kraju godine i ne prepoznaje vrijednosti s točkom kao datum, već kao tekst. Ako želimo da Excel prepozna datum, moramo se riješiti točke. To je moguće na više različitih načina, ja sam ovdje odabrao manipulaciju podacima pomoću metoda, samo kako bi i to bilo spomenuto. Dakle, imamo metodu ToShortDateString() koja vraća objekt tipa System.String, a vrijednost tog objekta je datum s točkom na kraju. Želimo se riješiti te točke, tada možemo jednostavno iskoristiti metodu TrimEnd() koju ima svaki String objekt (znakovni niz). Za razliku o ostalih metoda koje su do sada spomenute, metoda TrimEnd() očekuje niz znakova koje želimo ukloniti s kraja znakovnog niza. U ovom slučaju, to je točka pa će poziv na kraju imati TrimEnd(„.“).

To bi s našom testnom varijablom izgledalo ovako: „$test.LastWriteTime.ToShortDateString().TrimEnd(".")“.

Tu vrijednost spremamo u varijablu LastWriteTime (koju sada možemo zvati datum). Zatim dodajemo ostatak, a to je vrijednost koju vraća metoda ToShortTimeString() iz gornje tablice ili metoda ToLongTimeString(), kako nam više odgovara. S obzirom da se radi o String objektu, dodavanje se odrađuje s operatorom „+=“. Dakle, $datum = $datum + „neka nakupina znakova“ je isto što i $datum += „neka nakupina znakova“.

Evo i naredbi za test:

$datum = $test.LastWriteTime.ToShortDateString().TrimEnd(".") $datum += " " + $test.LastWriteTime.ToShortTimeString() $datum

Posljednja naredba jednostavno prikazuje vrijednost varijable datum.

Jedna digresija prije nastavka, od PowerShell verzije 3.0, Select-Object je optimiziran tako da uz switch First ne moramo čekati da PowerShell dohvati sve rezultate, evo izvornog teksta:

„Beginning in Windows PowerShell 3.0, Select-Object includes an optimization feature that prevents commands from creating and processing objects that are not used. When you include a Select-Object command with the First or Index parameters in a command pipeline, Windows PowerShell stops the command that generates the objects as soon as the selected number of objects is generated, even when the command that generates the objects appears before the Select-Object command in the pipeline.“

Page 7: Datum u CSV i prvi susret s petljom

A evo i mjerenja:

Osim gore predloženog rješenja koje je orijentirano na upotrebu metoda objekata, postoji i rješenje s oblikovanjem datuma pomoću Get-Date i upotrebe oblikovanja uz switch Format, npr. u ovom obliku:

$datum = Get-Date -Date $test.LastWriteTime -Format 'dd.M.yyyy H:mm'

Ovdje je više informacija o oblikovanju uz switch Format:https://technet.microsoft.com/en-us/library/ee692801.aspx#EBAA

Page 8: Datum u CSV i prvi susret s petljom

Ono kad se ne možeš sjetiti što odradit u Excelu da prepozna CSV kao tablicu

Prije početka, odabereš cijeli prvi stupac. U izborniku odabereš DATA, pod Data Tools odabereš 'Text to Columns'. Pokaže se čarobnjak i odabereš Delimited:

Dodaš kvačicu na Semicolon i odabereš Finish.

Page 9: Datum u CSV i prvi susret s petljom

Onda možeš sortirati!

Eto, to je to za sad, hvala na pažnji.