Situatie
Un hashtable este o structură de date care stochează perechi cheie-valoare și permite accesul foarte rapid la date prin utilizarea unei funcții hash pentru a calcula un index în un array în care este stocată valoarea. Acest indice acționează ca o cheie pentru a localiza rapid valoarea corespunzătoare.
Hashtables în PowerShell sunt un tip special de date care stochează colecții de perechi cheie-valoare, unde fiecare cheie este asociată cu o anumită valoare. Acest tip de date mai este denumit și dicționar sau array asociativ. La baza lor, tabelele hash sunt structuri de date compacte pentru stocarea perechilor de chei și a valorilor acestora. HashTables sunt similare cu dicționarele în format Python sau JSON.
Hashtables sunt mai flexibile și diferă semnificativ de array-urile PowerShell clasice. Pe măsură ce elementele sunt adăugate în array, fiecare element este indexat automat cu o valoare numerică. În schimb, atunci când utilizați un hashtable PowerShell, trebuie să specificați o cheie pentru fiecare valoare pe care doriți să o adăugați.
Cum functionează?
- O funcție hash ia o cheie și o convertește într-un cod hash numeric.
- Acest cod hash este apoi mapat la un index într-un array(adesea prin luarea modulului cu dimensiunea array-ului).
- Valoarea asociată cu cheia este stocată în matrice la acest index.
- Atunci când se caută o valoare, cheia este hașurată din nou pentru a găsi indexul, permițând recuperarea rapidă, de obicei în timp constant O(1).
Solutie
1. În PowerShell Admin, creați un obiect HashTable gol:
$hashtable = @{}
2. În acest obiect putem adăuga de exemplu 2 chei în HashTable:
$key1 = ‘username’
$value1=’c.adrian’
$hashtable.add($key1,$value1)
$key2 = ‘computer’
$value2=’wks123321′
$hashtable.add($key2,$value2)
3. Enumerați hashtable-ul:
$hashtable
$hashtable.GetType()
Aceasta creează un obiect de tip [System.Collections.Hashtable] care conține două perechi cheie/valoare.
Proprietățile încorporate ale unui obiect hashtable includ .Keys, .Values și .Count. Spre deosebire de array-urile obișnuite, unde elementele sunt accesate prin indici numerici, valorile hashtable sunt accesate prin chei, care pot fi șiruri de caractere.
Nota Bene: În mod implicit, atunci când creați un obiect hashtable utilizând sintaxa @{}, cheile sale nu sunt sensibile la majuscule(prin urmare username și UserName sunt identice).
4. Pentru a schimba valoarea unei chei dintr-un hashtable, utilizați operatorul de atribuire (=) sau metoda Set_Item():
$hashtable.username =’c.adrian’
$hashtable.Set_Item(“Computer”, “wks.class1”)Totodată un hashtable cu valori poate fi creat și astfel:
$user = @{
‘User’ = ‘Adrian’;
‘Computer’ = ‘wks123’;
‘Enabled’ = $True;
‘Job’ = ‘SOC-Monitoring’;
}
În mod implicit, capacitatea unui obiect hashtable este 8, ceea ce permite stocarea a până la 8 perechi cheie-valoare. Dacă trebuie să creați un obiect hashtable cu un număr mare de elemente, trebuie să specificați capacitatea inițială la crearea obiectului(unde în exemplul de mai jos este setat pentru 20 elemente):
$bigHashtable = New-Object ‘System.Collections.Hashtable’ 20
5. Pentru a elimina cheile dintr-un hashtable, utilizați metoda .Remove():
$user.remove(‘Job’)
6. O valoare dintr-un hashtable nu poate fi ștearsă, dar poate fi neutralizată prin înlocuirea sa cu $null:
$user.Computer = $null
Pentru a parcurge valorile obiectului HashTable în PowerShell, utilizați următoarea sintaxă:
foreach($key in $user.Keys){
Write-Host “$key : $($user[$key])”
}
Se pot utiliza tabelele hash atunci când trebuie să se transmită un număr mare de parametri unui anumit cmdlet. De exemplu, în loc să se specifice fiecare atribut al cmdletului New-ADUser în mod individual(ceea ce poate face comanda lungă și greu de citit), este mai ușor să se transmită valorile utilizând un hashtable:
$UserParams = @{
Name = “Adrian”
SamAccountName = “Adrian”
UserPrincipalName = “adrian.ciocan”
GivenName = “Adrian”
Surname = “Ciocan”
DisplayName = “Adrian Ciocan”
Enabled = $true
AccountPassword = (ConvertTo-SecureString “P@rOL@!” -AsPlainText -Force)
ChangePasswordAtLogon = $false
Department = “SOC”
EmailAddress = “adrian.ciocan@startechteam.ro”
Title = “Analyst”
Path = “OU=Users,DC=class.local”
}
New-ADUser @UserParams
Un alt exemplu ar fi legat de căutarea evenimentelor privind Restart sau Shutdown în jurnalele Event Viewer, unde puteți trece mai mulți parametri către cmdlet-ul Get-WinEvent utilizând o structură hashtable:
Get-WinEvent -FilterHashtable @{
Logname = ‘System’
StartTime = ’05/05/2025′
EndTime = ’05/10/2025′
Data = ‘1075’
}
Dacă aveți nevoie să salvați valoarea tabelului hash într-un fișier, îl puteți converti în format XML:
Export-Clixml -Path “C:\HashTable.xml” -InputObject $user
Încărcați(importați) date dintr-un fișier XML într-un hashtable:
$usernew=Import-Clixml -Path “C:\HashTable.xml”
Leave A Comment?