В PowerShell таблица не помещается на экран — как исправить (РЕШЕНО)

Некоторые командлеты по умолчанию выводят данные в очень широких таблицах. К примеру, посмотрите на этот вывод следующей команды, которая получает информацию о дисках:

Get-Disk

Такое ощущение, что произошла какая-то ошибка. Данные фактически не читаемы.

Попробуем развернуть окно терминала, сделав его более широким и вновь повторим команду.

Стало заметно лучше. Но, думаю, вы уже оценили неудобство этого метода, глядя на скриншот экрана, который кажется мелким. Почти всё место занимает абсолютно пустое пространство между вторым и третьим столбцами — данные хоть и читаемы, но выглядят непрезентабильно.

Для того, чтобы таблица подгоняла размер столбцов и эффективно использовала пространство экрана явно укажите командлет Format-Table (даже если данные и так выводятся в таблице) и опцию -AutoSize, например:

Get-Disk | Format-Table -AutoSize

Теперь действительно выглядит хорошо!

Как сделать так, чтобы данные в таблице не обрезались

Посмотрите на вывод следующей команды:

Get-Host | Format-Table

Как минимум в последнем столбце данные обрезаны.

Как вывести данные целиком, чтобы они переходили на следующую строку столбца, а не обрезались?

Иногда, если таблица неэффективно расходует пространство, достаточно указать опцию -AutoSize и данные могут поместиться на экран.

Но также имеется опция -Wrap, которая гарантирует, что данные любого размера не будут обрезаны и обязательно поместятся на экране.

Get-Host | Format-Table -Wrap

Итак, используя опцию -AutoSize вы сможете сделать так, что ваша таблица будет выглядеть более компактной и эффективно использовать место на экране, а опция -Wrap сделает так, чтобы длинные строки таблицы не обрезались.

Рекомендуется Вам:

Как узнать размер свободного и занятого пространства диска в PowerShell

Get-Volume для просмотра свойств логических разделов дисков

Просмотреть объём свободного и занятого места каждого логического диска вы можете командлетом

Get-Volume

Значение полей следующее:

  • DriveLetter — буква диска (или тома)
  • FriendlyName — метка диска
  • FileSystemType — тип файловой системы
  • DriveType — тип диска (Fixed это постоянный диск, а Removable это съёмный диск, например, внешний USB диск или флешка)
  • HealthStatus — статус здоровья
  • OperationalStatus — статус работы
  • SizeRemaining — оставшийся размер (свободное место на диске)
  • Size — общий размер диска

Как узнать количество свободного места на определённом диске

Вы можете получить информацию о конкретном диске, для этого укажите его букву с опцией -DriveLetter:

Get-Volume -DriveLetter C

Как вывести только размер свободного места на диске

Если вам нужен только данные о свободном месте на диске, то используйте следующую конструкцию:

(Get-Volume -DriveLetter C).SizeRemaining

Предыдущая команда выведет размер свободной области к байтах, чтобы перевести в гигабайты и терабайты используйте следующие конструкции (не забудьте указать букву интересующего вас диска вместо «C»):

(Get-Volume -DriveLetter C).SizeRemaining/1GB
(Get-Volume -DriveLetter C).SizeRemaining/1TB

Как просмотреть размер неразмеченных дисков

Диски с неразмеченными областями, например, новые диски или диски с неподдерживаемой файловой системой (например диски Linux) не отображаются предыдущими командами.

Смотрите также: Почему Windows не видит новый диск

Для просмотра размера всех дисков, в том числе без буквы, используйте команду:

Get-Disk

Вы увидите общий размер дисков, даже если они ещё не размечены.

Get-PSDrive – универсальный командлет для просмотра свойств всех типов дисков

Командлет Get-PSDrive получает диски в текущем сеансе. Вы можете получить конкретный диск или все диски в сеансе.

Этот командлет получает следующие типы дисков:

  • Логические диски Windows на компьютере, включая диски, подключённые к общим сетевым ресурсам.
  • Диски, предоставляемые поставщиками PowerShell (например, диски Certificate:, Function:, и Alias:), а также диски HKLM: и HKCU:, предоставляемые поставщиком реестра Windows PowerShell.
  • Временные диски, указанные в сеансе, и постоянные подключённые сетевые диски, которые вы создаёте с помощью командлета New-PSDrive.

Начиная с Windows PowerShell 3.0, параметр Persist командлета New-PSDrive может создавать подключённые сетевые диски, которые сохраняются на локальном компьютере и доступны в других сеансах.

Кроме того, начиная с Windows PowerShell 3.0, когда к компьютеру подключается внешний диск, Windows PowerShell автоматически добавляет PSDrive в файловую систему, представляющую новый диск. Вам не нужно перезапускать Windows PowerShell. Точно так же, когда внешний диск отключается от компьютера, Windows PowerShell автоматически удаляет PSDrive, представляющий удалённый диск.

Итак, запустим Get-PSDrive без опций:

Get-PSDrive

Вывод довольно обширный, возможно не вся информация вам требуется.

Для сокращения выводимых данных можно указать интересующий диск:

Get-PSDrive C

Теперь проще разобраться и найти интересующие поля, связанные с количеством занятого и свободного пространства на диске:

  • Used — использовано места на диске
  • Free — свободно места на диске

Чтобы вывести информацию только о дисках файловой системы, используйте команду:

Get-PSDrive -PSProvider FileSystem

Чтобы вывести только информацию об используемом и свободном пространстве определённого диска выполните команду:

Get-PSDrive C | Select-Object Used,Free

Чтобы сделать вывод более читаемым (выведет только количество свободного пространства на диске):

Get-PSDrive C | Select-Object @{Expression={$_.Free/1GB}}

Следующая команда выведет количество свободного и используемого пространства на диске:

Get-PSDrive C | Select-Object @{Expression={$_.Free/1GB}},@{Expression={$_.Used/1GB}}

Для получения информации об используемом и свободном пространстве диска удалённого компьютера используйте следующую команду (необходим Powershell Remoting):

Invoke-Command -ComputerName SRV2 {Get-PSDrive C} | Select-Object PSComputerName,Used,Free

Рекомендуется Вам:

Замена chkdsk в PowerShell для исправления ошибок диска

В PowerShell исправить ошибки на диске можно с помощью командлета Repair-Volume, который является преемником утилиты chkdsk.

Исправление повреждённой файловой системы старым способом

При рабоче с компьютерами вы, вероятно, сталкивались с проблемами жёстких дисков, битыми секторами, невозможностью загрузить операционной систему и прочими неприятностями, вызванными ошибками постоянного хранилища. Эффект от ошибок диска может быть любым — от подвисаний компьютера и замедления производительности до невозможности загрузиться в операционную систему.

С 1981 года chkdsk является встроенной утилитой Microsoft для сканирования и исправления диска. Под «исправлением» я не имею в виду, что он может физически восстановить сам диск, а означает проверку целостности файловой системы и исправление любых логических ошибок файловой системы.

Хотя chkdsk по-прежнему доступен в Windows сегодня, в Windows Server 2012 в PowerShell был представлен командлет Repair-Volume.

Repair-Volume

Как следует из названия командлета, Repair-Volume выполняет ремонт тома. Он поставляется с опциями, соответствующими существующим возможностям chkdsk.

ПРИМЕЧАНИЕ. Repair-Volume необходимо запускать из сеанса с повышенными привилегиями (также известного как администратор).

Связанная статья: Как запустить PowerShell с правами администратора

Проверка диска на ошибки без их исправления

Чтобы предотвратить нарушение доступности тома, вы можете сканировать том, не пытаясь его восстановить.

Repair-Volume -DriveLetter C -Scan

