Креирајте hashtable во PowerShell, додавајте, бришете, сортирајте елементи WindowsPro

Покрај низите, PowerShell поддржува уште еден сложен тип на податоци со хаш-табели. Обезбедува методи за пребарување, додавање, промена или бришење парови на клучеви/вредности. Хаштабовите може да се користат на многу начини, на пример за пренесување вредности на параметрите cmdlet.

powershell

Главната разлика помеѓу нормалните низи и табелите за хаш, кои исто така се нарекуваат асоцијативни низи, е во тоа што можете да користите не само нумерички индекс, туку каков било .NET објект како клуч. Така, хаш-табелите се состојат од колекција на парови на клучеви/вредности.

Низи наспроти хаш-табели

Ако ја креирате оваа низа, на пример

тогаш го повикувате вториот елемент со вредност "бело" преку $ бои [1]. Соодветно на тоа, можете едноставно да повторувате низ целото поле со зголемување на индексот (видете низи во PowerShell: креирање, промена, читање, сортирање, бришење).

Хаштабовите, од друга страна, секогаш се состојат од парови во форма клуч = вредност. За да останете на темата со боите, хаш-табелата може да изгледа вака:

Со синтаксата за создавање асоцијативна низа, проверете дали паровите на клучевите/вредностите се во кадрави загради (со нормални низи се кружни) и се одделуваат со точка-запирка (со низи, дозволена е и запирка). Вредноста е доделена на клуч користејќи го знакот за еднаквост.

Пристапете до предметите

Ако сега сакате да пристапите до вториот елемент со вредност „Бело“, PowerShell нуди неколку опции за ова. Аналогно на низите со кои би можеле да го направите ова

да направиш. Како што можете да видите, клучот "wallид" се користи тука како индекс, а не како нумеричка вредност (дури и ако таквата вредност може лесно да се користи како клуч).

Како и со низите, PowerShell дозволува решавање на неколку елементи одеднаш:

Алтернативно, можете да ја користите нотацијата

користете, или ако сакате да биде покомплексно, користете ја функцијата Get_Item:

Ако не добиете резултат, тогаш или вредноста за овој клуч $ може да биде нула или клучот не постои. За да проверите дали е присутна, користете ја функцијата ContainsKey:

Противникот, функцијата ContainsValue (), од друга страна, ве известува дали одредена вредност е присутна во табелата:

И двете функции се враќаат True или False, во зависност од тоа дали ја наоѓаат саканата вредност.

Ако сакате да ја излезете целата содржина на табелата, тогаш, како и обично во PowerShell, треба само да го внесете името на променливата. Како командата

сепак, покажува дека ја добивате целата хаштабла како еден објект на овој начин.

Колку елементи што ги содржи може да се дознаат со користење на бројот на својства, исто како низа:

би отпечатил 4 во нашиот пример.

Повторувајте преку хаш-табелите

Во различни прилики, ќе сакате да ја разгледате целата колекција. Иако треба да го броите само индексот за низа, тука ви треба друг метод.

Од една страна, соодветна е јамка за проповед над сите клучеви, при што таа зафаќа втора променлива со тековниот клуч со секое поминување:

foreach ($ k во $ бои. Клучеви)

Од друга страна, функцијата GetEnumerator () е идеална за оваа задача, така што ќе можете да ја зачувате променливата run:

Ако сакате да ги пронајдете сите елементи што имаат одредена вредност, не мора да повторувате преку речникот, филтер со Каде-објект (алијас "?") Дали истото го прави тука:

Додај клуч

Како што е прикажано погоре, можете да ги вметнете паровите на клучевите/вредностите при изјаснување на табела за хаш. Ако имате празна маса за хаш

започнува или едноставно сака да додаде повеќе на постојните клучеви, постојат неколку опции за ова. Најочигледна ја следи истата синтакса како и декларацијата:

Покрај тоа, табелата со хаш го обезбедува методот add () за оваа намена:

Конечно, може да се користи оператор за додавање за оваа задача:

Како што лесно можете да видите, креирате своја сопствена табела за хаш за новиот клуч. Затоа, тоа е процес што генерално може да се искористи за комбинирање на две асоцијативни низи.

Избриши клуч

За да отстраните клуч од речникот, PowerShell го обезбедува методот remove (). Ова значи дека само еден пар може да се избрише со секој повик:

Работите стануваат покомплицирани кога сакате да повторувате преку табелата за да ги избришете копчињата што имаат одредена вредност, во следниот пример ова ќе биде „зелено“:

Сепак, PowerShell ја потврдува оваа постапка со порака "Грешка при проверка на список: Списокот е променет. Процесот на попишување можеби не може да се изврши".

Ако сакате да ја избегнете оваа реакција и да постигнете сигурен резултат, функцијата клон () помага да се добие посебна референца на табелата:

Ако сакате да ги отстраните сите копчиња, функцијата јасно () служи за оваа цел:

Сортирај табела за хаш

Очигледен пристап може да биде цевката на излезот на променливата до Подредување на објект:

$ бои | сортирање # не работи

Сепак, како што веќе видовме погоре, внесувањето на името на променливата ја враќа целата хаш-табела како еден објект, па затоа сортирањето на елементите не е очекувано.

За сортирање, мора да повторувате преку речникот, при што методот GetEnumerator () е повторно корисен:

$ бои. Добијте енумератор () | сортирање -Име на имотот

Овој пример ги подредува елементите по клуч. Ако наместо тоа сакате да ги сортирате според вредностите, во горниот повик го заменувате името со вредност.

Секако дека би можеле да дојдете до идеја да ги внесете клучевите по сортиран редослед при креирање на табелата за хаш. Сепак, брзо станува очигледно дека PowerShell не го задржува ова подредување и ги издава паровите на клучеви/вредности по кој било редослед.

Сепак, ова однесување може да се исклучи со користење на клучен збор [нарачан] од PowerShell 3.0:

Сепак, не е можно да се користи за претворање на постоечка хаш-табела во нарачана колекција со употреба на гипс.

Splatting: Повикување cmdlets со Hashtable

Честа употреба на хаш-табели е складирање на параметрите и нивните вредности во нив пред да се пренесат на cmdlet. Особено со cmdlets со голем број параметри, на пример New-ADUser, кодот е јасно појасен.

Наместо да го повикувате cmdlet како и обично:

New-ADUser -Name Max.Meier -GivenName Max -Презиме Meier -Path "OU = корисник, DC = контосо, DC = Com"

може да се постапи на следниов начин:

Забележете дека на табелата со хаш му претходи „@“, а не „$“.