我对Select-Object cmdlet的一些行为感到困惑。这是一个例子。
PS C:\> $object = get-item C:\windows\Temp
PS C:\> $time = $object.CreationTime
PS C:\> $time.GetType().FullName
System.DateTime
PS C:\> $result = Select-Object -InputObject $object -Property "CreationTime"
PS C:\> $result.GetType().FullName
System.Management.Automation.PSCustomObject
PS C:\>
PS C:\> $result.CreationTime.GetType().FullName
System.DateTime
请注意,CreationTime
的类型为System.DateTime
但是当我使用Select-Object
选择它时,返回的对象的类型为System.Management.Automation.PSCustomObject
。它的一些新对象有CreationTime
作为其属性。
让我们看一下Select-Object
的帮助来解释一下。
概要
选择对象或对象集的指定属性...
这就是我想要的,属性本身......不是属性的一些对象。但如果我们进一步阅读......
说明
...如果使用Select-Object选择指定的属性,它将从输入对象复制这些属性的值,并创建具有指定属性和复制值的新对象。
我不知道为什么它有用,但它解释了这个对象的返回。
使用-ExpandProperty
代替-Property
似乎给了财产本身
PS C:\> $result2 = Select-Object -InputObject $object -ExpandProperty "CreationTime"
PS C:\> $result2.GetType().FullName
System.DateTime
为什么-ExpandProperty
会这样做?让我们来看看它的帮助:
-ExpandProperty
指定要选择的属性...如果属性包含对象,则该对象的属性将显示在输出中。
在这种情况下,属性是一个对象,我们没有得到“该对象的属性”我们只得到了对象本身。
有人可以告诉我:
-ExpandProperty
获取属性对象本身?这是我很困惑的地方。我读错了吗?我觉得这需要另一次技术编辑迭代。答案 0 :(得分:4)
扩展#1的答案:-expandproperty的最常见用法是将数组属性扩展到数组元素中,尤其是在执行export-csv时。
PS C:\> get-process lsass | select threads | convertto-csv -notype
"Threads"
"System.Diagnostics.ProcessThreadCollection"
不太有用。现在,在该线程集合上使用-expandproperty:
PS C:\> get-process lsass | select -expand threads | convertto-csv -notype
"BasePriority","CurrentPriority","Id","IdealProcessor","PriorityBoostEnabled","PriorityLevel","PrivilegedProcessorTime"
,"StartAddress","StartTime","ThreadState","TotalProcessorTime","UserProcessorTime","WaitReason","ProcessorAffinity","Si
te","Container"
"9","10","572",,,,,"2000143616",,"Wait",,,"LpcReceive",,,
"9","10","588",,,,,"2000143616",,"Wait",,,"UserRequest",,,
"9","9","592",,,,,"2000143616",,"Wait",,,"UserRequest",,,
"9","10","596",,,,,"0",,"Wait",,,"EventPairLow",,,
"9","9","1404",,,,,"0",,"Wait",,,"UserRequest",,,
"9","9","3896",,,,,"0",,"Wait",,,"EventPairLow",,,
"9","9","848",,,,,"0",,"Wait",,,"EventPairLow",,,
"9","11","6216",,,,,"2000143616",,"Wait",,,"UserRequest",,,
"9","9","7924",,,,,"2000143616",,"Wait",,,"EventPairLow",,,
答案 1 :(得分:3)
Select-object(不带-expandproperty)返回带有您选择的属性集的PSCustomObject。那是因为你可能想要选择多个属性(并且不能期望得到例如2个属性的日期时间对象)。
对#2的回答是,有时候让一个具有较少属性的对象并丢失方法会更好。此外,您可以使用带表达式的select-object返回“计算”属性。