Вместо «C» укажите букву диска, который вы хотите проверить на ошибки.

Все обнаруженные повреждения добавляются в системный файл $corrupt. Это эквивалентно запуску

chkdsk /scan

Если ошибок не найдено, то будет выведено сообщение:

NoErrorsFound

Если имеются ошибки диска, то вы увидите сообщение о ремонте тома файловой системы:

Repairing volume [Running]

В моём случае я получил сообщение о том, что сканирование завершилось неудачно:

Repair-Volume: The scan failed
Activity ID: {ca1936ba-7134-4000-9c8a-35f461fe1c87}

Также пришло уведомление:

Перезагрузите, чтобы устранить ошибки диска
Щёлкните, чтобы перезагрузить компьютер

При следующем включении компьютера выводится сообщение, что будет проверен диск, если вы хотите пропустить проверку и исправление ошибок на диске, то нажмите любую клавишу.

Началась проверка диска:

Всего было пройдено три стадии проверки диска:

При повторном запуске Repair-Volume ошибок найдено не было.

Как устранить проблемы, зарегистрированные в системном файле $corrupt

Так что же делать, если при сканировании обнаруживаются ошибки и они добавлены в системный файл $corrupt? Вы можете использовать опцию -SpotFix для отключения тома на время, которое необходимо для исправления выявленных ошибок.

Repair-Volume -DriveLetter C -SpotFix

Это эквивалентно запуску

chkdsk /spotfix

Отключение тома для полного сканирования и исправления ошибок

Если у вас серьёзные проблемы с повреждением файловой системы, то попробуйте полное сканирование и исправление любых ошибок, найденных в процессе сканирования. Программа при этом отключит диск, что сделает его использование невозможным на время сканирования. Это требует больше всего времени, но также является наиболее эффективным.

Repair-Volume -DriveLetter C -OfflineScanAndFix

Это эквивалентно запуску

chkdsk /f

Восстановите несколько томов с помощью одной команды

Если вы хотите сканировать более одного тома, вы можете указать несколько букв дисков в параметре -DriveLetter. Например, если на вашем компьютере есть диски C, D и E, укажите CDE:

Repair-Volume -DriveLetter CDE -Scan

Как восстановить тома, которым не присвоена буква диска

Не всем томам назначен буквенный диск. Например, у вас может быть системный раздел или раздел восстановления. Вы можете запустить Repair-Volume для этих томов с помощью параметра -FileSystemLabel.

Чтобы узнать, FileSystemLabel, выполните следующую команду:

Get-Volume

Вывод:

DriveLetter FriendlyName             FileSystemType DriveType HealthStatus OperationalStatus SizeRemaining      Size
----------- ------------             -------------- --------- ------------ ----------------- -------------      ----
            System Reserved          NTFS           Fixed     Healthy      OK                    178.47 MB    550 MB
C           Contoso - C              NTFS           Fixed     Healthy      OK                     41.28 GB  98.89 GB
                                     NTFS           Fixed     Healthy      OK                     89.03 MB    481 MB
                                     FAT32          Fixed     Healthy      OK                      70.8 MB     96 MB
D           Contoso - D              NTFS           Fixed     Healthy      OK                     29.13 GB  67.68 GB
E           Contoso - E              NTFS           Fixed     Healthy      OK                    148.44 GB 465.76 GB
F           Archives                 NTFS           Fixed     Healthy      OK                    324.13 GB 465.76 GB

В столбце FriendlyName вы увидите имя, которое нужно указать с опцией -FileSystemLabel.

Запуск исправления:

Repair-Volume -FileSystemLabel "System Reserved" -OfflineScanAndFix

В этом примере том System Reserved переводится в автономный режим и устраняются все проблемы. Этому тому не присвоены буквы дисков. Первая команда Get-Volume даёт обзор томов на локальном компьютере. Как видно из выходных данных, том с меткой «System Reserved» не имеет букв дисков. Затем командлет Repair-Volume использует переключатель -FileSystemLabel для указания тома «System Reserved», а переключатель -OfflineScanAndFix указывает, что том должен быть переведён в автономный режим и просканирован полностью.

Как восстановить тома на удалённом компьютере

Если вы можете установить сеанс CIM на удалённый компьютер, и затем вы можете использовать параметр -CIMSession в Repair-Volume для удалённого выполнения действий по восстановлению.

Доступны не все функции chkdsk

Хотя, возможно, самые популярные функции chkdsk доступны с Repair-Volume, беглый взгляд на

chkdsk /?

покажет некоторые менее используемые и более детализированные элементы управления, которые НЕ доступны в Repair-Volume. Однако для большинства стандартных случаев использования Repair-Volume является адекватной заменой PowerShell традиционному инструменту командной строки chkdsk.

Опции CHKDSK

Использование:

CHKDSK [том[[путь]имя_файла]]] [/F] [/V] [/R] [/X] [/I] [/C] [/L[:размер]] [/B] [/scan] [/spotfix]

Опции:

  том                 Буква диска (с двоеточием после нее),
                      точка подключения или имя тома.
  имя_файла            Файлы, проверяемые на наличие
                      фрагментации (только FAT/FAT32).
  /F                  Исправляет ошибки на диске.
  /V                  Для FAT/FAT32: выводит полный путь и имя каждого файла
                      на диске.
                      Для NTFS: выводит сообщения об очистке (при их наличии).
  /R                  Ищет поврежденные сектора и восстанавливает уцелевшую
                      информацию (требует /F, когда не указан параметр /scan).
  /L:size           Только для NTFS:  задает размер файла журнала (в КБ).
                      Если размер не указан, выводится
                      текущее значение.
  /X                  Предварительно отключает том (при необходимости).
                      Все открытые дескрипторы для этого тома станут
                      недопустимы (требует /F)
  /I                  Только для NTFS: выполняет менее строгую проверку элементов
                      индекса.
  /C                  Только для NTFS: пропускает проверку циклов внутри
                      структуры папок.
  /B                  Только для NTFS: повторно оценивает поврежденные кластеры в томе
                      (требует /R).
  /scan               Только для NTFS: выполняет оперативное сканирование тома
  /forceofflinefix    Только для NTFS (необходимо использовать со "/scan"):
                      обходит восстановление в подключенном состоянии; все найденные неполадки
                      добавляются в очередь для восстановления в автономном режиме (т. е. "chkdsk /spotfix").
  /perf               Только для NTFS (необходимо использовать со "/scan")
                      использует больше системных ресурсов для скорейшего выполнения
                      сканирования. Это может отрицательно повлиять
                      на производительность других задач, выполняемых в системе.
  /spotfix            Только для NTFS: точечно исправляет ошибки в томе
  /sdcleanup          Только для NTFS: собирает ненужные данные дескриптора безопасности в качестве
                      мусора (требует /F).
  /offlinescanandfix  Запускает автономную проверку и исправление тома.
  /freeorphanedchains Только для FAT/FAT32/exFAT: освобождает потерянные цепочки кластеров
                      вместо восстановления их содержимого.
  /markclean          Только для FAT/FAT32/exFAT: помечает том как чистый, если не
                      были обнаружены повреждения, даже если параметр /F не задан.

Параметр /I или /C сокращает время выполнения Chkdsk за счёт пропуска некоторых проверок тома.

Рекомендуется Вам:

Регулярные выражения в PowerShell

[!ПРИМЕЧАНИЕ] Эта статья покажет вам синтаксис и методы использования регулярных выражений в PowerShell, в ней обсуждается не весь синтаксис. Более полную информацию о регулярных выражениях вы сможете найти в статьях:

Регулярное выражение — это шаблон, используемый для поиска совпадений в тексте. Оно может состоять из буквальных символов, операторов и других конструкций.

