Jedna od najčešćih vrsta operacija za koju se pripremaju PowerShell skripte je rukovanje datotekama i mapama na disku i drugim uređajima za pohranu datoteka. Zato ćemo se u sedmom nastavku serijala detaljnije pozabaviti primjenom mogućnosti PowerShella na ovom području.
Krenimo prvo od vrlo česte operacije pretraživanja mape i njezinih podmapa u potrazi za određenom vrstom datoteka. Sljedeći primjer pronalazi i prikazuje sve datoteke u zadanoj mapi ($home – označava početnu mapu trenutačno aktivnog korisnika) i njezinim podmapama, ako u sebi sadrže odgovarajući uzorak u nazivu (.doc). Traženi uzorak naveden je na dobro poznat način, dodavanjem zvjezdica na obje strane uzorka.
Get-ChildItem -Path $home -Filter *.doc* -Recurse
Rezultati izvođenja prethodne naredbe prikazani su na sljedećoj slici:
Slika 1. Rekurzivno pretraživanje datoteka na disku
Ako je to potrebno, u jednoj naredbi može se zadati veći broj mapa (međusobno odvojenih zarezom) od kojih kreće pretraživanje. Pri zadavanju početnih mapa može se koristiti posebnim sistemskim mapama kao što to pokazuje sljedeći primjer.
Get-ChildItem c:\Tmp, $env:windir -Filter *.log -Recurse
Sistemska mapa zadana u prošlom primjeru je $env:windir – početno mjesto instalacije operativnog sustava Windows na konkretnom računalu. Osim ove mape, na raspolaganju su i druge sistemske mape kao što su:
$env:appdata
$env:commonprogramfiles
$env:localappdata
$env:public
$env:programfiles
$env:userprofile
$env:temp, $env:tmp
Prilikom pretraživanja određenih mapa može se dogoditi pogreška zbog nedovoljnih prava korisnika za pristup sadržaju neke mape. Na primjer, rekurzivno pretraživanje mape $env:windir na računalu na kojem je pripreman tekst izazvalo je pogreške kao što su:
Get-ChildItem : Access to the path 'C:\WINDOWS\SysWOW64\sru' is denied.
At line:1 char:1
+ Get-ChildItem c:\Tmp, $env:windir -Filter *.log -Recurse
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\WINDOWS\SysWOW64\sru:String) [Get-ChildItem], UnauthorizedAccessEx
ception
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
Get-ChildItem : Access to the path 'C:\WINDOWS\SysWOW64\Tasks' is denied.
At line:1 char:1
+ Get-ChildItem c:\Tmp, $env:windir -Filter *.log -Recurse
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : PermissionDenied: (C:\WINDOWS\SysWOW64\Tasks:String) [Get-ChildItem], UnauthorizedAccess
Exception
+ FullyQualifiedErrorId : DirUnauthorizedAccessError,Microsoft.PowerShell.Commands.GetChildItemCommand
Za izbjegavanje takve vrste problema (budući da ne postoje odgovarajuća prava za pristup mapi) može se u naredbu dodati poseban parametar, kao što to pokazuje sljedeća naredba:
Get-ChildItem c:\Tmp, $env:windir -Filter *.log -Recurse -Erroraction SilentlyContinue
ili u skraćenom obliku pisanja:
Get-ChildItem c:\Tmp, $env:windir -Filter *.log -Recurse -ea 0
Za filtiranje datoteka prema dijelu naziva, osim parametra Filter, može se koristiti i sličnim parametrom Include:
Get-ChildItem c:\Tmp, $env:windir -Include *.log -Recurse -Erroraction SilentlyContinue
Iako djeluju na sličan način, između parametara Filter i Include postoji nekoliko bitnih razlika koje treba uzeti u obzir prilikom korištenja:
- Filter je mnogo brži u radu od parametra Include na uređajima na kojima je podržan (npr. diskovi).
- Filterom se ne može koristiti na svim mjestima za pretraživanje gdje se može koristiti parametrom Include (npr. kod pretraživanja sadržaja baze Registry).
U slučaju da je nakon završetka pretraživanja potrebno dobiti detaljne podatke o pojedinom elementu (mapi’/datoteci) iz rezultata pretraživanja, za to se može koristiti naredbom Get‑Item. Sljedeći primjer prikazuje brojne dodatne podatke o izvršnoj datoteci explorer.exe koja se nalazi u sistemskoj mapi Windowsa.
Get-Item $env:windir\explorer.exe | Select-Object *
Slika 2. Prikaz detaljnih podataka o pojedinoj mapi ili datoteci na disku
Uz odgovarajuća prava na datoteku ili mapu, PowerShell nudi i mogućnost izmjene podataka o elementu.
Kao primjer promjene podataka o elementu, pomoću sljedećih nekoliko naredbi izmijenit ćemo datum i vrijeme zadnjeg pristupa datoteci explorer.exe. Za provjeru uspješnosti izvođenja operacije prikazat ćemo datum i vrijeme prije te nakon promjene.
PS C:\windows> $file = Get-Item $env:windir\explorer.exe | Select-Object *
PS C:\windows> $file.LastAccessTime
13. ožujka 2020. 19:17:28
PS C:\windows> $file.LastAccessTime = '2019/4/07 11:11:11'
PS C:\windows> $file.LastAccessTime
2019/4/07 11:11:11
Slika 3. Primjer izmjene podataka o datoteci
U svim prethodnim primjerima mape i datoteke su se ponašale na jednak način. Često je potrebno njihovo međusobno razlikovanje, jer se neke operacije mogu napraviti i imaju smisla samo na datotekama, a druge se mogu napraviti samo na mapama.
Sljedeći primjeri pokazuju kako se u popisu elemenata mogu dobiti samo mape:
Get-ChildItem | Where-Object { $_ -is [System.IO.DirectoryInfo] }
Get-ChildItem | Where-Object { $_.Mode -like 'd*' }
ili samo datoteke:
Get-ChildItem | Where-Object { $_ -is [System.IO.FileInfo] }
Get-ChildItem | Where-Object { $_.Mode -notlike 'd*' }
Za promjenu trenutačno aktivne mape služi dobro poznata naredba Cd, ali su za njezino optimalno korištenje često potrebne dodatne naredbe kako bi se saznala trenutačno aktivna mapa i slično. Na primjer:
Get-Location prikazuje trenutačno aktivnu mapu
Resolve-Path pretvara relativnu putanju do datoteke u apsolutnu putanju
Push-Location sprema trenutačno aktivnu mapu na stog za kasnije korištenje
Pop-Location vraća ranije spremljenu aktivnu mapu sa stoga.
Kako se prije spomenutim naredbama u kombinaciji s naredbom Cd koristi za promjenu aktivne mape pokazano je na sljedećem primjeru.
Slika 4. Primjer korištenja naredbama za upravljanje aktivnom mapom
Pomoću naredbe Set-Content može se pripremiti nova datoteka (na primjer, ako nam je to potrebno tijekom izvođenja skripte), dok se pomoću naredbe Invoke-Item postojeća datoteka može otvoriti u podrazumijevanom programu za tu vrstu datoteke.
Sljedeći primjer pokazuje pripremu nove tekstualne datoteke i njezino otvaranje u podrazumijevanom programu prije i nakon preimenovanja u drugu vrstu datoteke. U prvom slučaju (kad datoteka ima nastavak .txt) otvara se pomoću programa Notepad (osim ako toj vrsti datoteke nije pridružena druga vrsta podrazumijevanog programa). Nakon preimenovanja u .csv oblik, ista datoteka će najvjerojatnije biti otvorena u programu
Microsoft Excel.
Slika 5. Priprema sadržaja datoteka i otvaranje u podrazumijevanoj vrsti programa
Svim ranije spomenutim naredbama, uz dodatak ostalih (poput Del ili Remove-Item), može se koristiti kod pripreme različitih vrsti PowerShell skripti.