Я обнаружил ошибку в сценарии, который написал сегодня утром, когда я не получал вывода из выражения Select-String. Немного поиграв, я понял, что это выражение не вернет значение моего совпадения в версии 2.0, но вернет значение в версии 4.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
Мне кажется, что в версии 2.0 есть несколько других правил, которые определяют, когда вы можете напрямую ссылаться на свойства, но я не смог найти упоминания об этом.
Кто-нибудь знает, как это работает между версиями?
Это связано с изменением языкового поведения, введенным в PowerShell версии 3.0 - из Примечания к выпуску «Что нового в PowerShell 3.0»:
Windows PowerShell Language Enhancements
Windows PowerShell 3.0 includes many features that are designed to make its language simpler, easier to use, and to avoid common errors. The improvements include property enumeration, count and length properties on scalar objects, new redirection operators, the $Using scope modifier, PSItem automatic variable, flexible script formatting, attributes of variables, simplified attribute arguments, numeric command names, the Stop-Parsing operator, improved array splatting, new bit operators, ordered dictionaries, PSCustomObject casting, and improved comment-based help.
(Emphasis added by me)
Перечисление свойств позволяет оператору ссылки .
разрешать свойства отдельных членов выражения массива, даже если сам массив не имеет такого свойства:
$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
Я прочитал это, и в то время это не имело смысла. Я просто вернулся и дважды проверил, и мне возвращают массив длиной 1, так что это действительно проблема.
См. Сообщение в блоге Новые возможности языка V3 относительно перечисления участников.