Прямая ссылка на свойства в Powershell 2.0 - PullRequest
0 голосов
/ 01 мая 2018

Я обнаружил ошибку в скрипте, который написал сегодня утром, когда я не получал вывод из моего выражения Select-String. После небольшой игры я понял, что это выражение не будет возвращать значение моего соответствия в v2.0, но будет в v4.0, где я его изначально написал.

($log | Select-String "\[CIsoCreator\] Creating iso file" -AllMatches | Select-Object -ExpandProperty line -Last 1 | Select-String "([A-Z]\:)(.*\\)*.*\.iso").matches.value

Попробовав несколько вещей, я получил то, что вернулось, как и ожидалось.

($log | Select-String "\[CIsoCreator\] Creating iso file" -AllMatches | Select-Object -ExpandProperty line -Last 1 | Select-String "([A-Z]\:)(.*\\)*.*\.iso").matches | select -expandproperty value

Мне кажется, в v2.0 есть несколько других правил, которые определяют, когда вы можете напрямую ссылаться на свойства, но я не смог найти упоминания об этом.

Кто-нибудь знает, как это работает между версиями?

1 Ответ

0 голосов
/ 01 мая 2018

Это связано с изменением поведения языка, представленным в PowerShell версии 3.0 - из заметок о выпуске «Что нового в PowerShell 3.0» :

Улучшения языка Windows PowerShell

Windows PowerShell 3.0 включает в себя множество функций, разработанных для упрощения языка. проще в использовании и позволяет избежать распространенных ошибок. Улучшения включают перечисление свойства , свойства count и length для скалярных объектов, новые операторы перенаправления, модификатор области $ Using, PSItem автоматический переменная, гибкое форматирование скрипта, атрибуты переменных, упрощенные аргументы атрибутов, числовые имена команд, Оператор Stop-Parsing, улучшенное разбиение массива, новые битовые операторы, упорядоченные словари, приведение PSCustomObject и улучшение справка на основе комментариев.

( Акцент сделан мной )

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

$Things = 1..3 |%{ New-Object psobject -Property @{Prop = $_} }
$Things.Prop   # Starting with version 3.0, this outputs the array 1,2,3 
               # In PowerShell version 2.0, this will throw an error 
               # because [Object[]] ($Things) has no such property
...