在Powershell 2.0中直接引用属性

时间:2018-05-01 14:06:39

标签: powershell powershell-v2.0 powershell-v4.0

我在今天早上写的一个脚本中遇到了一个错误,我没有从我的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 :(得分:3)

这是由于PowerShell 3.0版中引入的语言行为发生了变化 - 来自"What's new in PowerShell 3.0" release notes

  

Windows PowerShell语言增强功能

     

Windows PowerShell 3.0包含许多旨在简化其语言的功能,   更容易使用,并避免常见错误。改进包括    属性枚举 ,标量对象的计数和长度属性,   新的重定向运算符,$ Using scope修饰符,PSItem自动   变量,灵活的脚本格式,变量属性,   简化的属性参数,数字命令名称,   Stop-Parsing操作符,改进的阵列splatting,新位操作符,   有序词典,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