我在今天早上写的一个脚本中遇到了一个错误,我没有从我的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中有一些不同的规则可以控制何时可以直接引用属性,但我一直无法找到它。
有没有人对版本之间的工作方式有所了解?
答案 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