Як зробити командлетЯк зробити командлет

0 Comment

Як скасувати команду в powershell?

Ви можете завершити команду або скасувати поточну команду або введення, натиснувши Ctrl+c. 4. Створюйте змінні без сценарію. Можна подумати, що змінні створюються лише всередині сценарію, але це не так.

Навіщо потрібен PowerShell?

Як скриптова мова PowerShell зазвичай використовується для автоматизації процесів керування системами. Він також використовується для створення, тестування та розгортання рішень, часто в середовищах CI/CD. В основі PowerShell лежить середовище CLR. NET.

Що можна зробити за допомогою PowerShell?

PowerShell дозволяє виконувати звичайні команди, а також дає доступ до об'єктів COM, WMI та ADSI.. У ній використовуються різні сховища, на зразок файлової системи або реєстру Windows, для доступу до яких створені т.з. постачальники (providers).

Нотатки про Windows
Виведення даних у PowerShell

Створення командлету без параметрів

У цьому розділі описується створення командлета, який отримує відомості з локального комп'ютера без використання параметрів, а потім записує інформацію в конвеєр. Описуваний командлет є командлетом Get-Proc, який отримує відомості про процеси локального комп'ютера, а потім відображає ці відомості в командному рядку.

майте на увазі, що під час написання командлетів Windows PowerShell посилання збірки® завантажуються на диск (за замовчуванням – C: Program Files Reference Assemblies Microsoft Windows PowerShell v1.0). Вони не встановлюються у глобальний кеш збірок (GAC).

Присвоєння імені командлету

Ім'я командлета складається з дієслова, що вказує на дію, що виконує командлет, і іменник, який вказує елементи, з якими працює командлет. Оскільки цей приклад Get-Proc командлет отримує об'єкти обробки, він використовує команду Get, визначену перерахуванням System. Management. Automation. вербскоммон , і іменник "proc", щоб вказати, що командлет працює над елементами процесу.

При назві командлетів не використовуйте такі символи: #, () <> [] &-/\ $;: "" <> | ? @ `.

Вибір іменника

Слід вибрати конкретне іменник. Краще використовувати однойменну іменник зі скороченою версією назви продукту. Прикладом імені командлета цього є " Get-SQLServer " .

Вибір команди

Слід використовувати дієслово із набору затверджених імен дієслів командлетів. Додаткові відомості про затверджені команди командлетів див. у розділі імена дієслів командлетів.

Визначення класу командлету

Після вибору імені командлета визначте .NET клас для реалізації командлета. Нижче наведено визначення класу цього прикладу Get-Proc командлета:

[Cmdlet(VerbsCommon.Get, "Proc")] public class GetProcCommand : Cmdlet 
 _ Public Class GetProcCommand Inherits Cmdlet 

Зауважте, що попередній для визначення класу атрибут System. Management. Automation. CmdletAttribute з синтаксисом [Cmdlet(verb, noun, . )] використовується для визначення цього класу як командлет. це єдиний обов'язковий атрибут для всіх командлетів, що дозволяє середовищу виконання Windows PowerShell правильно викликати їх. За необхідності можна задати ключові слова атрибутів для подальшого оголошення класу. Зверніть увагу, що оголошення атрибута для нашого прикладу класу Жетпроккомманд оголошує лише іменники та дієслів для командлета Get-Proc.

для всіх класів атрибутів Windows PowerShell ключові слова, які можна встановити, відповідають властивостям класу attribute.

При назві класу командлета рекомендується відобразити ім'я командлета в імені класу. Для цього використовуйте форму "Вербнаункомманд" і замініть "verb" та "іменник" на дієслово та іменник, що використовуються в імені командлета. Як показано у попередньому визначенні класу, командлет Sample Get-Proc визначає клас з ім'ям Жетпроккомманд, який є похідним від базового класу System. Management. Automation. командлет.

Якщо ви хочете визначити командлет, який безпосередньо звертається до Windows PowerShell середовища виконання, клас .net має бути похідним від базового класу System. Management. Automation. PSCmdlet. Щоб отримати додаткові відомості про цей клас, див. Створення командлета, який визначає набори параметрів.

Клас для командлета має бути явно помічений як відкритий. класи, які не позначені як відкриті, за промовчанням будуть внутрішніми і не будуть знайдені середовищем виконання Windows PowerShell.

Windows PowerShell використовує простір імен Microsoft. PowerShell. Команда для своїх класів командлетів. Рекомендується розміщувати класи командлетів у просторі імен Commands простору імен API, наприклад XXX. PS. Команда.

Перевизначення методу обробки вхідних даних

Клас System. Management. Automation. командлет надає три основні методи обробки введення, принаймні один із яких повинен перевизначатися командлетом. Додаткові відомості про те, як Windows PowerShell обробляє записи, див. у розділі Windows PowerShell.

середовище виконання Windows PowerShell викликає для всіх типів вхідних даних System. Management. Automation. командлет. Під часперегляду для включення обробки. Якщо командлет повинен виконати деяку попередню обробку або установку, це можна зробити, визначивши цей метод.

Windows PowerShell використовує термін "запис" для опису набору значень параметрів, які надаються під час виклику командлета.

Якщо командлет приймає вхідні дані конвеєра, він має перевизначити метод System. Management. Automation. командлет. ProcessRecord і, за необхідності, метод System. Management. Automation. командлет. EndProcessing. Наприклад, командлет може перевизначити обидва методи, якщо він збирає всі вхідні дані за допомогою System. Management. Automation. командлет.ProcessRecord , а потім використовує вхідні дані як єдине ціле, а не як один елемент за раз, як Sort-Object робить командлет.

