POWERSHELL - datoteke i mape

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:

 

Rekurzivno pretraživanje datoteka na disku

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:

  1. Filter je mnogo brži u radu od parametra Include na uređajima na kojima je podržan (npr. diskovi).
  2. 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 *

 

Prikaz detaljnih podataka o pojedinoj mapi ili datoteci na disku

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

 

Primjer izmjene podataka o datoteci

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.

 

Primjer korištenja naredbama za upravljanje aktivnom mapom

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.

Priprema sadržaja datoteka i otvaranje u podrazumijevanoj vrsti programa

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.

Kategorija