В этой статье демонстрируется синтаксис регулярных выражений в PowerShell. PowerShell имеет несколько операторов и командлетов, использующих регулярные выражения. Вы можете узнать больше об их синтаксисе и использовании по ссылкам ниже.

Регулярные выражения PowerShell по умолчанию не чувствительны к регистру. У каждого метода, показанного выше, есть свой способ принудительного учёта регистра.

Метод Чувствительность к регистру
Select-String Используйте переключатель -CaseSensitive
Выражение switch Используйте опцию -casesensitive
Операторы Префикс с 'C' (-cmatch, -csplit, или -creplace)

Символьные литералы

Регулярное выражение может быть буквальным символом или строкой. Текст считается совпавшим с регулярным выражением, если в нём встречается точное вхождение указанной последовательности символов.

Этот оператор возвращает истину, потому что «book» содержит строку «oo»:

'book' -match 'oo'

Классы символов

В то время как символьные литералы работают, если вы знаете точный шаблон, символьные классы позволяют вам быть менее конкретными.

Группы символов

[группа символов] позволяет вам сопоставить любое количество символов на одной позиции, в то время как [^группа символов] соответствует только символам, НЕ входящим в группу.

Следующее выражение вернёт истину, если шаблон найдёт big, bog или bug.

'big' -match 'b[iou]g'

Если ваш список символов для сопоставления включает символ дефиса (-), он должен быть в начале или в конце списка, чтобы отличить его от выражения диапазона символов.

Диапазоны символов

В качестве части шаблона также можно указать диапазон набора символов. Символы могут быть буквенными [A-Z], числовыми [0-9] или даже основанными на ASCII [ -~] (все печатные символы).

Выражение вернёт истину, поскольку шаблон соответствует любому двухзначному числу:

42 -match '[0-9][0-9]'

Числа

У некоторых часто используемых диапазонов есть свои собственные обозначения. Обозначение \d соответствует любой десятичной цифре. И наоборот, \D соответствует любой не десятичной цифре.

Это выражение соответствует именам в диапазоне Server-01 — Server-99, поэтому выражение вернёт истину:

'Server-01' -match 'Server-\d\d'

Следующая запись по значению идентична предыдущей:

'Server-01' -match 'Server-[0-9][0-9]'

Обозначение слова

Класс символов \w обозначает слово [a-zA-Z_0-9], то есть это любая последовательность из букв, цифр и нижнего подчёркивания. Для обозначения не-слова используется \W.

Это выражение вернёт истину. Этот шаблон (регулярное выражение) совпадёт с первым символом «B»:

'Book' -match '\w'

Найденные совпадения сохраняются в переменную $Matches, поэтому вы можете проверять, какая именно строка совпала с регулярным выражением:

'Server-01' -match '\w'
$Matches
'Server-01' -match '\W'
$Matches

Подстановочные знаки

Точка (.) – это подстановочный знак в регулярных выражениях. Она будет соответствовать любому одному символу, кроме новой строки (\n).

Это выражение возвращает истину. Шаблон соответствует любым 4 символам, кроме символа новой строки.

'a1\ ' -match '....'

Белый пробел

Белый пробел (соответствует пробелу, вертикальному и горизонтальному Tab, символу Newline и некоторым другим аналогичным символам) обозначается как \s. Любой непробельный символ обозначается как \S. Также можно использовать буквальные символы пробела ' '.

Это выражение возвращает истину. В шаблоне используются оба метода для сопоставления пробела (условное обозначение класса символов и буквальный пробел):

' - ' -match '\s- '

Квантификаторы

Квантификаторы контролируют, сколько экземпляров каждого элемента должно присутствовать во входной строке.

Ниже приведены некоторые из квантификаторов, доступных в PowerShell:

Квантификатор Описание
* Ноль или более раз.
+ Один или более раз.
? Ноль или один раз.
{n,m} По меньшей мере n, но не более чем m раз.

Звёздочка (*) соответствует предыдущему элементу ноль или более раз. В результате совпадением будет даже для пустой строки.

Следующее выражение возвращает истину для всех строк имени учётной записи, даже если имя отсутствует.

'ACCOUNT NAME: Administrator' -match 'ACCOUNT NAME:\s*\w*'

Знак плюс (+) соответствует предыдущему элементу один или несколько раз.

Следующее выражение возвращает истину, поскольку введённое имя соответствует шаблону: имя начинается с одной или более заглавной буквы, затем идёт дефис, затем две цифры.

'DC-01' -match '[A-Z]+-\d\d'

Знак вопроса (?) соответствует предыдущему элементу ноль или один раз. Как и звёздочка *, он будет соответствовать даже строкам, в которых отсутствует элемент.

Следующее выражение возвращает истину, поскольку введённое имя соответствует шаблону: имя начинается с одной или более заглавной буквы, затем идёт дефис, который может и отсутствовать, затем две цифры.

'SERVER01' -match '[A-Z]+-?\d\d'

Квантификатор {n, m} может использоваться несколькими различными способами для обеспечения детального контроля над количеством. Второй элемент m и запятая необязательны.

Квантификатор Описание
{n} Совпадение ТОЧНО n число раз.
{n,} Совпадение ПО КРАЙНЕЙ МЕРЕ n число раз.
{n,m} Совпадение между n и m числом раз.

Следующий шаблон означает: цифра ровно три раза, затем дефис, затем цифра ровно три раза, затем дефис, затем цифра ровно четыре раза:

'111-222-3333' -match '\d{3}-\d{3}-\d{4}'

Якоря (анкоры)

Якоря указывают на начало и конец строки.

Два обычно используемых якоря — это «^» и «$.» Каретка (^) соответствует началу строки, а знак доллара ($) соответствует концу строки. Якоря позволяют сопоставить текст в определённой позиции, а также отбросить ненужные символы.

Шаблон в следующем примере предполагает, что за буквой h будет стоять конец слова. Это выражение вернёт ЛОЖЬ.

'fishing' -match '^fish$'

