PowerShell… cum ce-i aia? Un shell nou nout de la microsoft. Sau a fost nou nout in urma cu cativa ani, insa dat fiind ca nu multi il folosesc, sau eu, cel putin, nu cunosc pe nimeni care sa il foloseasca, il pot considera nou!
Ce-mi veni sa scriu despre asta? Zilele trecute mi-a trecut prin cap sa ma apuc sa imi adun cateva filme imprastiate prin diverse diskuri/partitii intr-un singur loc, intr-un disk nou mai maricel, astfel incat, cand o sa vreau sa revad unul dintre filmele care mi-a placut sa imi fie mai usor sa il gasesc. Si cum erau cateva foldere (fiecare film cu folderul lui, cu subtitrari, cu postere, cu ceva metadata) am decis ca trebuie sa le organizez cumva, in ideea ca in 2 Tb cati are diskul pe care o sa le pastrez, in timp se pot aduna multe si o sa fie greu sa caut ceva cand o fi vorba de mii de foldere – desi sper sa nu se ajunga la asa ceva, insa nu se stie. Pe scurt, am decis sa pun fiecare folm intr-un folder al carui nume sa fie prima litera din numele filmului. Nimic mai simplu, trebuia sa fac 27 foldere, A -> Z plus unul pentru numele care incep cu alt ceva in afara de litera (numar, underline etc).
Ca sa faci asta, presupunand ca iti folosesti doar mana stanga iti ia 2 minute. Insa eu am decis sa folosesc ambele maine si sa pierd cateva ore, folosind powerShell. De ce catea ore? Pentru ca incepand sa citesc despre cum se face un loop, am ajuns sa citesc si despre altele. Pe scurt am pierdut cateva ore, iar in final am reusit sa scriu un script care sa imi faca cele 27 de foldere pe care vroiam sa le am.
De ce am pierdut timpul cu asa ceva? Pentru ca mi s-a parut interesant sa invat un limbaj de scripting, construit pe .net care poate fi folositor in viitor. Imi propun sa revin pe acest subiect si sa scriu cateva articole (mult mai) complexe si complete. Acum tot ce vreau sa fac e sa scriu un script simplu, care sa indeplineasca un task simplu: 27 foldere.
Variabilel in PowerShell sunt la fel ca in php – incep cu simbolul $ si pot contine orice caracter care este valid in c# pentru numele unei variabile. Si, aveam sa aflu, nu exista simbolul < pentru comparatie, ci se foloseste, in loc, -le. Un ciclu for in PowerShell se scrie asa:
for($i=65; $i -le 90; $i++)
{
#cod
}
65 e codul ASCII pentru litera ‘A’ iar 90 e pentru litera ‘Z’. Comentariile sunt marcate cu simbolul #.
Un folder este creat cu ajutorul cmdLet-ului New-Item. Tot ce trebuie facut e sa introducem acest cmdlet in ciclu si am rezolvat problema:
for($i=65; $i -le 90; $i++)
{
$ltr = [char]$i
New-Item $ltr -type directory
}
New-Item "0_9" -type directory
Am folosit o variabila intermediara $ltr = [char]$i deoarece am incercat sa scriu New-Item [char]$i si nu am obtinut chiar ce vroiam, in sensul ca in loc sa imi converteasca codul ascii in caracterul corespunzator, am obtinut un carnat de foldere cu nume de tipul: [char]65, [char]66 etc. Nu am inteles de ce e asa, insa folosirea unei variabile intermediare rezolva problema.
Cateva ore de citit si am reusit sa scriu un script care sa imi creeze 27 de foldere in mai putin de o secunda. Urmarea etapa – cred – e sa scriu un script care sa imi mute filmele in folderul corespunzator (in functie din prima litera din numele filmului.