您看到该方法的原因是Get-Members是powershell试图有帮助并展开集合。如果您有一个包含多种类型项目的数组,它会向您显示每种类型的成员(例如,如果您使用'ls'(Get-ChildItem)并且您所在的目录中有FileInfos和DirectoryInfos,并且您管理ls | gm ,它会显示FileInfos您成员还另一组DirectoryInfos的成员):
(7) C:\ -» ls
Directory: C:\
Mode LastWriteTime Length Name
---- ------------- ------ ----
d---- 5/28/2010 8:19 AM .hg
d---- 5/13/2010 3:37 PM Build
…
-a--- 4/22/2010 11:21 AM 2603 TODO.org
(8) C:\ -» ls | gm
TypeName: System.IO.DirectoryInfo
Name MemberType Definition
---- ---------- ----------
Mode CodeProperty System.String Mode{get=Mode;}
Create Method System.Void Create(System.Security.AccessControl.Direct...
…
TypeName: System.IO.FileInfo
Name MemberType Definition
---- ---------- ----------
Mode CodeProperty System.String Mode{get=Mode;}
AppendText Method System.IO.StreamWriter AppendText()
…
我最常做的,以确保我不是在看展开的成员,是尝试“$ s.GetType() .Name“首先看看我在处理什么。在你的情况下,它是清晰的和数组,因为你初始化它像“$ s = @(Invo”(@ =它是一个数组)
要找出一个数组是否包含项目,可以使用 - 包括运营商:
(9) C:\ -» @(1,2,3) -contains 1
True
我想你已经有了一个字符串数组,所以你可以使用一个字符串,如:
(10) C:\ -» @("Stuff","you've","got","might have","Expired") -contains "Expired"
True
但是,如果过期不完全匹配(你正在寻找一个包含过期的元素,比如“Connection Expired 1/1/2010”),你需要找到匹配并检查第二个e计数,我认为:
(23) C:\ -» @("Stuff","you've","got","might have","Connection Expired 1/1/2010") -contains "Expired"
False
(24) C:\ -» @("Stuff","you've","got","might have","Connection Expired 1/1/2010") | ?{$_.Contains("Expired")}
Connection Expired 1/1/2010
(33) C:\ -» $xs = @("Stuff","you've","got","might have","Connection Expired 1/1/2010") | ?{$_.Contains("Expired")}
(34) C:\ -» $xs.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True String System.Object
(35) C:\ -» $xs
Connection Expired 1/1/2010
在这种情况下,只有一个匹配,所以powershell展开到一个字符串。混蛋。但是,如果有超过1个匹配,则:
(36) C:\ -» $xs = @("Stuff","you've","got","might Expired have","Connection Expired 1/1/2010") | ?{$_.Contains("Expired")}
(37) C:\ -» $xs.GetType()
IsPublic IsSerial Name BaseType
-------- -------- ---- --------
True True Object[] System.Array
(38) C:\ -» $xs
might Expired have
Connection Expired 1/1/2010
现在是一个数组。
幸运的是,字符串和数组的长度属性:
(39) C:\ -» $xs.Length
2
(40) C:\ -» "Bob".Length
3
所以,你可以检查你的结果中包含“已过期”的长度,看看是否有任何过期的:
(41) C:\ -» $xs = @("Stuff","you've","got","might Expired have","Connection Expired 1/1/2010") | ?{$_.Contains("Expired")}
(42) C:\ -» if ($xs.Length -gt 0) { Write-Host "Whoas, stuff's expired, dog." }
Whoas, shit's expired, dog.
(也许有人有更好的方法来检查,如果一个集合包含一个项目,可以满足某些谓词(如LINQ的任何)?)
由于克里斯的好处!这绝对让我朝着正确的方向前进。工作脚本: $ S = @(调用-SQLCMD -Query “USE数据库 GO EXEC Monitor_TEST_ps 'EXPORT_RUN',NULL,20”' -ServerInstance “testdb002 \ testdb_002”) 如果($ S | {? $ _ ['Status'] -eq'OK'}) { Write-Host“Expired found,FAIL。” } else { 写主机“未找到,确定”。 } – xbnevan 2010-05-28 17:51:55