Аннотация: Описываются возможности оболочки Windows PowerShell и отличие ее от традиционных оболочек и языков сценариев. Обсуждаются основные концепции PowerShell (типы команд, структура командлетов, псевдонимы команд). Рассматриваются особенности справочной системы PowerShell
Введение в оболочку командной строки Windows PowerShell
На настоящий момент мы рассмотрели уже три разных инструмента, предназначенных для автоматизации работы в операционной системе Windows: оболочки командной строки Cmd.exe и WMIC, а также сервер сценариев WSH. Зачем же компании Microsoft понадобилась разработка еще одной полностью новой оболочки командной строки со своим языком сценариев?
Причины и цели создания новой оболочки
Чтобы ответить на этот вопрос, вспомним основные требования к «идеальному» средству автоматизации, которые мы обсуждали в первой лекции, и посмотрим, в какой степени удовлетворяют этим требованиям перечисленные выше инструменты (табл.16.1).
Таблица
16.1.
Требования к инструменту автоматизации
Требование | Cmd.exe | WSH | WMIC |
---|---|---|---|
Работа во всех версиях операционной системы без установки дополнительного программного обеспечения | Да | Да | Нет (только Windows XP и выше) |
Интеграция с командной строкой | Да | Нет | Да |
Согласованный и непротиворечивый синтаксис команд и утилит | Нет | Нет | Да |
Поддержка псевдонимов (кратких синонимов) для длинных названий команд | Нет | Нет | Да |
Автоматическое завершения команд и имен файлов при вводе их с клавиатуры | Частично (автоматическое завершение имен файлов и папок) | Нет | Нет |
Поддержка истории введенных команд с возможностью их повторного вызова, просмотра и редактирования | Да | Нет | Да |
Наличие подробной встроенной справки по командам с примерами использования | Частично | Нет | Да |
Возможность автоматического выполнения сценариев | Да (язык командных файлов) | Да (языки сценариев VBScript, JScript и т.д.) | Частично (команды WMIC можно встраивать в командные файлы) |
Доступ и использование всех технологий и возможностей, поддерживаемых операционной системой | Нет (нет прямого доступа к объектам COM, WMI, ADSI, .NET) | Да | Нет (доступ только к объектам WMI) |
Как мы видим, у каждого из рассмотренных нами ранее инструментов автоматизации присутствовали довольно серьезные недостатки, не позволявшие сказать, что Windows обладает по-настоящему мощным и эффективным средством для работы с командной строкой и написания сценариев.
Новая оболочка Windows PowerShell (предварительно она была названа Monad) была задумана разработчиками Microsoft как более мощная среда для написания сценариев и работы из командной строки. Разработчики PowerShell преследовали несколько целей. Главная и самая амбициозная из них – создать среду составления сценариев, которая наилучшим образом подходила бы для современных версий операционной системы Windows и была бы более функциональной, расширяемой и простой в использовании, чем какой-либо аналогичный продукт для любой другой операционной системы. В первую очередь эта среда должна была подходить для решения задач, стоящих перед системными администраторами (тем самым Windows получила бы дополнительное преимущество в борьбе за сектор корпоративных платформ), а также удовлетворять требованиям разработчиков программного обеспечения, предоставляя им средства для быстрой реализации интерфейсов управления к создаваемым приложениям.
Для достижения этих целей были решены следующие задачи:
- Обеспечение прямого доступа из командной строки к объектам COM, WMI и .NET. В новой оболочке присутствуют команды, позволяющие в интерактивном режиме работать с COM-объектами, а также с экземплярами классов, определенных в информационных схемах WMI и .NET.
- Организация работы с произвольными источниками данных в командной строке по принципу файловой системы. Например, навигация по системному реестру или хранилищу цифровых сертификатов выполняется из командной строки с помощью аналога команды CD интерпретатора Cmd.exe.
- Разработка интуитивно понятной унифицированной структуры встроенных команд, основанной на их функциональном назначении. В новой оболочке имена всех внутренних команд (в PowerShell они называются командлетами) соответствуют шаблону «глагол-существительное», например, Get-Process (получить информацию о процессе), Stop-Service (остановить службу), Clear-Host (очистить экран консоли) и т.д. Для одинаковых параметров внутренних команд используются стандартные имена, структура параметров во всех командах идентична, все команды обрабатываются одним синтаксическим анализатором. В результате облегчается запоминание и изучение команд.
- Обеспечение возможности расширения встроенного набора команд. Внутренние команды PowerShell могут дополняться командами, создаваемыми пользователем. При этом они полностью интегрируются в оболочку, информация о них может быть получена из стандартной справочной системы PowerShell.
- Организация поддержки знакомых команд из других оболочек. В PowerShell на уровне псевдонимов собственных внутренних команд поддерживаются наиболее часто используемые стандартные команды из оболочки Cmd.exe и Unix-оболочек. Например, если пользователь, привыкший работать с Unix-оболочкой, выполнит ls, то он получит ожидаемый результат: список файлов в текущем каталоге (то же самое относится к команде dir).
- Разработка полноценной встроенной справочной системы для внутренних команд. Для большинства внутренних команд в справочной системе дано подробное описание и примеры использования. В любом случае встроенная справка по любой внутренней команде будет содержать краткое описание всех ее параметров.
- Реализация автоматического завершения при вводе с клавиатуры имен команд, их параметров, а также имен файлов и папок. Данная возможность значительно упрощает и ускоряет ввод команд с клавиатуры.
Главной особенностью среды PowerShell, отличающей ее от всех других оболочек командной строки, является то, что единицей обработки и передачи информации здесь является объект, а не строка текста.
Отличие PowerShell от других оболочек – ориентация на объекты
При разработке любого языка программирования одним из основных является вопрос о том, какие типы данных и каким образом будут в нем представлены. При создании PowerShell разработчики решили не изобретать ничего нового и воспользоваться унифицированной объектной моделью .NET. Данный выбор был сделан по нескольким причинам.
Во-первых, платформа .NET повсеместно используется при разработке программного обеспечения для Windows и представляет, в частности, общую информационную схему, с помощью которой разные компоненты операционной системы могут обмениваться данными друг с другом.
Во-вторых, объектная модель .NET является самодокументируемой: каждый объект .NET содержит информацию о своей структуре. При интерактивной работе это очень полезно, так как появляется возможность непосредственно из командной строки выполнить запрос к определенному объекту и увидеть описание его свойств и методов, то есть понять, какие именно манипуляции можно проделать с данным объектом, не изучая дополнительной документации с его описанием.
В-третьих, работая в оболочке с объектами, можно с помощью их свойств и методов легко получать нужные данные, не занимаясь разбором и анализом символьной информации, как это происходит во всех традиционных тексто-ориентированных оболочках командной строки. Рассмотрим пример. В Windows XP есть консольная утилита tasklist.exe, которая выдает информацию о процессах запущенных в системе:
C:\>tasklist Имя образа PID Имя сессии № сеанса Память ========================= ====== ================ ======== ============ System Idle Process 0 0 16 КБ System 4 0 32 КБ smss.exe 560 0 68 КБ csrss.exe 628 0 4 336 КБ winlogon.exe 652 0 3 780 КБ services.exe 696 0 1 380 КБ lsass.exe 708 0 1 696 КБ svchost.exe 876 0 1 164 КБ svchost.exe 944 0 1 260 КБ svchost.exe 1040 0 10 144 КБ svchost.exe 1076 0 744 КБ svchost.exe 1204 0 800 КБ spoolsv.exe 1296 0 1 996 КБ kavsvc.exe 1516 0 9 952 КБ klnagent.exe 1660 0 5 304 КБ klswd.exe 1684 0 64 КБ
Предположим, что мы в командном файле интерпретатора Cmd.exe с помощью этой утилиты хотим определить, сколько оперативной памяти тратит процесс kavsvc.exe. Для этого нужно выделить из выходного потока команды tasklist соответствующую строку, извлечь из нее подстроку, содержащую нужное число и убрать пробелы между разрядами (при этом следует учесть, что в зависимости от настроек операционной системы разделителем разрядов может быть не пробел, а другой символ). В PowerShell аналогичная задача решается с помощью команды get-process, которая возвращает коллекцию объектов, каждый из которых соответствует одному запущенному процессу. Для определения памяти, затрачиваемой процессом kavsvc.exe, нет необходимости в дополнительных манипуляциях с текстом, достаточно просто взять значение свойства WS объекта, соответствующего данному процессу.
Наконец, объектная модель .NET позволяет PowerShell напрямую использовать функциональность различных библиотек, являющихся частью платформы .NET. Например, чтобы узнать, каким днем недели было 9 ноября 1974 года, в PowerShell можно выполнить следующую команду:
(get-date "09.11.1974").DayOfWeek
В этом случае команда get-date возвращает .NET-объект DateTime, имеющий свойство, при обращении к которому вычисляется день недели для соответствующей даты. Таким образом, разработчикам PowerShell не нужно создавать специальную библиотеку для работы с датами и временем – они просто берут готовое решение в .NET.
Загрузка и установка PowerShell
Оболочка PowerShell может работать не во всех версиях операционной системы, ее можно использовать в Windows XP SP 2, Windows Server 2003 SP 1 и более поздних версиях. Кроме этого, в системе должна быть установлена платформа .NET Framework 2.0 (в Windows XP данную среду придется устанавливать дополнительно, дистрибутив можно загрузить с сайта Microsoft по адресу http://msdn.microsoft.com/netframework/downloads/updates/default.aspx).
Загрузить PowerShell можно с сайта Microsoft, открыв страницу http://microsoft.com/powershell, где имеются ссылки на файл установки последней версии и пакеты документации на разных языках. Запустив загруженный файл, следуйте указаниям мастера установки. В 32-разрядных версиях Windows оболочка PowerShell устанавливается по умолчанию в каталог %SystemRoot%\System32\WindowsPowerShell\v1.0. В 64-разрядных версиях Windows 32-разрядная версия PowerShell устанавливается в каталог %SystemRoot%\SystemWow64\WindowsPowerShell\v1.0, а 64-разрядная версия Windows PowerShell устанавливается в каталог %SystemRoot%\System32\WindowsPowerShell\v1.0.
Запуск оболочки. Выполнение команд
Установив оболочку в системе, можно начать новый интерактивный сеанс. Для этого следует нажать на кнопку Пуск (Start), открыть меню Все программы (All Programs) и выбрать элемент Windows PowerShell. Другой вариант запуска оболочки – пункт Выполнить… (Run) в меню Пуск (Start), ввести имя файла powershell и нажать кнопку OK.
В результате откроется новое командное окно с приглашением вводить команды (рис. 16.1).
Выполним первую команду в PowerShell. Пусть это будет что-то знакомое, например dir (команды в PowerShell обрабатываются без учета регистра). На экран будет выведен список файлов в текущем каталоге:
PS C:\Documents and Settings\User> dir Каталог: Microsoft.PowerShell.Core\FileSystem::C:\Documents and Settings\User Mode LastWriteTime Length Name ---- ------------- ------ ---- d---s 14.12.2007 10:10 Cookies d---- 12.05.2005 17:16 DoctorWeb d---- 06.11.2004 13:03 Phone Browser d---s 22.09.2004 23:49 UserData d-r-- 04.10.2004 15:33 Главное меню d-r-- 05.12.2007 0:49 Избранное d-r-- 31.10.2007 21:03 Мои документы d---- 05.12.2007 10:54 Рабочий стол -a--- 24.05.2006 21:22 8304 gsview32.ini
Типы команд PowerShell
В оболочке PowerShell поддерживаются команды четырех типов: командлеты, функции, сценарии и внешние исполняемые файлы.
Первый тип – так называемые командлеты (cmdlet). Этот термин используется пока только внутри PowerShell. Командлет представляет собой класс .NET, порожденный от базового класса Cmdlet ; разрабатываются командлеты с помощью пакета PowerShell Software Developers Kit (SDK). Единый базовый класс Cmdlet гарантирует совместимый синтаксис всех командлетов, а также автоматизирует анализ параметров командной строки и описание синтаксиса командлетов для встроенной справки.
Данный тип команд компилируется в динамическую библиотеку (DLL) и подгружается к процессу PowerShell во время запуска оболочки (то есть сами по себе командлеты не могут быть запущены как приложения, но в них содержатся исполняемые объекты). Так как компилированный код подгружается к процессу оболочки, данный тип команд выполняется наиболее эффективно. Командлеты – это аналог внутренних команд традиционных оболочек.
Следующий тип команд – функции. Функция – это блок кода на языке PowerShell, имеющий название и находящийся в памяти до завершения текущего сеанса командной оболочки. Функции, как и командлеты, поддерживают именованные параметры. Анализ синтаксиса функции производится один раз при ее объявлении.
Сценарий – это блок кода на языке PowerShell, хранящийся во внешнем файле с расширением ps1. Анализ синтаксиса сценария производится при каждом его запуске.
Последний тип команд – внешние исполняемые файлы, которые выполняются обычным образом операционной системой.
Best way to learn PowerShell for Beginner
Windows PowerShell is a powerful command-line shell and scripting language designed for system administrators, IT professionals, and power users to automate tasks, manage system configurations, and enhance productivity. Unlike the traditional Command Prompt (CMD), PowerShell supports object-oriented scripting, making it a more advanced and flexible tool for Windows administration.
In this Windows PowerShell tutorial, you’ll learn everything from basic PowerShell commands to advanced scripting techniques. We’ll cover essential topics like how to run scripts, automate tasks, manage files and directories, configure system settings, and even work with PowerShell modules and cmdlets. Whether you’re a beginner or an experienced user, mastering PowerShell can significantly boost your efficiency in managing Windows environments.
Follow this step-by-step guide to unlock the full potential of Windows PowerShell.
PowerShell: Overview
PowerShell is a task automation and configures management framework built on the .NET framework. It was created for system administrators to automate tasks, manage configuration, and perform administrative tasks.
- What is PowerShell?
- A task automation and configuration management framework.
- Built on the .NET framework, designed for system administrators.
Why Learn PowerShell?
There can be multiple reasons to learn the PowerShell, some of them are:
- Automate repetitive tasks.
- Manage Windows, Linux, and macOS systems.
- Integrate with cloud platforms like Azure and AWS.
PowerShell vs. Command Prompt: What’s the Difference?
Unlike Command Prompt, which uses text-based commands, PowerShell current version works with objects and cmdlets for more powerful system automation. PowerShell’s versatility makes it superior for IT administration, remote management, and cloud integrations compared to traditional command-line interfaces.
- PowerShell vs. Command Prompt
Getting Started: How to Use PowerShell
PowerShell packs with pre-installed on Windows OS, and installation guides are available for macOS and Linux users. Stay updated with the latest PowerShell Core to ensure compatibility with modern IT management needs and cloud environments.
- Installing PowerShell
- Windows: Pre-installed; update via [Microsoft Docs]
- macOS/Linux: Install PowerShell Core
- Upgrade Windows PowerShell
Launching PowerShell
PowerShell can be launched using multiple methods, including the Start menu or the Run Dialogue Box. Whether you’re working locally or remotely, accessing PowerShell quickly helps manage system tasks and exchange online PowerShell configurations effectively.
- Launching PowerShell
- Open via Start Menu, Run Dialog (`Win + R`), or Command Prompt (`powershell`).
Understanding the Interface
PowerShell’s user interface consists of a command-line console, an (ISE) integrated scripting environment and (VS code) visual studio code, that offers flexibility for all level of users. Using the right tools and extensions, you can maximize to make the most out of PowerShell for handling system admin and cloud management.
- Understanding the Interface
- Console**: Default command-line interface.
- ISE (Integrated Scripting Environment)**: GUI for scripting.
- Visual Studio Code**: Recommended for advanced scripting (install PowerShell extension).
Beginners (Basic Commands and Navigation)
Start with learning basic commands and navigation to interact with the file system, view system processes, and use PowerShell’s help system. Mastering these fundamentals can uplift the capability of handling more complex tasks and cloud service management.
Goal: Learn to navigate the file system, run commands, and get help.
1. Help and Documentation
PowerShell provides built-in help and documentation using the commands such as Get-Help and Get-Command. These tools and commands are essential for beginners to understand cmdlets, syntax, and commnd usage while getting started with PowerShell.
- `Get-Help` — Display help for a command.
- `Update-Help` — Download the latest help files.
- `Get-Command` — List all available commands.
2. File System Navigation
Navigating the file system in PowerShell is simple with commands like Get-ChildItem and Set-Location. This section will cover these basic commands that will help you with directories, creating files and managing system resources effectively.
- `Get-ChildItem` (or `ls`, `dir`) — List files and folders.
- `Set-Location` (or `cd`) — Change directory.
- `New-Item` — Create a new file or folder.
- `Remove-Item` (or `rm`) — Delete a file or folder.
3. Basic Output
PowerShell allows you to display data in various formats, such as tables and lists, using Write-Output and Format-Table. This section also covers how you can format and present output ensuring that your data is clear and accessible for further analysis or automation tasks.
- `Write-Output` — Display text or variables.
- `Format-Table` — Display output in a table.
- `Format-List` — Display output as a list.
Intermediate (Working with Data and Automation)
In this section, you’ll get to know more about how you can work with variables, objects, and the PowerShell pipeline to configure system data and automate tasks. Here, you can also learn methods to perform the cloud integration and remote management, key skills for administrators working in multi-platform environments.
Goal: Learn to manipulate data, use variables, and automate tasks.
1. Variables and Data Types
This section covers how variables helps in storing and manipulating data, with support for various data types like strings, integers, and arrays. You can learn how variables and data types is essential for efficient scripting and dynamic automation tasks in system administration.
- `$var = «Hello, World!»` — Store data in a variable.
- `Get-Member` — Explore properties and methods of an object.
- `Clear-Variable` — Clear the value of a variable.
2. Working with Objects
PowerShell processes data as objects, offers full control over system resources and enables complex manipulations. This section covers how you can work with processes, services, and files that is crucial for uatomation and managing IT infrastructure.
- `Get-Process` — List running processes.
- `Get-Service` — List system services.
- `Select-Object` — Select specific properties of an object.
- `Sort-Object` — Sort objects by a property.
3. Pipeline and Filtering
The PowerShell pipeline allows seamless data flow between commands, enables data manipulation using cmdlets liek Where-Objects and ForEach-Object. You can easily master the pipeline so that you can perform automation and filter data more effectively in a real-time environment.
- `|` (Pipeline) — Pass output from one command to another.
- `Where-Object` (or `?`) — Filter objects based on conditions.
- `ForEach-Object` (or `%`) — Perform actions on each object.
Advanced (Scripting and Error Handling)
This section includes how to write a script, handle errors, and automate complex system configurations. Advanced PowerShell scripting enables power usage of system control, while managing and automating the system tasks and scripts while combining it with the cloud service APIs and enterprise infrastructure.
Goal: Write scripts, handle errors, and automate complex tasks.
1. Scripting Basics
In this section, you’ll learn how to write executable scripts fot automating tasks and configure system. This section will elevate you to set execution policies that can enable support in steramlining your workflow.
- `Set-ExecutionPolicy` — Allow scripts to run.
- `.\script.ps1` — Run a PowerShell script.
- `Param()` — Define parameters for a script.
2. Control Structures
Control structures like If-Else, For, and While allow you to add logic and repetition to your PowerShell scripts. These structures are essential for automating complex tasks and managing large datasets in system administration.
- `If-Else` — Conditional logic.
- `For`, `While`, `ForEach` — Loops for repetitive tasks.
- `Switch` — Multi-condition branching.
3. Functions and Modules
PowerShell functions and modules enable users to create a reusable code blocks to improve scripts. You can learn to manage and scale admin automation tasks.
- `Function` — Create reusable code blocks.
- `Import-Module` — Load a module.
- `Export-ModuleMember` — Expose functions in a module.
4. Error Handling
Error Handling in PowerShell using Try-Catch-Finally ensures that your scripts runs smoothly. You can also view and fix errors to improve script reliability and helps in troubleshooting automation tasks effectively.
- `Try-Catch-Finally` — Handle errors gracefully.
- `$Error` — View recent errors.
- `Throw` — Generate an error.
Expert (System Administration and Remote Management)
PowerShell allows expert-level management of system processes, services, and event logs while enabling remote execution through PowerShell Remoting. In this section, you’ll get to know on managing remote tasks that can help in streamline administrative tasks (for cloud also).
Goal: Manage systems, automate administrative tasks, and work remotely.
1. System Administration
Using PowerShell, you can easily easily manage services, processes, and system configurations efficiently. These tools are essential for automating IT tasks like monitoring, troubleshooting, and maintaining system health.
- `Get-EventLog` — Retrieve event logs.
- `Restart-Service` — Restart a service.
- `Stop-Process` — Terminate a process.
2. Remote Management
PowerShell enables remote management through cmdlets like Enter-PSSession and Invoke-Command, helps seamless administration of remote systems. You can also master the remote management for handling distributed environments and cloud infrastructres.
- `Enter-PSSession` — Start an interactive remote session.
- `Invoke-Command` — Run commands on remote systems.
- `New-PSSession` — Create a persistent remote session.
3. File and Folder Management
In this section, you’ll learn cmdlets such as Copy-Items, Move-Items, and Remove-Items that will help you with managing files and folders easily.
- `Copy-Item` — Copy files or folders.
- `Move-Item` — Move files or folders.
- `Rename-Item` — Rename files or folders.
4. Networking
PowerShell’s networking cmdlets, such as Test-NetConnection and Get-NetIPAddress, enable advanced network diagnostics and management. You can now make the most out of these tools to automate network testing, troubleshooting, and configuring tasks seamlessly.
- `Test-NetConnection` — Test network connectivity.
- `Get-NetIPAddress` — Retrieve IP address information.
- `Resolve-DnsName` — Resolve DNS names.
Mastery (Cloud Integration and Advanced Automation)
Are you looking to work with the cloud integration like AWS, or Azure? This section has it all, you’ll learn how to automate and manage infrastructure more effectively. By using (DSC) desired state configuration in PowerShell, you can access to your cloud environment and much more.
Goal: Integrate PowerShell with cloud platforms and advanced automation tools.
1. Cloud Integration
This section cover how to work with cloud integration using Azure, AWS, or any other similar platforms that allows you to manage and automate cloud infrastructure. Leverage cloud cmdlets like Connect-AzAccount ensures efficient provising, monitoring, and scaling of cloud resources.
- `Connect-AzAccount` — Log in to Azure.
- `Get-AzVM` — Retrieve Azure virtual machines.
- `New-AzResourceGroup` — Create a new Azure resource group.
2. PowerShell Desired State Configuration (DSC)
PowerShell’s DSC enables infrastructure automation by enforcing system configurations across servers and cloud platforms. it also ensures consistency, complaince, and automated remediation of system configurations for large-scale environments.
- `Configuration` — Define a DSC configuration.
- `Start-DscConfiguration` — Apply a DSC configuration.
- `Test-DscConfiguration` — Test system compliance.
3. Advanced Scripting
This section includes the use of modules, automation workflows, and error-handling techniques to manage complex systems and applications. You can master this scripting techniques to enhance the workflow of IT operations (including task automation and cloud resource management).
- `Export-Csv` — Export data to a CSV file.
- `Import-Csv` — Import data from a CSV file.
- `ConvertTo-Json` — Convert objects to JSON format.
4. Practical Examples
To get a real-world experience such as managing files, monitor system, and deploying cloud resources, this section has it all covered. These will help you to manage system administrative to automate repetitive tasks and improve operational efficiency across environments.
- File Management: Create, delete, and move files.
- System Administration: Manage processes, services, and users.
- Networking: Test connections and manage network adapters.
- Cloud Automation: Deploy and manage Azure resources.
В этом видео мы поговорим о инструменте, который облегчает жизнь специалистам IT, выполняющим рутинную работу. Речь пойдет о PowerShell, а точнее о создании и запуске скриптов в среде PowerShell.
В данном видео, мы посмотрим:
— как выглядит оболочка PowerShell,
— уточним версию компонентов и обновим их до актуального состояния.
— поговорим о PowerShell ISE, для чего она нужна и как ей пользоваться.
— обретем базовые знания, касающиеся синтаксиса PowerShell.
— разберем решение реальной задачи при помощи командлетов PowerShell.
Итак, есть некая организация, учетные записи компьютеров которой хранятся в активном каталоге. Предположим, что в зависимости от свойств, учетные записи располагаются в разных организационных единицах. Задача состоит в том, чтобы получить список компьютеров по заданным параметрам поиска из всего домена или определённой организационной единицы, не выписывая данные вручную. Также я предлагаю выгрузить список в текстовый файл, для последующей аналитической обработки.
Сравнение командной строки с PowerShell
Начнем с запуска обычной командной строки, далее запустим оболочку PowerShell. На первый взгляд они очень похожи, но принципиальные различия в них есть. Оболочка PowerShell, была разработана и выпущена как раз для того что бы сменить стандартную командную строку. Она, если можно так выразиться, является расширенной версией типично командной строки windows.
Оболочка позволяет выполнять как стандартные команды, используемые в командной строке, так и сценарии, благодаря более глубокой интеграции с операционной системой. Так же технология PowerShell, позволяет встраивать сценарии в приложения, для реализации различных функций.
Проверка версии PowerShell
Для полноценной работы с оболочкой, и использования доступных функций, необходимо понимать с какой версией PowerShell ведется работа. Для того что бы узнать какая версия PowerShell установлена, необходимо запустить команду $PSVersionTable. На слайде представлен вывод данной команды, после обновления. В нашем случае версия 4.0 Процесс обновления оболочки будет представлен в практической части видео.
PowerShell ISE
Для того что бы не навредить системе и проверить работоспособность скрипта, разработку, отладку и тестирование удобно проводить в специальной среде. PowerShell ISE дает такую возможность. Интерфейс приложения разделен на 3 части. В верхней части вы можете добавлять код, в нижней части получать вывод команд, а правая часть является своеобразной справкой. В ней вы можете подсмотреть необходимые для процесса командлеты. Более того в этой среде реализованы различные функции, такие как подсветка синтаксиса, конструктор команд и авто заполнение, что существенно облегчает программирование.
Построение команд в PowerShell
Теперь давайте немного поговорим о синтаксисе в PowerShell. Необходимо запомнить основной принцип построения командлетов. Вначале идет ГЛАГОЛ, далее СУЩЕСТВИТЕЛЬНОЕ и уже через тире, вы можете ввести параметры для этого командлета. На слайде представлен сложный командлет, но принцип остается неизменным. Сначала мы запрашиваем вывод справки Get-help, а затем указываем для какой команды мы хотим это сделать Get-date. Используя PS ISE, вы сможете получать список доступных параметров до ввода самого параметра, просто введя тире и выбрав необходимы параметр из списка.
Особенности запуска скриптов в PowerShell
Необходимо упомянуть об особенностях запуска скриптов PowerShell. Данное средство администрирования и автоматизации обладает очень высоким потенциалом и является мощным инструментом, поэтому разработчиками было принято решение ограничить запуск скриптов по умолчанию. Существует 4-е основных политики безопасности, регулирующих запуск скриптов на целевом устройстве. Вы можете ознакомиться с ними на данном слайде. У каждой политики свои особенности, и они применимы для разных сценариев. В нашем случае, для практической работы мы разрешим выполнение неподписанных скриптов используя политику «unrestricted»
Создание и запуск скриптов PowerShell на практике
Перейдем непосредственно к демонстрации. В качестве стенда для практической работы будет использован сервер с Windows Server 2016, с установленной ролью активного каталога и клиентская машина на windows 10.
Этапы видео:
- На контроллере домена смотрим структуру AD, определяем уч. записи компьютеров в каталоге, запоминаем.
- На клиентской машине запускаем PS, смотрим версию, обновляем до актуальной, обновляем справку.
- Устанавливаем RSAT для возможности подключения AD модуля в PS.
- Выставляем необходимые настройки политики для запуска скриптов.
- Сооружаем скрипт, позволяющий получить список машин из определенной OU по фильтру имени, запускаем, получаем результат, выгружаем в TXT.
Bonus: получение справки по командам get-help get-* с параметром «example» и «Full». Для вывода примеров использования команды.
Выводы: Сегодня мы поговорили о PowerShell и на практике посмотрели его возможности по упрощению рутинных задач для IT. В этот инструмент разработчиками заложен огромный потенциал и на мой взгляд знание PowerShell, является необходимым навыком для современного системного администратора.
Спасибо за внимание!
В описании данного видео, есть временные метки, по которым вы сможете сразу перейти к моменту в видео, который вас больше всего интересует.
Список временных меток:
- Обзор видеоурока «Основы Windows PowerShell»
- Постановка задачи для PowerShell
- Сравнение командной строки с PowerShell
- Проверка версии PowerShell
- PowerShell ISE
- Построение команд в PowerShell
- Особенности запуска скриптов в PowerShell
- Создание и запуск скриптов PowerShell на практике
Windows PowerShell. Общие сведения.
Windows PowerShell — это командная оболочка Windows,
разработанная в первую очередь для системных администраторов. Она включает
интерактивную командную строку и среду исполнения сценариев, которые можно
использовать вместе или по отдельности.
В Windows PowerShell реализована новая концепция
командлетов — простых, узкоспециализированных средств командной строки,
встроенных в оболочку.
Командлеты можно использовать и по отдельности, однако
по-настоящему их достоинства проявляются тогда, когда эти простые средства
используются в комбинации друг с другом для решения сложных задач. Windows
PowerShell включает более ста основных командлетов, к тому же есть возможность
создавать собственные командлеты и обмениваться ими с другими пользователями.
Как и многие другие оболочки, Windows PowerShell
обеспечивает доступ к файловой системе на компьютере. Кроме того, в состав
оболочки Windows PowerShell входят поставщики, позволяющие столь же легко
работать с другими хранилищами данных, такими как реестр и хранилища
сертификатов цифровых подписей.
В отличие от большинства оболочек, которые принимают и
возвращают текст, оболочка Windows PowerShell, разработанная на основе среды
CRL .NET и платформы .NET Framework, принимает и возвращает объекты .NET.
Структуры папок, или службы, к которым обращаются сценарии PowerShell, в
сущности, являются экземплярами объектов, которые представляют эти папки и
службы.
Конвейерная обработка позволяет получить результаты работы
одной команды и передать их на вход следующей команды при композиции. Например,
команда getmailbox используется для получения списка почтовых объектов,
которыми можно впоследствии манипулировать самыми разными способами. Команда
get-mailbox возвращает не список названий почтовых ящиков; а список объектов,
которые представляют собой почтовые ящики. В этом и состоит отличие
рассматриваемого продукта от других командных оболочек, которые способны только
обрабатывать тексты. Таким образом, PowerShell по своей мощности и эффективности
намного превосходит традиционные командные оболочки.
Политики выполнения.
Сценарии обеспечивают пользователям оболочки Windows
PowerShell широчайшие возможности, но их можно использовать со злым умыслом.
Для защиты пользовательских данных и целостности операционной системы в
оболочке Windows PowerShell реализованы некоторые средства обеспечения
безопасности, в том числе политика выполнения.
Политика выполнения оболочки Windows PowerShell определяет,
можно ли выполнять сценарии, и если да, должны ли они быть подписаны цифровой
подписью.
Кроме того, она
определяет, можно ли загружать конфигурационные файлы.
Политика выполнения по умолчанию (Restricted) обеспечивает
максимальную защиту из всех политик. Она не разрешает выполнять сценарии и
загружать какиелибо конфигурационные файлы, в том числе профиль Windows
PowerShell. Тем не менее, при этом можно работать с оболочкой Windows
PowerShell в интерактивном режиме.
Если нужно выполнять сценарии или загружать
конфигурационные файлы, политику выполнения можно изменить. Чтобы получить
сведения об этом и соответствующие инструкции, выполните следующую команду:
get-help about_signing
Чтобы вывести активную политику выполнения,
введите следующую команду: get-executionpolicy
Для изменения политики выполнения
используйте командлет Set-
ExecutionPolicy.
Например, чтобы сделать действующей политикой выполнения
политику RemoteSigned, введите следующую команду:
set-executionpolicy
remotesigned
Если установлена политика выполнения RemoteSigned,
PowerShell не будет запускать неподписанные сценарии, загруженные из Интернета
(включая электронную почту и программы мгновенного обмена сообщениями).
Если попытаться выполнить загруженный сценарий, PowerShell
выдаст такое сообщение об ошибке:
Нельзя загрузить файл C:\remote.ps1. Файл
C:\remote.ps1 не содержит цифровой подписи. Сценарий не будет выполнен.
Более подробные сведения, см. в
разделе «Get-Help about_signing»
Перед выполнением сценария, просмотрите исходный код, чтобы
убедиться в его надѐжности. Сценарии позволяют сделать то же, что и
исполняемые программы. Для выполнения неподписанного сценария необходимо будет
его разблокировать с помощью свойств файла в оболочке Windows. Если файл
сценария имеет цифровую подпись, но ее издатель не помечен как надежный,
PowerShell выполнит сценарий с запросом подтверждения.
Политика выполнения Windows PowerShell хранится в реестре
Windows и не удаляется даже при переустановке оболочки Windows PowerShell.
Обзор возможностей Windows PowerShell.
В любом интерфейсе командной строки (CLI), к которым
относится и Windows PowerShell, для получения информации используется подход
основанный на вводе команд. Перед использованием команд необходимо знать их
имена. Хотя можно вводить сложные команды, необходимо ознакомиться с
наиболее употребительными командами и параметрами команд.
Большинство интерфейсов командной строки не содержит
структур, которые могли бы помочь пользователю освоить интерфейс. Так как интерфейсы
командной строки были первыми оболочками операционных систем, многие имена
команд и параметров выбирались произвольно. Лаконичные имена команд обычно
использовались для большей ясности. Хотя в большинство CLI встроены справочные
системы и стандарты построения команд, эти интерфейсы обычно разрабатывались с
учѐтом совместимости с более ранними командами, так что набор команд до
сих пор оформлен по решениям, сделанным десятилетия тому назад.
Оболочка Windows PowerShell сконструирована таким
образом, чтобы пользователь мог воспользоваться знаниями, полученными при
работе с более ранними интерфейсами командной строки. Необходимо подробно
рассмотреть некоторые базовые средства и концепции, которые можно использовать
для быстрого изучения оболочки Windows PowerShell. Эти средства и концепции
включают в себя:
1.использование команды Get;
2.использование Cmd.exe и команд ОС UNIX;
3.использование внешних команд;
4.использование
функции автозавершения при помощи клавиши TAB; 5.
использование команды Get-Help.
Работа с объектами.
В отличие от традиционных команд с интерфейсом командной
строки, командлеты оболочки Windows PowerShell предназначены для работы с
объектами, представляющими собой структурированную информацию, являющуюся
более чем строкой символов на экране. Вывод команды всегда содержит
дополнительную информацию, которую при необходимости можно использовать.
Если ранее использовались средства обработки текста для
обработки данных командной строки, то при их использовании в оболочке Windows
PowerShell их функционирование выглядит несколько иначе. В большинстве случаев
для извлечения специальной информации нет необходимости в применении средств
обработки текстовых данных. Получить доступ к данным можно непосредственно с
помощью обычных команд обработки объектов оболочки Windows PowerShell.
С технической точки зрения объект .NET — это экземпляр
класса .NET, состоящий из данных и операций, определѐнных для этих
данных. Объект можно рассматривать как сущность, имеющую свойства
(характеристики сущности) и методы (действия, которые можно выполнять над
сущностью).
Например, при возврате службы средствами оболочки Windows
PowerShell на самом деле возвращается объект, представляющий соответствующую
службу. При просмотре сведений о службе отображаются свойства объекта-службы.
При запуске службы, то есть при изменении ее свойства Status на «started»,
выполняется метод объекта-службы.
Все объекты одного типа имеют одни и те же свойства и
методы, однако значения свойств каждого экземпляра объекта могут быть разными.
Например, каждый объект-служба имеет свойства Name и Status. Однако имя и
статус одной службы могут отличаться от имени и статуса любой другой службы.
Получить сведения об объектах несложно. Чтобы узнать,
объект какого типа получен командлетом, передайте результат выполнения команды
«get» команде GetMember с помощью оператора конвейерной обработки (|).
Например, следующая команда передает объекты, возвращенные командой
Get-Service, команде Get-Member:
Get-service | Get-member
Отображаются сведения об объекте-службе, в том числе имя
типа объекта (System.ServiceProcess.ServiceController) и список его свойств и
методов.
Для получения более подробной справки по работе со
свойствами и методами конкретного типа объекта можно, затем, воспользоваться
справочной системой MSDN или .NET Framework SDK.
Работа с командлетами.
В оболочку PowerShell встроено свыше 100 команд. Можно
создавать дополнительные команды, но при этом следует пользоваться языком
стандарта .NET, таким как Visual Basic .NET или C#. Каждый вариант команды
представляет собой комбинацию «глагол-существительное»; объясняется это тем,
что разработчики хотели использовать единообразную схему именования и тем самым
облегчить изучение, а также расширение оболочки PowerShell. Глагол указывает на
действие, которое предстоит совершить, а существительное — на тип объекта, на
который будет направлено действие. К примеру, команда Get-ChildItem считывает
список элементов текущего рабочего каталога или контейнера, например реестра. Для
выполнения команды нужно ввести ее в командной строке PowerShell и нажать
клавишу ввода.
Если неизвестно, существует ли команда для решения задачи,
которую предстоит выполнить, можно просмотреть список всех команд, выполнив
команду Get-Command. Список выводимых команд можно уменьшить при помощи шаблона
с подстановочными символами:
Get-Command get*
Оболочка Windows PowerShell может выполнять и другие
команды, отличные от командлетов, например, бинарные исполняемые файлы.
Оболочка Windows PowerShell поддерживает сценарии, аналогичные сценариям
оболочки UNIX и пакетным файлам Cmd.exe, но имеющие в имени файла расширение
PS1. Windows PowerShell позволяет также создавать внутренние функции, которые
могут использоваться непосредственно в интерфейсе или в сценариях.
Средства ускорения ввода команд.
К средствам ускорения ввода команд в PowerShell относится
автозавершение строки с помощью клавиши Tab, использование истории команд с
помощью клавиши F7 и задание псевдонимов.
Для автоматического ввода имени файла или пути из имеющихся
возможностей выбора можно ввести часть имени и нажать клавишу Tab. Оболочка
Windows PowerShell автоматически расширит имя до первого найденного ею
совпадения. При повторении нажатия клавиши Tab производится циклический переход
по имеющимся возможностям выбора.
Автоматическое завершение имен команд выглядит несколько
по-иному. Для использования расширения табуляции в имени команды необходимо
ввести глагол и дефис, следующий за глаголом. Повторные нажатия Tab позволят
пройти по списку команд, начинающихся с введенной строки.
Для навигации по истории введенных команд можно
пользоваться стрелками вверх и вниз, а можно воспользоваться клавишей F7.
Механизм псевдонимов связывает вводимое имя команды с
другой командой. К примеру, внутренняя функция Clear-Host, очищает окно для
выводимых данных. Если в командной строке ввести команду cls или clear, Windows
PowerShell интерпретирует это как псевдоним для функции Clear-Host и выполняет
функцию Clear-Host.
Далее приводится краткий список общих команд Cmd.exe и ОС
UNIX, которые можно использовать в оболочке Windows PowerShell:
cat dir mount rm cd echo move rmdir
chdir erase popd sleep clear h ps sort cls history pushd tee copy
kill pwd type del lp r write diff ls ren
Для получения действительного имени собственной команды
Windows
PowerShell, можно для
этого использовать команду Get-Alias.
Оболочка Windows PowerShell предоставляет набор стандартных
псевдонимов, основанных на сокращѐнных именах для обычных глаголов и
существительных. Это позволяет сформировать базовый набор легко читаемых
псевдонимов для общих команд, если известны сокращѐнные имена. Например,
в стандартных псевдонимах глагол Get сокращается до g, глагол Set сокращается
до s, существительное Item сокращается до i, существительное Location
сокращается до l и существительное Command сокращается до cm.
Для создания псевдонима в рамках текущего сеанса можно
воспользоваться командой Set-Alias. К примеру, чтобы создать псевдоним cnt для
обращения к Get-
Content, нужно выполнить
команду
Set-Alias cnt Get-Content
После этого всякий раз, когда потребуется выполнить команду
Get-Content, можно будет использовать псевдоним cnt. Этим псевдонимом можно
будет пользоваться до завершения сеанса (т.е. до закрытия оболочки PowerShell).
Необходимо учитывать, что при определении псевдонима возможность включения
параметров не предусмотрена; можно использовать только имя команды.
Использование переменных и типов данных.
Оболочка Windows PowerShell позволяет создавать переменные,
или, другими словами, именованные объекты, — чтобы сохранять в них данные
вывода для последующего использования. Имя переменной всегда начинается со
знака $ и может содержать любые буквы и цифры, а также знак подчеркивания.
Чтобы создать переменную, нужно ввести допустимое имя
переменной. Создать переменную и присвоить ей какое-либо значение можно одним
действием. Windows PowerShell создает переменную, только если она еще не
существует, в противном случае указанное значение присваивается существующей
переменной.
Для сохранения текущего местоположения в
переменной $loc следует ввести: $loc = Get-Location
После ввода этой команды ее вывод не отображается, потому
что он отправляется в переменную $loc. Отображение вывода в оболочке Windows
PowerShell представляет собой побочный эффект отправки данных: если не указано
иное направление отправки, то данные всегда отправляются на экран.
Для отображения сведений о содержимом переменных можно
воспользоваться командлетом Get-Member. Передача переменной $loc по конвейеру
командлету Get-
Member показывает, что это объект класса
PathInfo, также как и вывод командлета Get-Location.
В некоторых случаях может потребоваться явно указать тип
данных для переменной. Для этого используется оператор квадратные скобки.
Следующий сценарий определит две переменные разных типов:
[int] $i = 1
[double] $d = 1
Типом данных для переменной PowerShell может выступать
любой тип .NET Framework.
Действия со строками.
Администраторы часто работают с данными в форме строк. В
PowerShell это простой процесс. Так, в следующем примере строка «cat»
назначается переменной $a, затем отображается результат, то есть cat:
$a = «cat»; $a
Поскольку строка назначается переменной $a, PowerShell
автоматически приводит $a к типу System.String. Можно использовать метод
GetType и его свойство FullName, чтобы определить тип данных переменной.
Например, команда a.GetType ().FullName возвращает результат System.String.
Чтобы объединить строки, используется оператор конкатенации (+). Например,
следующий программный код добавляет строку » & dog » (вместе с
пробелами) к переменной $a, а затем отображает результат, то есть cat &
dog: $a = $a + » & dog «; $a
В строку можно добавить числовое значение. При этом число
автоматически преобразуется в строку. Например, следующий программный код
добавляет 10 к переменной $a, а затем выводит на экран результат, cat & dog
10: $a = $a + 10; $a
Если проверить тип данных, то это будет String, то есть
произойдет неявное преобразование типа.
Действия с числами.
Работать с числовыми данными в PowerShell так же просто,
как со строковыми. Числовые значения назначаются как строковые, единственное
различие — числовые значения не заключаются в кавычки. Если указано числовое
значение, PowerShell автоматически присваивает значению один из четырех типов
данных:
1.
System.Int32, 32-разрядное целое (псевдоним [int]).
2.
System.Int64, 64-разрядное целое (псевдоним [long]).
3.
System.Double, 8-байтное вещественное число с плавающей
запятой
(псевдоним [double]).
4.
System.Decimal, 12-байтное вещественное число (псевдоним
[decimal]).
Decimal, в отличие от
Double, использует точную арифметику.
Следующие инструкции демонстрируют, как
PowerShell назначает типы данных числовым значениям:
$a = 1234; $a
$a.GetType().FullName
$a = 12345678910; $a
$a.GetType().FullName
$a = 1234.5678; $a
$a.GetType().FullName
$a = 1234.5678d; $a
$a.GetType().FullName
Однако, чтобы назначить тип Decimal, необходимо прямо
указать символ d после числа; в противном случае PowerShell обрабатывает
значение как тип Double. Для соединения числовых значений можно использовать
знак «плюс». При этом числовые значения складываются, а не сцепляются, как
строковые. Например, следующие инструкции назначают значение 1234 переменной
$a, а затем добавляют 1.5678 к $a:
$a = 1234; $a
$a.GetType ().FullName
$a = $a + 1.5678; $a
$a.GetType ().FullName
Если попытаться сложить строку, которая не является числом,
с числовым значением, будет выдано сообщение об ошибке.
Действия с массивами.
Массивы представляют собой коллекции типа System.Object [].
Символы [] после типа данных показывают, что это массив со многими значениями.
PowerShell автоматически назначает массивам тип Object []. К примеру, $a =
«a»,»b»,»c»; $a создаѐт массив с тремя
строковыми переменными, а затем возвращает результаты.
Для доступа к отдельным элементам массива используется
индекс. Индексы массивов начинаются с 0, поэтому для доступа к первому элементу
указывается имя массива, за которым следует индекс в скобках, например $a [0].
Эта инструкция возвращает результат a. Если нужно
обратиться к более чем одному значению, просто укажите соответствующее число
инструкций.
Например, инструкции $a
[1]; $a [2] возвращают результаты
b c
Добавить элемент в массив можно с помощью оператора «плюс».
Например, программный код $a = $a + «d»; $a добавляет d к массиву $a,
а затем отображает результаты:
Когда элемент d добавляется к массиву, PowerShell назначает
ему следующий по порядку индекс (3).
Действия с хеш-таблицами.
Хеш-таблицы (или ассоциативные массивы) — коллекции,
которые принимают тип данных System.Collections.Hashtable. Основное различие
между хеш-таблицами и массивами заключается в том, что для идентификации
элементов в хеш-таблицах используются именованные ключи вместо индексов.
Например, в следующем примере назначаются три ключа и их значения к хеш-таблице
$a, а затем отображается содержимое таблицы и тип данных:
$a = @{b=»bird»;
c=»cat»; d=»dog»}; $a
$a.GetType ().FullName
Как видно из первой строки, хеш-таблица строится с
использованием символа @, за которым следуют фигурные скобки, заключающие
коллекцию пар ключ/значение. Первая пара ключ/значение — b/bird.
Можно получить список ключей хеш-таблицы с использованием
свойства Keys, Например, инструкция $a.Keys | sort получает ключи хеш-таблицы
$a, а затем использует команду Sort-Object (накоторую указывает псевдоним sort)
для сортировки ключей в алфавитном порядке.
Аналогично можно использовать свойство Values для
извлечения значений хеш- таблицы, как показывает инструкция $a.Values | sort
можно также извлечь отдельное значение, ссылаясь на ключ, как в инструкции $a.b
либо $a[―b‖].
Чтобы добавить пару ключ/значение в хеш-таблицу, можно
сослаться на новый ключ как на существующий, а затем ввести значение нового
ключа, как в следующем примере: $a.e = «elephant»; $a
Чтобы изменить значение существующего ключа, можно
сослаться на ключ и ввести новое значение, например $a.d = «dingo»;
$a
В этом примере пара d/dog
заменяется на d/dingo.
Удалить пару ключ/значение можно с помощью метода Remove.
Например, удаление пары d/dingo:
$a.remove («d»);
$a
Приведение и преобразование типов данных.
PowerShell позволяет производить как приведения, так и
преобразования типов данных. Например, предположим, что значение «10»
обрабатывается как числовое значение, а не как строка. С помощью следующего
кода можно создать переменную, которая содержит значение типа Double, хотя
начальное значение — строка:
$a = [double]
«10»
$a.GetType().FullName
Заметим, что тип Double указывается перед
значением. Того же результата можно достичь с помощью кода:
[double] $b =
«10»
$a.GetType ().FullName
Однако между двумя подходами есть различие. В первом случае
значение просто заменяется на тип System.Double. При втором подходе выполняется
строгий контроль типа переменной, то есть этой переменной можно назначать
только значения того же типа данных. Проверить различие можно, попытавшись
назначить строковое значение переменным $a и $b.
$a = «ten»; $a
$b = «ten»
Можно также контролировать тип данных, назначаемый массиву.
Например, программный код
$c = [double[]]
(«1″,»2″,»3»)
$c.GetType().FullName
назначает тип System.Double [] массиву $c
вместо выбираемого по умолчанию типа System.Object []. Символы [] означают, что
это по-прежнему массив со многими значениями. Следующий фрагмент программного
кода приносит те же результаты:
[double[]] $d =
(«1″,»2″,»3») $d.GetType ().FullName
В отличие от скалярных значений, в массивах при обоих
подходах выполняется строгий контроль типов. Например, если попытаться изменить
одно из значений на строку с помощью инструкций
$c[2] = «ten»
$d[2] = «ten» ничего не получится.
Иногда требуется преобразовать тип данных существующей
переменной. Например, преобразовать переменную date-time в строковую переменную
можно с помощью программного кода
$e = Get-Date
$e.GetType().FullName
$e = [string] $e
$e.GetType().FullName
Создание объектов .NET.
Существуют программные компоненты с интерфейсами платформы
.NET Framework, которые позволяют выполнять множество задач системного администрирования.
Оболочка Windows PowerShell позволяет использовать эти компоненты, поэтому
задачи, которые могут быть выполнены, не ограничиваются только использованием
командлетов. Для того, чтобы создать объект .NET используется команда
New-Object. New-Object позволяет указать параметры, необходимые для создания
объекта. Библиотека классов платформы .NET Framework включает класс
System.Diagnostics.EventLog, который используется для управления журналами
событий. Можно создать новый экземпляр класса .NET с помощью командлета
New-Object с параметром TypeName. Например, следующая команда создает ссылку на
журнал событий:
New-Object -TypeName
System.Diagnostics.EventLog
Хотя команда и создала экземпляр класса EventLog, этот
экземпляр не содержит данных. Это происходит в связи с тем, что не был указан
определенный журнал событий.
Чтобы обратиться к определенному журналу событий, нужно
указать его имя. Командлет New-Object имеет параметр ArgumentList. Значения,
передаваемые в этом параметре, используются специальным методом запуска
объекта. Этот метод называет конструктором, поскольку используется для создания
объекта.
Например, чтобы получить ссылку на журнал приложений, нужно
указать строку «Application» в качестве аргумента:
New-Object -TypeName
System.Diagnostics.EventLog — ArgumentList Application
Использование статических классов и методов.
Не все классы .NET Framework можно создать с помощью
командлета NewObject. Классы являются библиотеками ссылок для методов и
свойств, не изменяющих свое состояние. Нет необходимости в их создании — их
можно просто использовать. Классы и методы, подобные этим, называются
статическими классами, поскольку они не создаются, не уничтожаются и не
изменяются.
Обычно при работе с объектом в оболочке Windows PowerShell
в первую очередь используется командлет Get-Member, чтобы просмотреть элементы
объекта. Для статических классов эта процесс выглядит несколько иначе,
поскольку класс не является объектом как таковым.
Обращение к статическому классу возможно при заключении имени
класса в квадратные скобки. Например, ссылка на System.Environment состоит из
имени класса внутри скобок. При использовании командлета New-Object оболочка
Windows PowerShell автоматически подразумевает наличие определения «System» в
имени. То же самое происходит при заключении имени в скобки, поэтому ссылку
[System.Environment]
записать просто как [Environment].
В классе System.Environment содержатся общие данные о
рабочей среде текущего процесса, то есть процесса powershell.exe, при работе в
оболочке Windows PowerShell.
Если для просмотра подробных сведений об этом классе
вводится команда [System.Environment] | Get-Member то будет сообщен тип объекта
System.RuntimeType, а не System.Environment.
Для просмотра статических элементов с помощью командлета
Get-Member необходимо указать параметр Static:
[Environment] | Get-Member
-Static -MemberType Property
Свойства класса System.Environment являются статическими,
как и сам класс, и способ их задания отличается от указания обычных свойств.
Знак «::» используется для указания в PowerShell, что работа ведется со
статическими методами или свойствами. К примеру, чтобы увидеть команду,
используемую для запуска
PowerShell, следует
использовать свойство CommandLine:
[Environment]::Commandline
Конвейерная обработка.
Одним из главных преимуществ использования объектов
является то, что оно значительно облегчает организацию конвейерного выполнения
команд, то есть передачу вывода одной команды другой команде в качестве ввода.
При реализации такого взаимодействия часто требуется преобразовать вывод в
другой формат и удалить названия и заголовки столбцов.
В оболочке Windows PowerShell реализована новая модель
взаимодействия, основанная на объектах, а не тексте. Командлет, который
принимает объект, может обращаться к его свойствам и методам без каких-либо
преобразований или других операций. Пользователи могут обращаться к свойствам и
методам объекта по их именам вместо того, чтобы определять расположение нужных
данных в выводе.
Каждая команда генерирует объект и передает его по
конвейеру. Принимающая команда использует полученный объект в качестве входных
данных и генерирует собственные выходные данные опять же в виде объекта.
Команды объединяются в конвейер с помощью оператора конвейера (|).
В PowerShell конвейер реализован иначе, нежели в других
оболочках, таких как командная оболочка Windows. В традиционных средах
результаты выполнения команды возвращаются в виде единого набора результатов, а
это значит, что перед тем как начнѐтся передача любых данных по конвейеру,
должен быть сформирован весь набор результатов. Первый результат возвращается в
то же время, что и последний. В среде PowerShell результаты передаются на
конвейер в виде потока. Как только та или иная команда возвращает результат,
она передает его на конвейер, и этот результат немедленно передается следующей
команде конвейера.
Обход элементов в конвейере.
Командлет ForEach-Object использует блоки сценариев и
дескриптор $_ для текущего объекта конвейера, чтобы та или иная команда была
выполнена для всех объектов конвейера. Эта возможность позволяет выполнить
некоторые сложные действия.
Одним из них является обработка данных с целью повышения их
применимости. Например, класс Win32_LogicalDisk из инструментария управления
Windows может использоваться для просмотра сведений о свободном месте на каждом
локальном диске.
Get-WmiObject -Class
Win32_LogicalDisk
Значение свойства FreeSpace можно преобразовать в
мегабайты, дважды разделив исходное значение на 1048576 (1024×1024). Для этого
в блоке сценария ForEach-Object нужно ввести:
Get-WmiObject -Class Win32_LogicalDisk
| ForEach-Object -Process
{($_.FreeSpace)/1048576}
Создание производных объектов.
Командлет Select-Object позволяет создавать новые объекты
Windows PowerShell, которые содержат избранные свойства существующих объектов,
используемых при создании новых. Чтобы создать новый объект, который содержит
только свойства Name и FreeSpace WMI-класса Win32_LogicalDisk, введите
следующее:
Get-WmiObject-Class Win32_LogicalDisk | Select-Object —
Property Name,FreeSpace
После выполнения этой команды нельзя увидеть тип данных; но
если результат передать по конвейеру командлету Get-Member после ключевого
слова Select-Object, то можно увидеть новый тип объекта PSCustomObject:
Get-WmiObject -Class Win32_LogicalDisk | Select-Object
-Property Name,FreeSpace | Get-Member
Командлет Select-Object имеет достаточно широкое
применение. Одним из примеров является репликация данных, которые затем можно
изменить. Значение свойства FreeSpace вновь созданных объектов можно обновить,
и выводимые данные будут содержать описательную метку:
Get-WmiObject
-Class Win32_LogicalDisk | Select-Object — Property
Name,FreeSpace |
ForEach-Object –Process
{$_.FreeSpace =
($_.FreeSpace)/1024.0/1024.0; $_}
Сортировка объектов.
С помощью командлета Sort-Object отображаемые данные можно
организовать таким образом, чтобы упростить их просмотр. Командлету Sort-Object
передаются имена свойств, по которым нужно произвести сортировку, и возвращает
данные отсортированными по значениям этих свойств.
Рассмотрим проблему перечисления экземпляров класса
Win32_SystemDriver. Чтобы отсортировать данные сначала по свойству State, а
затем по свойству Name, необходимо ввести следующую команду:
Get-WmiObject -Class
Win32_SystemDriver | Sort-Object -Property State,Name |
Format-Table –Property
Name,State,Started,DisplayName -AutoSize -Wrap
Объекты можно отсортировать в обратном порядке, для чего
требуется указать параметр Descending. Это изменяет порядок сортировки таким
образом, что имена сортируются в обратном алфавитном порядке, а числа — по
убыванию.
Get-WmiObject -Class
Win32_SystemDriver | Sort-Object — Property State,Name —
Descending | Format-Table –Property
Name,State,Started,DisplayName -AutoSize Wrap
Форматирование вывода.
Windows PowerShell содержит набор командлетов, позволяющих
пользователю контролировать, какие свойства должны отображаться для
определенных объектов. Имена всех этих командлетов начинаются глаголом Format.
Они позволяют выбрать для отображения одно или несколько свойств.
Format-командлетами
являются командлеты Format-Wide, Format-List, Format-
Table и Format-Custom. Мы рассмотрим
командлеты Format-Wide, Format-List и Format-Table.
Каждый командлет форматирования имеет свойства по
умолчанию, которые используются, если не задается отображение каких-либо
определенных свойств. Для задания — какие свойства необходимо отобразить,
каждый командлет использует также одно и то же имя параметра Property. Так как
командлет Format-Wide отображает только одно свойство, для его параметра
Property задается только одно значение, но в качестве значений параметров
свойств командлетов Format-List и Format-Table задается список имен свойств.
Формирование вывода с одним элементом.
По умолчанию командлет Format-Wide отображает только
свойство объекта по умолчанию. Данные, связанные с каждым объектом,
отображаются в одном столбце: Get-Process -Name powershell | Format-Wide
Можно также задать
свойство, отличное от свойства «по умолчанию»:
Get-Process -Name
powershell | Format-Wide Id
При помощи командлета Format-Wide в определенный момент
времени можно отобразить только одно свойство. Это может быть полезным при
отображении простых списков, в которых в каждой строке отображается только один
элемент.
Параметр Column указывает, на сколько колонок будет
разделяться вывод. Для получения простой распечатки можно установить значение
параметра Column равным
1.
Форматирование представления списка.
Командлет Format-List показывает объект в виде списка, в
котором каждое свойство снабжено меткой с названием и отображено в отдельной
строке: Get-Process -Name powershell | Format-List
Можно указать произвольное
число свойств:
Get-Process -Name powershell | Format-List –Property
ProcessName,Id или сокращенный вариант той же команды: Get-Process powershell |
fl ProcessName,Id
Командлет Format-List позволяет использовать подстановочные
знаки в качестве значения параметра Property. Это дает возможность отображать
подробные сведения. Зачастую объекты содержат больше информации, чем
необходимо. Поэтому Windows PowerShell по умолчанию выводит значения не всех
свойств. Чтобы вывести все свойства объекта, воспользуйтесь командой
Format-List -Property *. Следующая команда формирует более 60 строк вывода для
одного процесса:
Get-Process -Name
powershell | Format-List -Property *
Хотя команда Format-List и полезна для вывода подробных
сведений, если нужно получить сведения, содержащие много элементов, обычно
удобнее использовать упрощенное табличное представление.
Получение вывода в виде таблицы.
Если использовать командлет Format-Table без указания имен
свойств для форматирования вывода команды Get-Process, будет получен точно
такой же вывод, что и без использования форматирования. Причина состоит в том,
что процессы обычно показываются в виде таблицы, как и большинство объектов
Windows
PowerShell.
Get-Process -Name
powershell | Format-Table
Хотя табличное представление и полезно при выводе большого
количества сведений для сравнения, интерпретация данных может вызвать
затруднения, если экран слишком узок и не вмещает все данные. Например, если
показать путь процесса, идентификатор, имя и компанию, данные в столбцах пути
процесса и компании окажутся обрезанными:
Get-Process -Name powershell | Format-Table –Property
Path,Name,Id,Company
Если указать параметр AutoSize при выполнении команды
Format-Table, Windows PowerShell вычислит ширину столбцов на основании ширины
реально
отображаемых данных. Это улучшит внешний
вид столбца Path, но значение столбца с названием компании останется
обрезанным:
Get-Process -Name
powershell | Format-Table –Property Path,Name,Id,Company —
AutoSize
Командлет Format-Table может обрезать данные, но это
происходит только на правой границе экрана. Свойствам, за исключением
последнего отображаемого, выделяется столько места, сколько нужно для
корректного вывода самого длинного элемента данных. Название компании будет видно
полностью, но путь будет обрезан, если поменять местами элементы Path и Company
в списке значений Property. Команда Format-Table предполагает, что
свойство, расположенное ближе к началу списка свойств, является более важным. В
связи с этим предпринимается попытка отобразить полностью свойства, находящиеся
ближе всего к началу. Если команда Format-Table не может отобразить все
свойства, она удалит некоторые столбцы из вывода и выдаст предупреждение. Это
поведение можно увидеть, если поместить свойство Name в конец списка.
Можно принудительно перенести длинные данные вывода
командлета FormatTable на следующую строку в пределах столбца с помощью
параметра Wrap.
Использование параметра Wrap в отдельности
не всегда приводит к ожидаемому результату, поскольку используются установки по
умолчанию, если также не указан параметр AutoSize:
Get-Process -Name powershell | Format-Table -Wrap –Property
Name,Id,Company,
Path
Преимуществом использования параметра Wrap без других
параметров является то, что обработка при этом не замедляется существенным
образом. Использование параметра AutoSize во время выполнения рекурсивного
вывода списка файлов в большом каталоге может потребовать значительного объема
памяти и времени перед отображением первых элементов вывода.
Если загрузка системы не имеет решающего значения, параметр
AutoSize хорошо работает в сочетании с параметром Wrap. Начальным столбцам
всегда выделяется необходимый размер для вывода элементов в одной строке, как и
при указании параметра AutoSize без параметра Wrap. Единственное отличие
состоит в том, что последний столбец будет при необходимости перенесен на
следующую строку:
Get-Process -Name powershell | Format-Table -Wrap –AutoSize
-Property
Name,Id,Company,Path
Организация табличного вывода.
Другим полезным параметром управления табличным выводом
является параметр GroupBy. Длинные табличные выводы особенно тяжелы для
сравнения. Параметр GroupBy группирует выводимые данные в соответствии со
значениями свойств. Например, можно сгруппировать процессы по имени процесса
для упрощения проверки, исключая имя процесса из списка свойства:
Get-Process -Name powershell | Format-Table -Wrap –AutoSize
-Property Id,Path —
GroupBy Name
Перенаправление данных.
Windows PowerShell предоставляет несколько командлетов,
которые позволяют напрямую управлять выводом данных. Эти командлеты обладают
двумя общими важными характеристиками.
Во-первых, они обычно преобразуют данные в некоторое
текстовое представление. Преобразование выполняется, поскольку данные выводятся
в системные компоненты, ожидающие текстовый ввод. Это означает, что объекты
должны быть представлены в текстовом виде. Поэтому текст форматируется в виде,
пригодном для отображения в окне консоли PowerShell.
Во-вторых, эти команды используют глагол PowerShell Out,
поскольку отправляют сведения из PowerShell за пределы оболочки. Командлет
Out-Host не является исключением: окно главного приложения отображается вне
PowerShell. Это важно, поскольку при передаче из PowerShell данные в
действительности удаляются. Убедиться в этом можно, если попытаться создать
конвейер, который постранично передает данные в окно главного приложения и
пытается отформатировать их в виде списка, как показано ниже:
Get-Process | Out-Host
-Paging | Format-List
Командлет Out-Host передает данные напрямую консоли,
поэтому команда Format- List так и не получает ничего для форматирования. Чтобы
правильно структурировать эту команду, нужно поместить командлет Out-Host в
конец конвейера. При этом данные процесса форматируются в виде списка перед
разбиением на страницы и отображением.
Get-Process | Format-List
| Out-Host -Paging
Это относится ко всем командлетам Out. Командлет Out всегда
должен находиться в конце конвейера.
Все командлеты Out подготавливают вывод в виде текста,
используя текущее форматирование для окна консоли, включая ограничения на длину
строки. Для разбиения данных на страницы можно также использовать функцию more.
В Windows PowerShell функция more вызывает команду Out-Host -Paging.
Следующая команда демонстрирует использование функции more
для разбиения на страницы вывода командлета Get-Command:
Get-Command | more
Если в качестве параметров этой функции указать одно или
несколько имен файлов, функция прочитает указанные файлы и разобьет на страницы
их содержимое при передаче в главное приложение:
more \autoexec.bat
Отбрасывание ненужного вывода.
Командлет Out-Null разработан для немедленного отбрасывания
любых входных данных. Это полезно при отбрасывании ненужных данных, полученных
в качестве побочного эффекта выполнения команды. Если ввести следующую команду,
ее выполнение не приведет к выдаче какого-либо результата:
Get-Command | Out-Null
Командлет Out-Null не отбрасывает сообщения об ошибках.
Например, если ввести следующую команду, будет отображено сообщение о том, что
оболочка Windows PowerShell не распознала вызов «Is-NotACommand»: Get-Command
Is-NotACommand | Out-Null
Печать данных.
Данные можно распечатать при помощи командлета Out-Printer.
Командлет Out- Printer использует принтер по умолчанию, если не указано имя
принтера. Можно использовать любой принтер Windows, указав его отображаемое
имя. Отсутствует необходимость как в привязке порта принтера, так и в
присутствии реального физического принтера. Например, если имеются
установленные средства создания документов XPS, можно создать документ, введя
следующее:
Get-Command | Out-Printer
-Name «Microsoft XPS Document Writer»
Сохранение данных.
Можно направить вывод в файл вместо окна консоли с помощью
командлета Out-File. Следующая команда направляет список процессов в файл
C:\processlist.txt:
Get-Process | Out-File
-FilePath C:\processlist.txt
Результаты использования командлета Out-File не всегда
соответствуют ожидаемым, если пользователь привык к традиционному
перенаправлению вывода. Чтобы разобраться в его поведении, следует учесть
контекст, в котором выполняется командлет Out-File.
По умолчанию командлет Out-File создает файл в формате
Юникод. Это наилучшее долговременное решение, но средства, которые принимают на
входе файлы ASCII, не будут корректно работать с таким форматом вывода по
умолчанию.
Формат вывода по умолчанию можно изменить
на ASCII с помощью параметра Encoding:
Get-Process | Out-File
-FilePath C:\processlist.txt -Encoding ASCII
Командлет Out-file форматирует содержимое файла так, чтобы
оно выглядело аналогично выводу консоли. Это приводит к обрезанию вывода, как
это чаще всего и происходит в окне консоли. Предположим, например, что
выполняется следующая команда:
Get-Command | Out-File
-FilePath output.txt
Чтобы получить вывод, который не использует переносы для
обеспечения соответствия ширине экрана, можно воспользоваться параметром Width
для указания ширины строки. Поскольку параметр Width представляет собой
32-разрядное целое число, его максимальное значение может быть равно
2147483647.
Чтобы установить ширину строки в максимальное значение,
введите следующее: Get-Command | Out-File -FilePath c:\temp\output.txt –Width
2147483647
Командлет Out-File наиболее полезен, когда нужно сохранить
вывод в том же виде, в каком он отображается на консоли.
#Руководства
-
0
Рассказываем о языке программирования, с помощью которого можно творить чудеса в Windows (и не только).
Иллюстрация: Francesca Tosolini / Unsplash / Annie для Skillbox Media
Журналист, изучает Python. Любит разбираться в мелочах, общаться с людьми и понимать их.
Рядовые пользователи общаются со своими ПК через графический интерфейс: нажимают иконки и кнопки, переключаются между окнами и вкладками.
А системные администраторы используют для этого командную строку. Чтобы компьютер понимал их указания, интерпретатор, он же командная оболочка, переводит всё на машинный язык.
Есть десятки оболочек под разные нужды, предпочтения и операционные системы. В Linux обычно используют Bash, в macOS по умолчанию установлен Zsh, а для Windows (но не только) есть PowerShell.
Из статьи вы узнаете:
- Что такое Windows PowerShell
- Как открыть PowerShell в Windows
- Какие у неё есть команды (они же командлеты)
- Что такое объекты и конвейеры (пайплайны)
- Как запустить выполнение задач в фоновом режиме
- Как работать в PowerShell ISE
- О переменных
- О логических операторах
- Об условиях в Power Shell
- Как работать с циклами
- О массивах, хеш-таблицах, функциях и классах
Windows PowerShell — это одновременно командная оболочка и язык сценариев, основанный на .NET. PowerShell используют для управления компьютером и автоматизации задач. Это полноценный объектно-ориентированный язык, в котором есть переменные, функции, классы и объекты.
В отличие от других командных оболочек, PowerShell работает не со строками, а с объектами. Благодаря этому можно создавать сложную логику. При этом интерпретатор полностью совместим со стандартными командами cmd.exe и может выполнять их.
Команды пишут в интерактивном режиме внутри терминала. Но если вы хотите сохранить какой-то часто используемый скрипт, удобнее использовать ISE.
Windows PowerShell ISE — это интегрированная среда сценариев для PowerShell. В ней можно писать, сохранять и запускать скрипты, есть подсветка синтаксиса, автодополнение, справочник команд и инструменты отладки. PowerShell ISE — легаси-инструмент, он работает для версии языка 5.1 и ниже. Для более поздних обновлений используют IDE общего назначения с плагинами.
С 2016 года язык стал кросс-платформенным. Его можно использовать не только в Windows, но и в macOS (начиная с версии 10.13) и популярных дистрибутивах Linux (каких именно, можно узнать в документации).
Обычно PowerShell предустановлен по умолчанию. Но если у вас его нет, можете воспользоваться инструкцией от Microsoft. Также в документации есть руководства по установке для macOS и Linux.
PowerShell не зависит от версии операционной системы и одинаково работает как на Windows 10, так и на Windows Server.
Есть два основных способа открыть PowerShell или PowerShell ISE в Windows: меню «Пуск» и приложение «Выполнить».
В меню «Пуск» долистайте до папки Windows PowerShell, откройте её и выберите нужное приложение. Здесь есть 32-разрядные (у них х86 в скобках) и 64-разрядные версии терминала и ISE.
Скриншот: Skillbox Media
Приложение «Выполнить» открывается сочетанием клавиш Win + R. В появившемся окне введите powershell или powershell ise (в зависимости от того, что вам нужно) и нажмите ОК.
Скриншот: Skillbox Media
Команды в PowerShell называются командлетами (от английского cmdlet). Все они состоят из связки «Глагол-Существительное», или по-другому «Действие-Объект». Например, Get-Services и Start-Process. Благодаря такой структуре можно понять назначение команды, даже если вы с ней ещё не сталкивались.
После самого командлета ему передаются параметры и их значения. Между всеми словами в команде ставится пробел. Вот пример синтаксиса команды, чтобы перейти в каталог C:\:
Set-Location -LiteralPath C:\ -PassThru
Препарируем её:
- Set-Location — буквально «установить местоположение». Переходит в нужный каталог.
- -LiteralPath C:\ — в этом параметре мы прописываем путь до каталога, в который хотим перейти. У командлета Set-Location это аргумент по умолчанию, поэтому -LiteralPath можно не прописывать отдельно: Set-Location C:\ -Passthru сработает точно так же.
- -PassThru — обычно командлет Set-Location просто меняет местоположение и ничего не возвращает. Этот параметр говорит, что нужно вывести на экран расположение каталога, в который мы перешли.
При этом в PowerShell не важен регистр. Эту же команду можно записать только заглавными буквами, только строчными и даже «лесенкой» — она всё равно сработает.
sEt-loCATion -PATH c:\ -passthru
Если в одной строке написаны сразу несколько команд, они разделяются точкой с запятой ;.
Иногда команда может получиться слишком длинной. Чтобы разбить её на несколько строк, в месте переноса ставится гравис `. Создать новую строку можно сочетанием клавиш Shift + Enter (появится ниже текущей) или Ctrl + Enter (появится выше текущей).
Разделим предыдущую команду:
Set-Location `
-LiteralPath C:\ `
-PassThru
Совет
Стрелки вверх и вниз позволяют прокручивать историю команд, которые вы вводили. Это удобно, если нужно выполнить одну из предыдущих команд ещё раз или внести в неё небольшие изменения.
При работе с терминалом в интерактивном режиме бывает неудобно каждый раз вводить полные названия командлетов. Поэтому у самых распространённых есть псевдонимы, или алиасы, — их сокращённые версии.
Получить список доступных алиасов можно командой Get-Alias (у неё тоже есть свой псевдоним — gal).
Чтобы узнать список алиасов для отдельного командлета, воспользуйтесь параметром -Definition. Например:
Get-Alias -Definition Get-ChildItem
Если вы по алиасу хотите узнать полное название командлета, примените параметр -Name. Это аргумент по умолчанию, поэтому писать его необязательно.
# Оба варианта равноправны Get-Alias -Name clear Get-Alias clear
Многим командлетам для работы нужно передать путь до файла или каталога. Делается это в виде строки, например: C:\Windows\System32.
Но если в этом адресе встретится пробел или другой спецсимвол, PowerShell воспримет его как разделитель. Например:
# Эта команда не будет работать Set-Location C:\Program Files
PowerShell «видит» пробел и думает, что путь до папки закончился на слове Program, а files — это уже значение какого-то другого параметра.
Есть два способа избежать таких ситуаций:
- Экранировать проблемные символы обратным грависом `: C:\Program` Files. Если путь длинный, то это может быть неудобно.
- Поместить весь путь в одинарные или двойные кавычки: ‘C:\Program Files’ или «C:\Program Files» (лучше одинарные).
Также в PowerShell есть сокращения для быстрого доступа к ближайшим директориям:
- Точка . указывает на текущий каталог. Например, Get-ChildItem . позволяет посмотреть все папки и файлы в нынешнем местоположении.
- Две точки .. указывают на родительский каталог. Например, Set-Location .. позволяет быстро к нему перейти. Это может быть полезно, если вы находитесь где-то в глубоко вложенной директории.
У многих командлетов есть сразу два параметра, в которых можно указать путь до папки или файла: -Path и -LiteralPath. Разница между ними в том, что в -Path можно подставлять переменные, а -LiteralPath воспринимает символы буквально, даже если в них указано имя переменной. О переменных в PowerShell мы рассказываем ниже.
Чтобы узнать подробную информацию о командлете, используйте Get-Help Название-Командлета. Например:
Get-Help Get-Childitem
У Get-Help есть несколько полезных параметров:
- -Detailed даёт более детальную справку.
- -Full даёт полную справку.
- -Examples приводит примеры использования командлета.
- -Online перенаправляет на веб-страницу с документацией.
Командлеты PowerShell возвращают в терминал не строки, а объекты — структуру данных с набором свойств и методов. Подробно об объектах можно прочитать в нашей статье.
Строка, которую вы видите в терминале после выполнения команды — только визуальное представление объекта. PowerShell в виде таблицы показывает некоторые свойства, но не все.
Так же, как командлеты возвращают объекты, они могут принимать и обрабатывать их. Можно написать команду, на выходе получить объект, передать его другому командлету, получить объект уже от него, передать — и так до бесконечности. Это и есть конвейеры, или пайплайны.
Чтобы передать результат командлета другому командлету, между ними ставят вертикальную черту |.
Get-Process возвращает список процессов, запущенных на компьютере. Если передать ему название процесса (или шаблон, написанный с помощью регулярных выражений), командлет выведет только нужные элементы списка.
Вызовем запущенный процесс powershell.
Get-Process powershell
Мы получили объект и таблицу с некоторыми его свойствами. Чтобы узнать все свойства и методы, передадим объект командлету Get-Member. Для этого нам и понадобится конвейер.
Get-Process powershell | Get-Member
Get-Member получил объект от Get-Process и вывел таблицу со всем его содержимым. Результат работы Get-Member — тоже объект (вернее, список объектов), который можно передать по конвейеру дальше.
Например, мы хотим отобразить только те строки, в которых MemberType — это Property. Для этого используем командлет Where-Object.
Get-Process powershell | Get-Member | Where-Object {$_.MemberType -eq 'Property'}
Where-Object по очереди перебирает каждый объект, полученный от Get-Member. Выражение в фигурных скобках — логическое:
- $_ ссылается на текущий объект (то есть на отдельную строку в таблице);
- .MemberType обращается к значению свойства MemberType в этом объекте;
- -eq сравнивает, равно ли выражение слева от него выражению справа от него;
- ‘Property’ — это значение, которое мы ожидаем увидеть у свойства MemberType.
О логических выражениях мы рассказываем ниже.
Командлет Format-Table позволяет настроить отображение таблицы, которую PowerShell выводит в терминале: выбрать свойства и методы, которые в ней будут, установить ширину столбцов, сгруппировать данные по нескольким таблицам и так далее.
Отформатируем таблицу, которую получили от командлета Get-Member.
Get-Process powershell | Get-Member | Format-Table -AutoSize -Wrap -GroupBy MemberType -Property Name, Definition
Расшифруем параметры Format-Table:
- -AutoSize выравнивает ширину столбцов по размеру их содержимого;
- -Wrap переносит содержимое ячейки на следующую строку, если она не помещается в размеры экрана (по умолчанию текст обрезается);
- -GroupBy разделяет одну таблицу на несколько, сгруппированных по значению какого-либо свойства (в нашем случае для каждого MemberType создана отдельная таблица);
- -Property указывает, какие свойства объекта будут отображаться в таблице в качестве столбцов (в нашем случае Name и Definition).
Командлет Sort-Object позволяет отсортировать список объектов (то есть таблицу) по значениям её свойств (то есть столбцов). Отсортируем результат работы GetMember по столбцу Name в алфавитном порядке. Для этого используем параметр -Property (работает как у Format-Table).
Get-Process powershell | Get-Member | Sort-Object -Property Name
У Sort-Object есть и другие полезные параметры:
- -Descending сортирует объекты в порядке убывания.
- -Unique удаляет дубликаты и возвращает только уникальные объекты.
- -Top получает число N и отображает первые N объектов в таблице.
- -Bottom получает число N и отображает последние N объектов в таблице.
Некоторые задачи могут занимать много времени. Это, например, установка и обновление ПО, поиск файла в большой директории. Пока PowerShell выполняет одну команду, писать другие нельзя.
К примеру, попытаемся найти на всём диске C файл powershell.exe. Используем для этого командлет Get-ChildItem с параметром -Recurse. Так он будет искать не только в текущем каталоге, но и во всех подкаталогах.
PowerShell может попытаться зайти в папки, к которым у него нет доступа, поэтому добавим -ErrorAction SilentlyContinue. Если случится ошибка, команда не станет сообщать об этом и просто продолжит выполняться.
Получается так:
Get-ChildItem -Path C:\ -Name powershell.exe -Recurse -ErrorAction SilentlyContinue
Как видим, пока задача не завершена, командная строка недоступна. Чтобы принудительно прервать её выполнение, нажмите сочетание клавиш Ctrl + C (при этом ничего не должно быть выделено, иначе компьютер воспримет это как команду «Копировать»).
Чтобы не ждать выполнения долгих задач и сразу приступать к следующим, их можно запускать в фоновом режиме. Делается это командлетом Start-Job, а сама команда помещается в фигурные скобки.
Start-Job {Get-ChildItem -Path C:\ -Name powershell.exe -Recurse -ErrorAction SilentlyContinue}
Одновременно можно выполнять любое количество фоновых задач. Помимо Start-Job для работы с фоновыми задачами есть другие командлеты:
- Get-Job выдаёт отчёт со статусом фоновых задач.
- Wait-Job делает консоль недоступной, пока выполняется фоновая задача.
- Stop-Job прерывает выполнение фоновой задачи.
- Receive-Job выводит результат фоновой задачи и удаляет его из памяти. Чтобы сохранить результат в памяти, используйте параметр -Keep.
Wait-Job, Stop-Job и Receive-Job ожидают, что вы примените их к конкретной задаче (или нескольким). Для этого укажите название Name или идентификатор Id. Делать это можно и в связке с Get-Job.
Get-Job Job1
Терминал PowerShell удобен для выполнения небольших коротких однострочных задач. Чтобы создавать и сохранять сложные скрипты, есть интегрированная среда сценариев.
Важно!
PowerShell ISE предназначен для версий языка 5.1 и младше. Для более старших версий Microsoft рекомендует использовать Visual Studio Code с расширением PowerShell.
PowerShell ISE состоит из трёх основных окон:
- область сценариев в верхней части экрана — в ней пишут скрипты;
- область консоли в нижней части экрана — работает так же, как обычный терминал, здесь можно писать команды в интерактивном режиме;
- панель команд в правой части экрана — полный справочник команд PowerShell с конструктором, в котором можно указать значения нужных параметров.
PowerShell позволяет вставлять в код комментарии. Они никак не влияют на выполнение скрипта и нужны людям, которые будут читать вашу программу. Однострочный комментарий начинается с символа #, а многострочный обрамляется с двух сторон символами <# и #>.
Любой код чаще читают, чем пишут, и важно делать его понятным для человека. Разработчики PowerShell договорились между собой о едином своде правил и выпустили стайлгайд. Вот несколько правил оттуда.
Используйте нотацию PascalCase в названиях командлетов, функций, параметров, свойств, методов, переменных и классов. Неправильно писать: get-service, Get-service, GET-SERVICE. Правильно: Get-Service.
Пишите полные названия командлетов. Алиасы удобны для работы в интерактивном режиме, но в скриптах могут затруднять чтение команд. Неправильно: dir, gci, ls. Правильно: Get-ChildItem.
One True Brace Style при оформлении вложенности. Если вы где-то используете фигурные скобки, то код внутри них отбивается табуляцией (четыре пробела), а сами скобки ставятся так:
if ($var1 -eq $var2) { # Код внутри условия } else { # Код внутри условия # Ещё код внутри условия }
Исключение из прошлого правила — когда код в фигурных скобках совсем небольшой, его можно записать в одну строку. Например:
Get-ChildItem | Where-Object { $_.Length -gt 10mb }
Комментируйте код. Так будет гораздо проще разобраться, что он делает и как работает. Причём как другому человеку, так и вам самим через полгода.
В PowerShell ISE можно выполнить код целиком или частично, есть инструменты отладки. Скрипты сохраняются в файлах с расширением .ps1. Но запустить их двойным кликом не получится — нужно нажать правую кнопку мыши и в появившемся окне выбрать Выполнить с помощью PowerShell.
Также запустить скрипт можно из оболочки. Например, в каталоге C:\Scripts есть файл test_script.ps1. Выполнить его можно:
- командой PowerShell -File C:\Scripts\test_script.ps1, запущенной из любого места;
- командой .\test_script.ps1, запущенной, когда вы находитесь в каталоге C:\Scripts.
По умолчанию запускать любые файлы с PowerShell-скриптами запрещено. Сделано это в целях безопасности. Узнать нынешнюю политику выполнения можно с помощью командлета Get-ExecutionPolicy. Вот какая она может быть:
- Restricted (установлена по умолчанию) — запрещено запускать любые скрипты.
- AllSigned — разрешено запускать только скрипты, которые были подписаны доверенным разработчиком.
- RemoteSigned — разрешено запускать подписанные доверенным разработчиком и собственные скрипты.
- Unrestricted — разрешено запускать любые скрипты.
Чтобы ваши ps1-файлы запускались, нужно заменить политику выполнения на RemoteSigned. Для этого откройте PowerShell от имени администратора и выполните команду:
Set-ExecutionPolicy RemoteSigned
Чтобы подтвердить действие, введите y.
Чтобы сохранять данные и обращаться к ним в будущем, в PowerShell есть переменные. Перед их названием ставится знак доллара $, а сами они могут содержать латинские буквы (заглавные и строчные), цифры и нижние подчёркивания.
Переменная может хранить данные любого типа, и их можно перезаписывать.
Переменную можно привести к определённому типу данных. Создадим переменную со строкой 2023 и преобразуем её в число. Чтобы узнать тип данных, воспользуемся методом .GetType().
Чтобы удалить переменную, используется метод .Clear().
Переменные можно подставлять в строки, если они оформлены двойными кавычками. Если же кавычки одинарные, то PowerShell воспринимает символы в строке буквально. Сравните:
Помимо пользовательских также есть системные переменные. Например, $PSVersionTable хранит информацию о версии PowerShell.
PowerShell позволяет проводить с объектами арифметические операции и сравнивать их друг с другом. Для этого он использует логические операторы.
Арифметические операторы:
- + — сложение;
- — — вычитание;
- * — умножение;
- / — деление;
- % — деление по модулю;
- ( и ) — скобки для группировки операций.
Операторы сравнения оформляются так же, как параметры командлетов. Их названия произошли от английских выражений, указанных в скобках.
- -eq — равно (от equal);
- -ne — не равно (от not equal);
- -gt — больше (от greater than);
- -ge — больше либо равно (от greater than or equal);
- -lt — меньше (от less than);
- -le — меньше либо равно (от less than or equal).
Условия в PowerShell создаются с помощью ключевых слов if, elseif и else. В обычных скобках указывается само условие, в фигурных — код, который запускается при его выполнении. Например:
$Number = 123 if ($Number -gt 0) { Write-Host 'Число больше нуля' } elseif ($Number -lt 0) { Write-Host 'Число меньше нуля' } else { Write-Host 'Число равно нулю' } >>> Число больше нуля
Также условия можно задавать с помощью ключевого слова switch. Например:
$Day = 2 switch ($Day) { 1 {Write-Host 'Понедельник'} 2 {Write-Host 'Вторник'} 3 {Write-Host 'Среда'} 4 {Write-Host 'Четверг'} 5 {Write-Host 'Пятница'} 6 {Write-Host 'Суббота'} 7 {Write-Host 'Воскресенье'} } >>> Вторник
Windows PowerShell — язык программирования, на котором администрируют операционные системы и автоматизируют процессы. Он поддерживает объектно-ориентированное программирование и позволяет работать в интерактивном режиме, а также писать, сохранять и выполнять полноценные скрипты.
- PowerShell предустановлен в Windows, но его можно скачать на macOS и Linux.
- У языка есть собственная интегрированная среда сценариев PowerShell ISE, предназначенная для старых версий языка (5.1 и ниже).
- PowerShell работает не со строками, а с объектами. Он обрабатывает их с помощью командлетов, построенных по принципу «Глагол-Существительное».
- Результат выполнения одного командлета можно передавать другому в конвейере.
- Задачи можно выполнять в фоновом режиме.
- PowerShell — высокоуровневый язык, на котором можно работать с переменными, логическими операторами, условиями, циклами, массивами, хеш-таблицами, функциями и классами.
С чего начать путь в IT?
Получите подробный гайд в нашем телеграм-канале бесплатно! Кликайте по баннеру и заходите в канал — вы найдёте путеводитель в закрепе.
Забрать гайд>