[!ПРИМЕЧАНИЕ] При определении регулярного выражения, содержащего привязку $, обязательно заключите регулярное выражение в одинарные кавычки (') вместо двойных кавычек ("), иначе PowerShell будет трактовать выражение как переменную.

При использовании якорей в PowerShell вы должны понимать разницу между параметрами регулярных выражений SINGLELINE и MULTILINE.

  • MULTILINE: в многострочном режиме символы ^ и $ должны совпадать с началом и концом каждой СТРОКИ, а не с началом и концом входной строки.
  • SINGLELINE: однострочный режим обрабатывает входную строку как ЕДИНУЮ СТРОКУ. Это заставляет символ точки (.) соответствия каждому символу (включая символы новой строки) вместо поведения по умолчанию, которое заключается в следующем: точка соответствует любому символу, ЗА ИСКЛЮЧЕНИЕМ новой строки \n.

Экранирование специальных символов

Обратная косая черта (\) используется для экранирования символов, при её использовании специальные символы в регулярном выражении начинают трактоваться как буквальные символы.

Следующие символы зарезервированы и имеют специальное значение в шаблоне регулярного выражения: []().\^$|?*+{}

Вам нужно будет экранировать эти символы в ваших шаблонах, если вы хотите, чтобы они искались во входящих данных как буквальные символы.

Следующее выражение возвращает истину и соответствует числам с точностью не менее 2 цифр. Десятичная точка экранируется с помощью обратной косой черты, то есть при такой записи точка больше не означает «любой символ», экранированная точка означает «буквальная точка».

'3.141' -match '3\.\d{2,}'

Существует статический метод класса регулярных выражений, который может экранировать текст за вас.

[regex]::escape('3.\d{2,}')

Будет выведено регулярное выражение с экранированными специальными символами:

3\.\\d\{2,}

[!ПРИМЕЧАНИЕ] Этот метод экранирует все зарезервированные символы регулярных выражений, включая присутствующие обратные косые черты, используемые в классах символов. Обязательно используйте его только на той части шаблона, которую вам нужно экранировать.

Обратите внимание, что этот метод сработал странно: экранировал точку, затем экранировал косую черту, являющуюся частью обозначения класса цифры (\d), затем, почему-то, экранировал одну фигурную скобу, но не экранировал другую. В общем, лучше не использовать этот метод.

Экранирование других символов

Существуют также зарезервированные escape-символы, которые можно использовать для соответствия специальным типам символов.

Ниже приведены несколько наиболее часто используемых escape-символов:

Экранированный символ Описание
\t Соответствует tab
\n Соответствует newline
\r Соответствует возврату каретки (carriage return)

Группы, захваты и подстановки

Конструкции группирования разделяют входную строку на подстроки, которые можно использовать в этом же регулярном выражении или игнорировать. Сгруппированные подстроки называются подвыражениями. По умолчанию подвыражения записываются в пронумерованные группы, хотя вы также можете присвоить им имена.

Группирующая конструкция — это регулярное выражение, заключённое в круглые скобки. Любой текст, совпадающий с заключённым в него регулярным выражением, захватывается. В следующем примере вводимый текст разбивается на две группы захвата.

'The last logged on user was CONTOSO\jsmith' -match '(.+was )(.+)'
True

Используйте автоматическую переменную $Matches для получения захваченного текста. Текст, представляющий всё совпадение, сохраняется под ключом 0.

$Matches.0
The last logged on user was CONTOSO\jsmith

Захваты сохраняются в числовых ключах INTEGER, которые увеличиваются слева направо. Захват 1 содержит весь текст до имени пользователя, захват 2 содержит только имя пользователя.

$Matches
    Name                           Value
    ----                           -----
    2                              CONTOSO\jsmith
    1                              The last logged on user was
    0                              The last logged on user was CONTOSO\jsmith

[!ВАЖНО] Ключ 0 — это ЦЕЛОЕ число. Вы можете использовать любой метод HASHTABLE для доступа к сохранённому значению.

'Good Dog' -match 'Dog'
True

$Matches[0]
Dog

$Matches.Item(0)
Dog

$Matches.0
Dog

Именованные захваты

По умолчанию захваты хранятся в возрастающем числовом порядке слева направо. Вы также можете назначить ИМЯ группе захвата. Это ИМЯ становится ключом в автоматической переменной $Matches.

Внутри группы захвата используйте ?<keyname> для хранения захваченных данных под именованным ключом.

$string = 'The last logged on user was CONTOSO\jsmith'
$string -match 'was (?<domain>.+)\\(?<user>.+)'
True

$Matches

    Name                           Value
    ----                           -----
    domain                         CONTOSO
    user                           jsmith
    0                              was CONTOSO\jsmith

$Matches.domain
CONTOSO

$Matches.user
jsmith

В следующем примере сохраняется последняя запись журнала в журнале безопасности Windows. Предоставленное регулярное выражение извлекает имя пользователя и домен из сообщения и сохраняет их под ключами: N для имени и D для домена.

$log = (Get-WinEvent -LogName Security -MaxEvents 1).message
$r = '(?s).*Account Name:\s*(?<N>.*).*Account Domain:\s*(?<D>[A-Z,0-9]*)'
$log -match $r
True

$Matches

    Name                           Value
    ----                           -----
    D                              CONTOSO
    N                              jsmith
    0                              A process has exited....

Подстановки в регулярных выражениях

Использование регулярных выражений с оператором -replace позволяет динамически заменять текст с помощью захваченного текста.

ВВОД -replace ОРИГИНАЛ, ПОДСТАНОВКА

Здесь:

  • ВВОД: строка по которой выполняется поиск
  • ОРИГИНАЛ: регулярное выражение, используемое для поиска входной строки.
  • ПОДСТАНОВКА: выражение подстановки для замены совпадения, найденные во входной строке.

[! ПРИМЕЧАНИЕ] Операнды ОРИГИНАЛ и ПОДСТАНОВКА подчиняются правилам обработчика регулярных выражений, таким как экранирование символов.

На группы захвата можно ссылаться в строке ПОДСТАНОВКА. Замена выполняется с помощью символа $ перед идентификатором группы.

Два способа ссылаться на группы захвата – по НОМЕРУ и по ИМЕНИ.

  • По НОМЕРУ - Группы захвата нумеруются слева направо.
'John D. Smith' -replace '(\w+) (\w+)\. (\w+)', '$1.$2.$3@contoso.com'
John.D.Smith@contoso.com
  • По ИМЕНИ — На группы захвата также можно ссылаться по имени.
'CONTOSO\Administrator' -replace '\w+\\(?<user>\w+)', 'FABRIKAM\${user}'
FABRIKAM\Administrator

Выражение $& представляет весь совпавший текст:

'Gobble' -replace 'Gobble', '$& $&'
Gobble Gobble

[!ПРЕДУПРЕЖДЕНИЕ] Поскольку символ $ имеет специальное значение, вам нужно использовать строки с одинарными кавычками, либо экранировать символ $ при использовании двойных кавычек.

'Hello World' -replace '(\w+) \w+', '$1 Universe'
Hello Universe

"Hello World" -replace "(\w+) \w+", "`$1 Universe"
Hello Universe

Кроме того, если вы хотите использовать символ $ в качестве буквального символа, используйте $$ вместо обычных escape-символов. При использовании двойных кавычек всё равно экранируйте все экземпляры $, чтобы избежать неправильной трактовки.

'5.72' -replace '(.+)', '$$$1'
$5.72

"5.72" -replace "(.+)", "`$`$`$1"
$5.72

Рекомендуется Вам:

Как в PowerShell просмотреть открытые порты UDP

В статье «Как в PowerShell просмотреть открытые порты. Как узнать, какая программа прослушивает порт» показано, как узнать открытые TCP-порты с помощью PowerShell. В отличие от команды netstat в DOS, Powershell разделяет TCP и UDP на две разные команды: Get-NetTCPConnection и Get-NetUDPEndpoint. Вот несколько примеров Get-NetUDPEndpoint.

Командлет Get-NetUDPEndpoint получает текущую статистику для конечной точки UDP. Командлет возвращает свойства конечной точки UDP, например локальные и удалённые порты UDP. Если вы не укажете никаких параметров, командлет получит статистику для всех конечных точек UDP.

Get-NetUDPEndpoint сам по себе вернёт локальный адрес и локальный порт.

Get-NetUDPEndpoint

Эта команда покажет открытые на всех сетевых интерфейсах UDP порты:

Get-NetUDPEndpoint | Where-Object {($_.LocalAddress -eq "0.0.0.0") -or ($_.LocalAddress -eq "::")}

Чтобы просмотреть идентификатор процесса-владельца, добавьте поле OwningProcess.

Get-NetUDPEndpoint | Select-Object LocalAddress,LocalPort,OwningProcess | Sort-Object -Property LocalPort | Format-Table

Используйте следующую команду, чтобы отобразить имя процесса, открывшего UDP порт:

Get-NetUDPEndpoint | Select-Object LocalAddress,LocalPort,OwningProcess,@{Name="Process";Expression={(Get-Process -Id $_.OwningProcess).ProcessName}} | Sort-Object -Property LocalPort | Format-Table

Рекомендуется Вам:

Как в PowerShell просмотреть открытые порты. Как узнать, какая программа прослушивает порт

Get-NetTCPConnection — это PowerShell-эквивалент NETSTAT, запуск команды без опций возвращает результат аналогичный netstat.

Get-NetTcpConnection

Чтобы вывести список открытых портов, используйте опцию -State со значением Listen:

Get-NetTcpConnection -State Listen

Список открытых портов содержится в колонке LocalPort, запись «0.0.0.0» означает IPv4 адреса, а обозначение «::» относится к IPv6 адресам.

Смотрите также: Как проверить открытые порты на своём компьютере. Что означают 0.0.0.0, :*, [::], 127.0.0.1. Как понять вывод NETSTAT

В следующей команде выводятся только действительно интересные свойства, также сделана сортировка по номеру открытых портов:

Get-NetTcpConnection -State Listen | Select-Object LocalAddress,LocalPort,OwningProcess | Sort-Object -Property LocalPort | Format-Table

Как в PowerShell узнать, какая программа прослушивает порт

В этом примере будет получено имя процесса, связанного с каждым открытым портом:

Get-NetTcpConnection -State Listen | Select-Object LocalAddress,LocalPort,OwningProcess,@{Name="Process";Expression={(Get-Process -Id $_.OwningProcess).ProcessName}} | Sort-Object -Property LocalPort | Format-Table

Чтобы узнать, какая именно программа прослушивает определённый порт, используйте следующий набор команд:

$port='80';
Get-NetTcpConnection -State Listen | Where-Object {$_.LocalPort -eq "$port"} | Select-Object LocalAddress,LocalPort,OwningProcess,@{Name="Process";Expression={(Get-Process -Id $_.OwningProcess).ProcessName}} | Sort-Object -Property LocalPort | Format-Table

Замените «80» в первой строке на порт, который вас интересует.

Смотрите также: Как в PowerShell просмотреть открытые порты UDP

Рекомендуется Вам:

Как выводить данные без таблицы в PowerShell

По умолчанию многие командлеты PowerShell выводят данные в виде отформатированной таблицы или списка, например:

Get-ChildItem

Набор выводимых данных не является исчерпывающим и вы можете изменить его — добавить или убрать столбцы таблицы, подробности об этом смотрите в статье «Как в PowerShell менять набор выводимых по умолчанию данных».

Но что если нам не нужна таблица, а нужные данные только из одного столбца и без форматирования? Например, мы хотим вывести (или сохранить в файл) только имена файлов и папок в директории.

Для обработки строк можно использовать командлет Set-Content. Рассмотрим следующий пример:

Get-ChildItem | Set-Content dir.txt
Get-Content dir.txt

Первая команда получает список файлов и папок в текущей папке и передаёт их командлету Set-Content для обработки и сохранения в файл dir.txt. Затем вторая команда показывает содержимое файла dir.txt:

В принципе, мы получили список файлов, но он содержит абсолютные пути. Но это не совсем то, что мы хотели.

Смотрите также: Командлеты Set-Content и Add-Content для обработки строк

Чтобы в точности получить нужное свойство (столбец таблицы) используйте конструкцию вида:

(КОМАНДЛЕТ).СВОЙСТВО

К примеру:

(Get-ChildItem).Name

Да, для командлета Get-ChildItem имеется опция -Name с помощью которой достигается точно такой же результат — выводятся только имена файлов. Но показанный выше метод является универсальным и позволяет выводить любое свойство минуя остальные данные:

(Get-ChildItem).Attributes
(Get-ChildItem).CreationTime
(Get-ChildItem).LastAccessTime

В скобках вы можете указывать опции командлетов, например:

(Get-Alias -Definition '*get*').Name

Также вы можете использовать в скобках конвейер:

(КОМАНДЛЕТ1 | КОМАНДЛЕТ2 | КОМАНДЛЕТ3 | КОМАНДЛЕТ4).СВОЙСТВО

Смотрите также: Как в PowerShell сохранить вывод в файл (аналоги > и >>)

Рекомендуется Вам:

Как в PowerShell менять набор выводимых по умолчанию данных

Какие столбцы таблицы в выводе командлета

Результат работы командлета зачастую выводится в виде таблицы с определённым набором полей.

К примеру следующая команда выведет список псевдонимов

Get-Alias

В выводе присутствуют четыре поля, три из которых в большинстве ситуаций бесполезны:

  • CommandType — тип команды, в выводе по умолчанию это всегда Alias
  • Name — ценное информационное поле, но в нём данные о псевдониме и команде скомканы в одну строку
  • Version — версия, обычно здесь пусто
  • Source — источник, аналогично, зачастую здесь пусто

Неужели это всё, что можно узнать о псевдонимах команды? На самом деле нет. Посмотрите на вывод следующей команды:

Get-Alias | Get-Member

Всего доступно аж 19 свойств для выводимых командлетом Get-Alias объектов:

  • CommandType
  • Definition
  • Description
  • Module
  • ModuleName
  • Name
  • Options
  • OutputType
  • Parameters
  • ParameterSets
  • ReferencedCommand
  • RemotingCapability
  • ResolvedCommand
  • Source
  • Version
  • Visibility
  • DisplayName
  • HelpUri
  • ResolvedCommandName

Среди них есть наверняка более полезные, чем три пустых столбца таблицы.

Результатом работы многих командлетов являются объекты

Нужно помнить, что хотя вывод многих командлетов представляется в виде таблицы, на самом деле результатом работы командлета является не таблица и не строки, зачастую результатом работы является объект.

Именно свойства этого объекта и показывает командлет Get-Member в команде вида:

КОМАНДЛЕТ | Get-Member

Если вы присваиваете вывод командлета переменной, то ей также передаётся именно объект, обладающий всем набором свойств. В дальнейшем вы можете работать с любыми свойствами данного объекта ссылаясь на переменную.

Но на вывод в консоль показывает отформатированную таблицу, которая строится исходя из части данных. Вы можете изменить набор данных, которые выводит командлет.

Какие свойства имеет командлет

Но чтобы изменить набор выводимых командлетом данных, нужно знать о имеющихся свойствах данного объекта. Вы можете это сделать командой вида:

КОМАНДЛЕТ | Get-Member -MemberType Property

Например, вывод всех свойств командлета Get-Alias:

Get-Alias | Get-Member -MemberType Property

Если вы хотите вывести только имена свойств, без построения таблицы, то используйте конструкцию вида:

(КОМАНДЛЕТ | Get-Member -MemberType Property).Name

Например:

(Get-Alias | Get-Member -MemberType Property).Name

Как изменить поля таблицы в выводе командлета

Итак, теперь, когда мы знаем свойства объекта, выводимого командлетом, мы можем установить свой собственный набор свойств для вывода. Это можно сделать командой вида:

КОМАНДЛЕТ | Format-Table -Property СВОЙСТВО1,СВОЙСТВО2,СВОЙСТВО3,СВОЙСТВО4,…...

Например, следующая команда выведет имя псевдонима и его значение в простой для восприятия таблице без лишних полей:

Get-Alias | Format-Table -Property Name,Definition

Возможно, вместо краткости вы захотите вывести больше полезных данных, примеры:

Get-Alias | Format-Table -Property Name,Definition,Options,Module,OutputType
Get-Alias | Format-Table -Property Name,Definition,Options,Parameters

Если данных действительно много и они не помещаются по ширине экрана, то вместо Format-Table используйте командлет Format-List, например:

Get-Alias | Format-List -Property Name,Definition,Options,Module,OutputType,Parameters

В результате вместо таблицы будет выведен список.

Выбор свойств объекта с Select-Object

Для выбора свойств объекта вы также можете использовать командлет Select-Object:

КОМАНДЛЕТ | Select-Object -Property СВОЙСТВО1,СВОЙСТВО2,СВОЙСТВО3,СВОЙСТВО4,… | Format-Table

Например, следующие команды дадут идентичный результат:

Get-Alias | Format-Table -Property Name,Definition
Get-Alias | Select-Object -Property Name,Definition | Format-Table

Командлет Select-Object может применяться не только для выбора свойств, но и для выбора объектов из нескольких. Кроме того, Select-Object возвращает новый объект, содержащий только выбранные свойства.

Опция -Property

Некоторые командлеты имеют опцию -Property которая позволяет выбирать, какие именно свойства вы хотите показать. Пример командлета с опцией -Property это Get-ComputerInfo:

Get-ComputerInfo -Property "CSManufacturer","CSModel","BiosBIOSVersion","BiosSMBIOSBIOSVersion" | Format-List

Пример изменения вывода командлета

Рассмотрим ещё один пример. Следующий командлет выводит список файлов и папок в указанном каталоге, если каталог не указан, то выводятся данные для текущей папки:

Get-ChildItem

К примеру, вместо времени последнего доступа, мы хотим узнать дату создания файла, а длину файла не выводить вовсе.

Для этого посмотрим на доступные для командлета Get-ChildItem свойства:

Get-ChildItem | Get-Member -MemberType Property

Обратите внимание, что выведено два набора свойства, поскольку командлет Get-ChildItem выводит объекты двух видов:

  • System.IO.DirectoryInfo (информация о директориях, то есть папках)
  • System.IO.FileInfo (информация о файлах)

Выберем нужные нам поля. Например, следующая команда покажет режим, имя и время создания файлов и папок:

Get-ChildItem | Format-Table -Property Mode,Name,CreationTime

Рекомендуется Вам:

Просмотр и поиск псевдонимов командлетов в PowerShell

PowerShell интенсивно использует псевдонимы, благодаря им вы можете ввести в командную строку «ls», «dir», «pwd», «cd» и другие популярные в Linux или в командной строке Windows команды и вместо ошибки получить ожидаемый результат.

Вы можете создавать и импортировать свои собственные псевдонимы — этому будет посвящена одна из последующих статей сайта pwsh.ru, в данной статье мы изучим, как вывести уже имеющиеся псевдонимы (их много!), а также как искать по псевдонимам и по командлетам.

Командлет Get-Alias выводит псевдонимы текущей сессии. Сюда входят встроенные псевдонимы, псевдонимы, которые вы установили или импортировали, а также псевдонимы, которые вы добавили в свой профиль PowerShell.

По умолчанию Get-Alias принимает псевдоним и возвращает имя команды. Когда вы используете параметр -Definition, Get-Alias принимает имя команды и возвращает её псевдонимы.

Начиная с Windows PowerShell 3.0, Get-Alias отображает псевдонимы без дефисов в формате ПСЕВДОНИМ -> ЗНАЧЕНИЕ, чтобы упростить поиск необходимой информации.

Как вывести все псевдонимы

Чтобы показать все имеющиеся псевдонимы, запустите следующую команду:

Get-Alias

Будут выведены следующие столбцы:

  • CommandType (тип команды, всегда «Alias»)
  • Name (имя, именно здесь записан псевдоним в формате «ПСЕВДОНИМ -> ЗНАЧЕНИЕ», например «clear -> Clear-Host»
  • Version (версия)
  • Source (источник)

Как искать по именам псевдонима

Для поиска по именам псевдонима укажите его имя, это можно сделать с опцией -Name или пропустив её. Также имена можно передавать по конвейеру, следующие команды идентичны:

Get-Alias -Name '*rm*'
Get-Alias '*rm*'
echo '*rm*' | Get-Alias

Как вы уже могли понять, подстановочные знаки разрешены.

Смотрите также: Подстановочные символы в PowerShell

Как узнать значение псевдонима

Если вы хотите узнать, что означает псевдоним «echo» или «rm» или любой другой, то укажите его точное значение не используя подстановочных знаков:

Get-Alias echo

Если вы хотите вывести только значение псевдонима, то используйте следующую конструкцию:

(Get-Alias ПСЕВДОНИМ).Definition

Например:

(Get-Alias echo).Definition

Как узнать все псевдонимы команды

С помощью опции -Definition вы можете узнать все псевдонимы указанного элемента. Вы можете указать имя командлета, функции, скрипта, файла или исполняемого файла.

Этот параметр называется -Definition, поскольку он ищет имя элемента в свойстве Definition объекта псевдонима.

Пример:

Get-Alias -Definition '*where*'

Если вы хотите вывести только псевдонимы, то используйте конструкцию вида:

(Get-Alias -Definition '*КОМАНДЛЕТ*').Name

Чтобы создать новый псевдоним, используйте Set-Alias или New-Alias. Чтобы удалить псевдоним, используйте Remove-Item.

Примеры использования Get-Alias

Пример 1: Вывести список всех псевдонимов в текущем сеансе

Get-Alias

    CommandType     Name
    -----------     ----
    Alias           % -> ForEach-Object
    Alias           ? -> Where-Object
    Alias           ac -> Add-Content
    Alias           asnp -> Add-PSSnapin
    Alias           cat -> Get-Content
    Alias           cd -> Set-Location
    Alias           chdir -> Set-Location
    Alias           clc -> Clear-Content
    Alias           clear -> Clear-Host
    Alias           clhy -> Clear-History
    ...

Эта команда получает все псевдонимы в текущем сеансе.

В выходных данных показан формат «ПСЕВДОНИМ -> ЗНАЧЕНИЕ», который был введён в Windows PowerShell 3.0. Этот формат используется только для псевдонимов, не содержащих дефисов, поскольку псевдонимы с дефисами обычно являются предпочтительными именами для командлетов и функций, а не псевдонимами.

Пример 2: Найти псевдонимы по имени

Get-Alias -Name gp*, sp* -Exclude *ps

Эта команда получает все псевдонимы, начинающиеся с gp или sp, за исключением псевдонимов, заканчивающихся на ps.

Пример 3: Узнать псевдонимы для командлета

Get-Alias -Definition Get-ChildItem

Эта команда получает псевдонимы для командлета Get-ChildItem.

По умолчанию командлет Get-Alias получает имя элемента, если известен псевдоним. Параметр -Definition получает псевдоним, если вы знаете имя элемента.

Пример 4: Получить псевдонимы по свойству

Get-Alias | Where-Object {$_.Options -Match "ReadOnly"}

Эта команда получает все псевдонимы, в которых значение свойства Options равно ReadOnly. Эта команда обеспечивает быстрый способ поиска псевдонимов, встроенных в PowerShell, поскольку у них у всех параметр ReadOnly.

Options — это лишь одно свойство объектов AliasInfo, которые получает Get-Alias. Чтобы найти все свойства и методы объектов AliasInfo, введите

Get-Alias | Get-Member

Пример 5. Поиск псевдонимов по имени и фильтрация по начальной букве

Get-Alias -Definition "*-PSSession" -Exclude e* -Scope Global

Этот пример получает псевдонимы для команд, имена которых заканчиваются на «-PSSession», за исключением тех, которые начинаются на «e».

Команда использует параметр -Scope для применения команды в глобальной области. Это полезно в сценариях, когда вы хотите получить псевдонимы в определённой сессии.

Рекомендуется Вам:

Операторы сравнения в PowerShell

Эта статья описывает операторы, сравнивающие значения в PowerShell.

Операторы сравнения позволяют указать условия для сравнения значений и поиска значений, соответствующих указанным шаблонам. Чтобы использовать оператор сравнения, укажите значения, которые вы хотите сравнить, вместе с оператором, разделяющим эти значения.

PowerShell включает следующие операторы сравнения:

Тип Операторы Описание
Равенство -eq Равно
-ne Не равно
-gt Больше чем
-ge Больше чем или равно
-lt Меньше чем
-le Меньше чем или равно
Совпадение -like Возвращает true (истина), когда строка совпадает с шаблоном из подстановочных символов
-notlike Возвращает true (истина), когда строка НЕ совпадает с шаблоном из подстановочных символов
-match Возвращает true (истина), когда строка совпадает с шаблоном регулярного выражения; переменная $matches содержит совпавшие строки
-notmatch Возвращает true (истина), когда строка НЕ совпадает с шаблоном регулярного выражения; переменная $matches содержит совпавшие строки
Содержимое -contains Возвращает истину, если ссылочное значение содержится в коллекции
-notcontains Возвращает истину, если ссылочное значение НЕ содержится в коллекции
-in Возвращает истину, если тестовое значение содержится в коллекции
-notin Возвращает истину, если тестовое значение НЕ содержится в коллекции
Замена -replace Заменяет по шаблону строки
Тип -is Возвращает истину, если оба объекта одного и того же типа
-isnot Возвращает истину, если оба объекта не одного и того же типа

По умолчанию все операторы сравнения нечувствительны к регистру. Чтобы сделать оператор сравнения чувствительным к регистру, перед именем оператора поставьте «c». Например, версия -eq с учётом регистра — это -ceq. Чтобы сделать регистронезависимость явной, поставьте перед оператором «i». Например, явно нечувствительна к регистру версия -eq — это -ieq.

Если входными данными оператора является скалярное значение, операторы сравнения возвращают логическое значение. Когда ввод представляет собой набор значений, операторы сравнения возвращают любые совпадающие значения. Если в коллекции нет совпадений, операторы сравнения возвращают пустой массив.

(1, 2 -eq 3).GetType().FullName
System.Object[]

Исключениями являются операторы Содержания, операторы In и операторы Типов, которые всегда возвращают значение типа BOOLEAN.

[! ПРИМЕЧАНИЕ] Если вам нужно сравнить значение с $null, вы должны поместить $null в левую часть сравнения. Когда вы сравниваете $null с OBJECT[], результатом будет ЛОЖЬ, потому что объект сравнения является массивом.

Когда вы сравниваете массив с $null, сравнение отфильтровывает любые значения $null, хранящиеся в массиве. Например:

$null -ne $null, "hello"
True

$null, "hello" -ne $null
hello

Операторы равенства

Операторы равенства (-eq, -ne) возвращают значение ИСТИНА или совпадения, когда одно или несколько входных значений идентичны указанному шаблону. Весь шаблон должен соответствовать целому значению.

Пример:

-eq

Описание: равно с. Включает идентичное значение.

Пример:

2 -eq 2
True

2 -eq 3
False

1,2,3 -eq 2
2

"abc" -eq "abc"
True

"abc" -eq "abc", "def"
False

"abc", "def" -eq "abc"
abc

  -ne

Описание: Не равно с. Включает отличное значение.

Примеры:

"abc" -ne "def"
True

"abc" -ne "abc"
False

"abc" -ne "abc", "def"
True

"abc", "def" -ne "abc"
def

-gt

Описание: Больше чем.

Примеры:

8 -gt 6
True

7, 8, 9 -gt 8
9

[! ПРИМЕЧАНИЕ] Его не следует путать с «>», оператором «больше», который используется во многих других языках программирования. В PowerShell «>» используется для перенаправления. Для получения дополнительной информации смотрите «Как в PowerShell сохранить вывод в файл (аналоги > и >>)».

-ge

Описание: Больше или равно.

Примеры:

8 -ge 8
True

7, 8, 9 -ge 8
8
9

-lt

Описание: Менее чем.

Примеры:

8 -lt 6
False

7, 8, 9 -lt 8
7

-le

Описание: меньше или равно.

Примеры:

6 -le 8
True

7, 8, 9 -le 8
7
8

Операторы совпадения

Операторы похожести (-like и -notlike) находят элементы, которые соответствуют или не соответствуют указанному шаблону, используя выражения с подстановочными знаками.

Синтаксис:

<string[]> -like <выражение-с-подстановочными-знаками>
<string[]> -notlike <выражение-с-подстановочными-знаками>

Смотрите также: Подстановочные символы в PowerShell

Операторы совпадения (-match и -notmatch) находят элементы, которые соответствуют или не соответствуют указанному шаблону, используя регулярные выражения.

Смотрите также: Регулярные выражения в PowerShell

Операторы совпадения заполняют автоматическую переменную $Matches, когда входные данные (левый аргумент) для оператора являются одним скалярным объектом. Когда вход является скалярным, операторы -match и -notmatch возвращают логическое значение и устанавливают значение автоматической переменной $Matches для совпавших компонентов аргумента.

Синтаксис:

<string[]> -match <регулярное-выражение>
<string[]> -notmatch <регулярное-выражение>

-like

Описание: совпадение выражению с подстановочными знаками (*).

Примеры:

"PowerShell" -like "*shell"
True

"PowerShell", "Server" -like "*shell"
PowerShell

-notlike

Описание: не совпадение выражению с подстановочными знаками (*).

Примеры:

"PowerShell" -notlike "*shell"
False

"PowerShell", "Server" -notlike "*shell"
Server

-match

Описание: совпадает с регулярным выражением. Когда вход является скалярным, он заполняет автоматическую переменную $Matches.

Смотрите также: Регулярные выражения в PowerShell

Операторы совпадения ищут только по строкам. Они не могут искать в массивах целых чисел или других объектах.

Если входом является коллекция, операторы -match и -notmatch возвращают соответствующие элементы этой коллекции, но оператор не заполняет переменную $Matches.

Например, следующая команда отправляет набор строк оператору -match. Оператор -match возвращает совпадающие элементы в коллекции. Он не заполняет автоматическую переменную $Matches.

"Sunday", "Monday", "Tuesday" -match "sun"
Sunday

$Matches

Напротив, следующая команда отправляет одну строку оператору -match. Оператор -match возвращает логическое значение и заполняет автоматическую переменную $Matches. Автоматическая переменная $Matches является HASHTABLE. Если группировка или захват не используются, заполняется только один ключ.

"Sunday" -match "sun"
    True

$Matches

    Name                           Value
    ----                           -----
    0                              Sun

Ключ 0 представляет весь совпавший текст. Дополнительные сведения о группировке и захвате с использованием регулярных выражений смотрите в разделе «Регулярные выражения в PowerShell».

Важно отметить, что хеш-таблица $Matches будет содержать только первое вхождение любого совпадению шаблона.

"Banana" -match "na"
    True

$Matches

    Name                           Value
    ----                           -----
    0                              na

[!ВАЖНО] Ключ 0 — это ЦЕЛОЕ число. Вы можете использовать любой метод HASHTABLE для доступа к сохранённому значению.

"Good Dog" -match "Dog"
True

$Matches[0]
Dog

$Matches.Item(0)
Dog

$Matches.0
Dog

Оператор -notmatch заполняет автоматическую переменную $Matches, когда вход является скалярным, а результат равен False, то есть, когда он обнаруживает совпадение.

"Sunday" -notmatch "rain"
    True

$matches


"Sunday" -notmatch "day"
    False

$matches

    Name                           Value
    ----                           -----
    0                              day

-notmatch

Описание: не соответствует строке. Использует регулярные выражения. Когда вход является скалярным, он заполняет автоматическую переменную $Matches.

Примеры:

"Sunday" -notmatch "sun"
    False

$matches
    Name Value
    ---- -----
    0    sun

"Sunday", "Monday" -notmatch "sun"
    Monday

Операторы содержимого

Операторы содержимого (-contains и -notcontains) аналогичны операторам равенства. Однако операторы содержимого всегда возвращают логическое значение, даже если ввод является коллекцией.

Кроме того, в отличие от операторов равенства, операторы содержимого возвращают значение, как только обнаруживают первое совпадение. Операторы равенства оценивают весь ввод, а затем возвращают все совпадения в коллекции.

-contains

Описание: Оператор содержимого. Сообщает, включает ли набор начальных значений одно тестовое значение. Всегда возвращает логическое значение. Возвращает ИСТИНА, только если тестовое значение точно соответствует хотя бы одному из начальных значений.

Когда тестовое значение является коллекцией, оператор -Contains использует ссылочное равенство. Он возвращает ИСТИНА только в том случае, если одно из начальных значений является тем же экземпляром объекта тестового значения.

В очень большой коллекции оператор -contains возвращает результаты быстрее, чем оператор равенства.

Синтаксис:

<Исходные-величины> -contains <Тестовая-величина>

Примеры:

"abc", "def" -contains "def"
True

"Windows", "PowerShell" -contains "Shell"
False  #Не точное совпадение

# Включён ли компьютер $ThisComputer в список компьютеров $DomainServers?
$DomainServers -contains $thisComputer
True

"abc", "def", "ghi" -contains "abc", "def"
False

$a = "abc", "def"
"abc", "def", "ghi" -contains $a
False
$a, "ghi" -contains $a
True

-notcontains

Описание: Оператор содержимого. Сообщает, включает ли набор начальных значений одно тестовое значение. Всегда возвращает логическое значение. Возвращает ИСТИНА, если тестовое значение не является точным совпадением хотя бы с одним из начальных значений.

Когда тестовое значение является коллекцией, оператор -NotContains использует референтное равенство.

Синтаксис:

<Исходные-величины> -notcontains <Тестовая-величина>

Примеры:

"Windows", "PowerShell" -notcontains "Shell"
    True  #Не точное совпадение

# Получить параметры командлета, но исключить общие параметры
function get-parms ($cmdlet)
{
	$Common = "Verbose", "Debug", "WarningAction", "WarningVariable", "ErrorAction", "ErrorVariable", "OutVariable", "OutBuffer"

	$allparms = (Get-Command $Cmdlet).parametersets |
	foreach {$_.Parameters} |
	foreach {$_.Name} | Sort-Object | Get-Unique

	$allparms | where {$Common -notcontains $_ }
}

# Найдите неутвержденные глаголы в функциях моего модуля
$ApprovedVerbs = Get-Verb | foreach {$_.verb}
$myVerbs = Get-Command -Module MyModule | foreach {$_.verb}
$myVerbs | where {$ApprovedVerbs -notcontains $_}
    ForEach
    Sort
    Tee
    Where

-in

Описание: Оператор -In. Сообщает, появляется ли тестовое значение в наборе начальных значений. Всегда возвращать как логическое значение. Возвращает ИСТИНА, только если тестовое значение точно соответствует хотя бы одному из начальных значений.

Когда тестовое значение является коллекцией, оператор -In использует референтное равенство. Он возвращает ИСТИНА только в том случае, если одно из начальных значений является тем же экземпляром объекта тестового значения.

Оператор -in был введен в PowerShell 3.0.

<Тестовое-значение> -in <Начальные-значения>

Примеры:

"def" -in "abc", "def"
True

"Shell" -in "Windows", "PowerShell"
False  #Нет точного совпадения

"Windows" -in "Windows", "PowerShell"
True  #Точное совпадение

"Windows", "PowerShell" -in "Windows", "PowerShell", "ServerManager"
False  #Используется референтное равенство

$a = "Windows", "PowerShell"
$a -in $a, "ServerManager"
True  #Используется референтное равенство

# Включён ли компьютер $ThisComputer в список компьютеров $DomainServers?
$thisComputer -in  $domainServers
True

-notin

Описание: Сообщает, появляется ли тестовое значение в наборе начальных значений. Всегда возвращает логическое значение. Возвращает ИСТИНА, если тестовое значение не является точным совпадением хотя бы с одним начальных значений.

Когда тестовое значение является коллекцией, оператор -notin использует реферетное равенство. Он возвращает ИСТИНА только в том случае, если одно из эталонных значений является тем же экземпляром объекта тестового значения.

Оператор -notin был введен в PowerShell 3.0.

Синтаксис:

<Тестовое-значение> -notin <Начальные-значения>

Примеры:

"def" -notin "abc", "def"
False

"ghi" -notin "abc", "def"
True

"Shell" -notin "Windows", "PowerShell"
True  #Нет точного совпадения

"Windows" -notin "Windows", "PowerShell"
False  #Точное совпадение

# Найдите неутвержденные глаголы в функциях моего модуля
$ApprovedVerbs = Get-Verb | foreach {$_.verb}
$MyVerbs = Get-Command -Module MyModule | foreach {$_.verb}

$MyVerbs | where {$_ -notin $ApprovedVerbs}
    ForEach
    Sort
    Tee
    Where

Оператор замены

Оператор -replace заменяет все или часть значения указанным значением с помощью регулярных выражений. Вы можете использовать оператор -replace для многих административных задач, таких как переименование файлов. Например, следующая команда изменяет расширения имён всех файлов .txt на .log:

Get-ChildItem *.txt | Rename-Item -NewName { $_.name -replace '\.txt$','.log' }

Синтаксис оператора -replace следующий, где заполнитель ОРИГИНАЛ представляет символы, которые нужно заменить, а заполнитель ЗАМЕНА представляет символы, которые их заменят:

ВВОД -replace ОРИГИНАЛ, ЗАМЕНА

По умолчанию оператор -replace не чувствителен к регистру. Чтобы сделать его чувствительным к регистру, используйте -creplace. Чтобы сделать это явно нечувствительным к регистру, используйте -ireplace.

Рассмотрим следующие примеры:

"book" -replace "B", "C"
Cook

"book" -ireplace "B", "C"
Cook

"book" -creplace "B", "C"
book

Также можно использовать регулярные выражения для динамической замены текста с помощью групп захвата и подстановок. Для получения дополнительной информации смотрите «Регулярные выражения в PowerShell».

Подстановки ScriptBlock

Начиная с PowerShell 6, вы можете использовать аргумент SCRIPTBLOCK для текста _Substitution_. Блок SCRIPTBLOCK будет выполняться для каждого совпадения, найденного в строке _input_.

В SCRIPTBLOCK используйте автоматическую переменную $_ для ссылки на текущий объект SYSTEM.TEXT.REGULAREXPRESSIONS.MATCH. Объект MATCH даёт вам доступ к текущему заменяемому тексту ввода, а также к другой полезной информации.

В этом примере каждая последовательность из трёх десятичных знаков заменяется символьным эквивалентом. SCRIPTBLOCK запускается для каждого набора из трёх десятичных знаков, которые необходимо заменить.

"072101108108111" -replace "\d{3}", {[char][int]$_.Value}
Hello

Сравнение типов

Операторы сравнения типов (-is и -isnot) используются для определения того, является ли объект определенным типом.

-is

Синтаксис:

<объект> -is <исходный объект>

Пример:

$a = 1
$b = "1"
$a -is [int]
    True
$a -is $b.GetType()
    False

-isnot

Синтаксис:

<объект> -isnot <исходный объект>

Пример:

$a = 1
$b = "1"
$a -isnot $b.GetType()
    True
$b -isnot [int]
    True

Рекомендуется Вам: