Функции и филтри в PowerShell - PKI разширения
В общ смисъл функциите се изграждат съгласно следния принцип:
първо казваме, че ще бъде функция и й даваме име. В скоби посочваме списъка с приети аргументи, а след това във къдрави скоби посочваме блока от код, който ще бъде изпълнен при извикване на функциите. Но самата функция не представлява голям интерес. По правило някои данни се прехвърлят към него и ние трябва по някакъв начин да ги получим във функцията. Можем да предаваме данни на функции по два начина:
- използвайки списък с аргументи (както в дадения пример)
- на конвейера
това е много удобно, когато използвате един клавиш, по аналогия с cmdlet можете да изберете режима на работа на дадена функция. Просто проверете състоянието на ключаTrue илиFalse във функцията и изберете режима в зависимост от това.
Тръбопровод и функции
Но често за нас е по-удобно да предаваме данни на функция за обработка през тръбопровода. И със сигурност можем да направим това. Но тук има тънкости.
Искахме просто да умножим всяко число по 2. Но няма резултат. Това е втората най-честа грешка, която начинаещите потребители правят, когато бъркат функцията с цикълаForeach-Object :
и сега получихме очаквания резултат. Факт е, че данните не влизат във функцията, както се появяват на входа на конвейера, а само когато конвейерът е пълен. Тъй като тръбопроводът се запълва с данни, те се поставят в специалната променлива$input като масив. И едва след това започва да се изпълнява тялото на самата функция. Ние гледаме:
Този метод обаче е много непродуктивен, когато се изисква да се извърши някаква операция на всеки елемент от тръбопровода. Тъй като първо трябва да изчакаме, докато всички данни се съберат по тръбопровода в променливата$input и едва тогава ще започне самата обработка. защотоТъй като променливата$input е масив, не можем да използваме текущата елементна променлива$_ директно към нея. Като алтернатива можете да анализирате променливата$input в самата функция с цикъл и да получите желания резултат:
Въпреки че задачата е решена, в допълнение към загубата на производителност, количеството код също е нараснало. Което също не е добре. За да се отървете от променливата $input, можете да използвате етапа на функцията - Процес. Какво представлява и с какво се яде можете да намерите в чудесния пост на Дмитрий Сотников – $input Gotchas. Материалът на връзката е представен достатъчно подробно и ще бъде разбираем дори за тези, които имат поне основни познания по английски език. Така:
на етапа на процеса ние се отказваме от допълнително анализиране на променливата$input, тъй като етапът на процес вече започва да се изпълнява, когато първият елемент пристигне на входа на конвейера. Следователно получаваме печалба в скоростта. Но за неща като обработка на всеки елемент във функция, PowerShell има един вид функция, нареченаfilter ! По същество филтърът е същата функция, която е поставена в цикълаForeach-Object. Филтрите в PowerShell се използват по същия начин като функциите:
същото е като:
Както можете да видите, има много възможности за решаване на проблема във функциите и всеки може да използва този, който му харесва. Може ли да се каже, че това са малките неща? Да, можеш. Но именно тези малки неща ще повлияят на естетическата красота,производителността и потреблението на ресурсина вашите скриптове в действие. Освен това,разликата в производителността и потреблението на ресурси може да достигне до 100(!) пъти, в зависимост от избрания метод. Вече говорих за това в предишния си блог, като използвах цикли като пример: Foreach, Foreach-Object и оптимизация на цикъл в PowerShell.