gpt4 book ai didi

powershell - 为什么我不能从数组中调用Contains方法?

转载 作者:行者123 更新时间:2023-12-04 13:35:21 25 4
gpt4 key购买 nike

我遇到了一个我用Powershell写的简单脚本的愚蠢问题。我正在调用一个调用存储过程的sql命令,结果将其放入数组。结果看起来像这样:

Status                                       ProcessStartTime                            ProcessEndTime                             
------ ---------------- --------------
Expired May 22 2010 8:31PM May 22 2010 8:32PM

我想做的是 if($s.Contains("Expired")),报告失败。简单的...? :(问题我遇到了,因为我得到这样的错误,它似乎没有包含Contains方法:

方法调用失败,因为[System.Object []]不包含名为“Contains”的方法。在线:1个字符:12个
+ $ s。包含<<<<(“过期”)
+ CategoryInfo:InvalidOperation :(包含:String)[],RuntimeException
+ FullyQualifiedErrorId:MethodNotFound

因此,我该怎么做才能阻止Powershell展开为字符串?实际的ps脚本如下-
$s = @(Invoke-Sqlcmd -Query "USE DB
GO
exec Monitor_TEST_ps 'EXPORT_RUN',NULL,20" `
-ServerInstance testdb002\testdb_002
)

if ($s.Contains("Expired"))
{
Write-Host "Expired found, FAIL."
}
else
{
Write-Host "Not found, OK."
}

最佳答案

您看到该方法为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”(@ =这是一个数组)。

要确定数组是否包含项,可以使用-contains运算符:
(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”),则需要找到匹配项并检查计数,我认为:
(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将其展开为一个字符串。 SCSS 但是,如果有超过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

现在是一个数组。

幸运的是,字符串和数组都具有length属性:
(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的Any)?)

关于powershell - 为什么我不能从数组中调用Contains方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2931035/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com