Якщо командлет не приймає вхідних даних конвеєра, він повинен перевизначити метод System. Management. Automation. командлет. EndProcessing. Майте на увазі, що цей метод часто використовується замість System. Management. Automation. командлет. BeginProcessing якщо командлет не може працювати з одним елементом за раз, як у випадку з командлетом Sort.

Оскільки цей приклад Get-Proc командлет повинен отримати вхідні дані конвеєра, він перевизначає метод System. Management. Automation. командлет. ProcessRecord і використовує стандартні реалізації для System. Management. Automation. командлету. Під часпроцесування і System. Management. Automation. командлет. EndProcessing. Перевизначення системи. Management. Automation. командлет. ProcessRecord витягує процеси та записує їх у командний рядок за допомогою методу System. Management. Automation. командлету. WriteObject.

protected override void ProcessRecord() < // Get the current processes Process[] processes = Process.GetProcesses(); // Отримайте процеси до pipeline making them available // to the next cmdlet. Second parameter of this call tells // PowerShell для назви array, і один процес на // time to the pipeline. WriteObject(processes, true); >
Protected Overrides Sub ProcessRecord() '/ Get the current processes. Dim processes A Process() processes = Process.GetProcesses() '/ Write processes в pipeline making them available '/ to the next cmdlet. Наступний параметр цих дзвінків '/ PowerShell для назви array, і один процес на '/ time to pipeline. WriteObject(process, True) End Sub 'ProcessRecord 

Питання, які слід враховувати під час обробки вхідних даних

  • За замовчуванням для вхідних даних є явний об'єкт (наприклад, рядок), наданий користувачем у командному рядку.Щоб отримати додаткові відомості, див. Створення командлета для обробки вхідних даних командного рядка.
  • Метод обробки вхідних даних може приймати вхідні дані з вихідного об'єкта вищого командлета в конвеєрі. Для отримання додаткових відомостей див. Створення командлета для обробки вхідних даних конвеєра. Майте на увазі, що командлет може отримувати вхідні дані із поєднання джерел командного рядка та конвеєра.
  • Східний командлет може повертатися протягом багато часу, а чи не взагалі. Тому метод обробки введення в командлеті не повинен утримувати блокування під час дзвінків System. Management. Automation. командлет. WriteObject, особливо блокування, для яких область виходить за межі екземпляра командлета.

Командлети ніколи не повинні викликати System. Console. WriteLine* або його еквівалент.

  • Командлет може мати змінні об'єкта для очищення після завершення обробки (наприклад, якщо він відкриває обробник файлу в методі System. Management. Automation. командлет. BeginProcessing і зберігає відкритий обробник для використання System. Management. Automation. командлет. ProcessRecord). важливо пам'ятати, що Windows PowerShell середовище виконання не завжди викликає метод System. Management. Automation. командлет. EndProcessing , який повинен виконувати очищення об'єктів.

Наприклад, System. Management. Automation. командлет. EndProcessing може не викликатися, якщо в командлеті скасовано значення Мідуей або якщо в будь-якій частині командлета виникла непереборна помилка. Таким чином, командлет, який вимагає очищення об'єктів, має реалізувати повний шаблон System. IDisposable , включаючи метод завершення, щоб середовище виконання могло викликати як System. Management. Automation. командлет. EndProcessing , і System. IDisposable. Dispose * наприкінці обробки.

Зразок коду

Повний приклад коду на C# див. у розділі GetProcessSample01 Sample.

Визначення типів об'єктів та форматування

Windows PowerShell передає інформацію між командлетами за допомогою об'єктів .net. Отже, командлету може знадобитися визначити власний тип, або командлету може знадобитися розширити існуючий тип, наданий іншим командлетом. Додаткові відомості про визначення нових типів або розширення існуючих типів див. у розділі розширення типів об'єктів та форматування.

Створення командлету

після реалізації командлета необхідно зареєструвати його за допомогою Windows PowerShell за допомогою оснастки Windows PowerShell. Додаткові відомості про реєстрацію командлетів див. у розділі Реєстрація командлетів, постачальників та провідних програм.

Тестування командлету

Якщо командлет зареєстрований у Windows PowerShell, його можна перевірити, запустивши його в командному рядку. код для нашого прикладу Get-Proc командлет невеликий, але він, як і раніше, використовує середовище виконання Windows PowerShell і існуючий об'єкт .net, що достатньо для того, щоб зробити його корисним. Давайте протестуємо її, щоб краще зрозуміти, що може зробити Get-Proc та як можна використовувати його вихідні дані. Щоб отримати додаткові відомості про використання командлетів з командного рядка, див. Початок роботи з Windows PowerShell.

    запустіть Windows PowerShell та отримайте поточні процеси, запущені на комп'ютері.

Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ---- - ------ -- ---------- 254 7 7664 12048 66 173.75 1200 QCTRAY 32 2 1372 2628 31 0.04 1860 DLG 271 6 1216 3688 32 06 2 0.01 1768 TpScrex. 
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ---- - ------ -- ----------- 1033 3 2400 3336 35 0.53 1588 rundll32 
Tuesday, July 26, 2005 9:34:15 AM 
$p | Where-Object | Sort-Object HandleCount 
Handles NPM(K) PM(K) WS(K) VS(M) CPU(s) Id ProcessName ------- ------ ----- ----- ---- - ------ -- ---------- 568 14 2164 4972 39 5.55 824 svchost 716 7 2080 5332 28 25.38 468 csrss 761 21 33060 56608 457 34 412 4540 59 3.31 492 winlogon. 
$p | Get-Member -MemberType property 
 TypeName: System.Diagnostics.Process 
Name MemberType Definition ---- ---------- ---------- BasePriority Property System.Int32 BasePriority Container Property System.ComponentModel.IContainer Conta. EnableRaisingEvents Property System.Boolean EnableRaisingEvents