2010-05-28 3 views
6

Arrrg! 필자는 powershell에서 작성한 간단한 스크립트에 대해 멍청한 문제라고 생각합니다. 저장 프로 시저를 호출하는 sql 명령을 호출합니다. 결과는 배열로 저장됩니다. 결과는이 같은보고 : 내가 할 노력하고있어내 배열에서 Contains 메서드를 호출 할 수없는 이유는 무엇입니까?

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

if($s.Contains("Expired"))입니다, 보고서에 실패했습니다. 단순한...? :(이 문제는 내가 실행 중입니다. Contains 메소드가 다음과 같은 오류 메시지가 표시되어로드되지 않습니다.

[System.Object []]에 ' . 줄에 '포함 : 1 개 문자 : 12 + $ s.Contains <이 < < < ("만료") 가 + CategoryInfo : InvalidOperation가 (포함 : 문자열) [], 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." 
} 

답변

5

Get-Members는 (는) Get-Members입니다. powershell이 ​​(가) 도움이되고 컬렉션을 게시하려고합니다. 여러 유형의 항목이있는 배열이있는 경우 각 유형의 멤버가 표시됩니다 (예 : 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"과 같이 만료 된 요소를 찾고 있었음) 일치 항목을 찾고 th를 확인해야합니다. 전자 수 :

(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이 ​​문자열을 펼칩니다. 얼간이. 일치 항목이 두 개 이상인 경우 :

(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의 Any와 같은 일부 술어를 만족시키는 항목을 컬렉션에 포함했는지 확인할 수있는 더 나은 방법이 있습니까?)

+0

감사 크리스 비교 직접 배열에 대해 작업과 수행의 장점을 가지고 PowerShell을의 -contains 연산자를 사용하는 것입니다! 이것은 확실히 올바른 방향으로 나를 잡았어. 근무 스크립트 $ S = @ (-Query "를 사용하여 DB GO 간부 Monitor_TEST_ps 'EXPORT_RUN', NULL, 20"' -ServerInstance "testdb002의 \의 testdb_002"-SQLCMD를 호출) 경우 ($의 | {? $ _ [ '상태'] - 예 '확인'}) { 쓰기 호스트 "만료 됨, FAIL." } else { 쓰기 호스트 "찾을 수 없음, 확인" } – xbnevan

7

간단히 말하면 $ s는 .NET 배열입니다. @()을 다시 사용하면이 .NET 유형에 존재하지 않는 메소드 (포함)를 호출하려고 시도합니다.

문제를 해결하는 가장 간단한 방법은 대소 insenstive는 예컨대 :

if ($s -contains 'expired') { ... } 
+0

와우, 나는 그것을 피곤했다. 나는 지금 바보 같이 느낀다. Keith 역시 감사했다. w00t. – xbnevan

+1

간단하고 요점. 정확히 내가 필요로하는 것. PS 3 시스템에서 개발하고 PS 2에서 코드를 실행하려고 시도했습니다.이 오류가 발생했으며이 문제를 해결할 수있는 간단한 해결책입니다. –

관련 문제