2010-05-28 20 views
6

Arrrg! मैं जो कुछ महसूस करता हूं उसमें चल रहा हूं, एक सरल स्क्रिप्ट के साथ एक गूंगा मुद्दा है जिसे मैं पावरहेल में लिख रहा हूं। मैं एक एसक्यूएल कमांड का आह्वान कर रहा हूं जो एक संग्रहित प्रो को कॉल कर रहा है, जिसके परिणामस्वरूप मैंने इसे एक सरणी लगाई है। परिणाम कुछ इस तरह दिखाई:मैं अपने सरणी से विधि क्यों शामिल नहीं कर सकता?

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

क्या मुझे क्या करना कोशिश कर रहा हूँ if($s.Contains("Expired")) है, रिपोर्ट में विफल रहा है। सरल...? :(समस्या में मैं चल रहा हूं ऐसा लगता है कि इसमें विधि को लोड नहीं किया जा रहा है क्योंकि मुझे इस तरह की त्रुटि मिलती है:

विधि आमंत्रण विफल हुआ क्योंकि [System.Object []] में ' 'शामिल हैं लाइन में:। 1 वर्ण: 12 + $ s.Contains < < < < ("समय सीमा समाप्त") + CategoryInfo: InvalidOperation: (शामिल है: स्ट्रिंग) [], RuntimeException + FullyQualifiedErrorId: MethodNotFound

तो, मैं पावरहेल को स्ट्रिंग करने के लिए इसे अनलॉक करने से रोकने के लिए क्या कर सकता हूं? वास्तविक पीएस स्क्रिप्ट नीचे -

$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

कारण आपको यह देखने का कारण है कि सदस्य-शक्तियां शक्तियां उपयोगी और संग्रह को अनलॉक करने की कोशिश कर रही हैं। यदि आपके पास कई प्रकार के आइटम हैं, तो यह आपको प्रत्येक प्रकार के सदस्यों को दिखाता है (जैसे कि आप 'ls' (Get-ChildItem) हैं और निर्देशिका में FileInfos और DirectoryInfos हैं, और आप पाइप ls | gm , यह आप भी DirectoryInfos के सदस्य) का एक और समूह FileInfos के सदस्यों और दिखाएगा:

(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() 
… 

क्या मैं आमतौर पर करते हैं, यकीन है कि मैं unrolled सदस्यों पर नहीं देख रहा हूँ बनाने के लिए, कोशिश "$ s.GetType है() .Name "सबसे पहले यह देखने के लिए कि मैं किसके साथ काम कर रहा हूं। आपके मामले में, यह स्पष्ट रूप से और सरणी है, क्योंकि आपने इसे "$ s = @ (इनवो" (@ = यह एक सरणी है)

यह पता लगाने के लिए कि किसी सरणी में कोई आइटम है या नहीं, आप इसका उपयोग कर सकते हैं - शामिल ऑपरेटर:

(9) C:\ -» @(1,2,3) -contains 1 
True 

मुझे लगता है कि आप तार की एक सरणी मिल गया है, तो आप की तरह शाब्दिक एक स्ट्रिंग का उपयोग कर सकते:

(10) C:\ -» @("Stuff","you've","got","might have","Expired") -contains "Expired" 
True 

लेकिन अगर समय सीमा समाप्त हो सटीक मेल नहीं है (आप एक तत्व की तलाश में था जिसमें समाप्त हो गया था, जैसे "कनेक्शन समाप्त हो गया 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 एक स्ट्रिंग के लिए यह unrolled। जर्क। यदि 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 का कोई भी)?

+0

धन्यवाद क्रिस है उपयोग करने के लिए है! यह निश्चित रूप से मुझे सही दिशा में मिला। कार्य स्क्रिप्ट: $ s = @ (आह्वान-Sqlcmd -query "उपयोग डीबी GO कार्यकारी Monitor_TEST_ps 'EXPORT_RUN', शून्य, 20" ' -ServerInstance" testdb002 \ testdb_002 ") अगर ($ s | {? $ _ ['स्थिति'] -ईक 'ओके'}) { लिखें-होस्ट "समाप्त हो गया, असफल।" } अन्य { लिखें-होस्ट "नहीं मिला, ठीक है।" } – xbnevan

7

बस डालें, $ s एक .NET सरणी है (आप ' @() का पुन: उपयोग सुनिश्चित करता है कि) और आप एक विधि (युक्त) का आह्वान करने का प्रयास कर रहे हैं जो इस .NET प्रकार पर मौजूद नहीं है।

आपकी समस्या का समाधान करने के लिए सबसे आसान तरीका है PowerShell के -contains ऑपरेटर जो सीधे सरणियों के खिलाफ काम कर और कर के लाभों को मामला-दर insenstive तुलना उदा .:

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

वाह, मैं कसम खा सकता था कि मैं थक गया। मुझे अब मूर्खतापूर्ण लगता है, धन्यवाद कीथ ने भी काम किया। w00t। – xbnevan

+1

सरल और बिंदु पर। वास्तव में मुझे क्या चाहिए। मैं एक पीएस 3 सिस्टम पर विकास कर रहा था फिर पीएस 2 पर अपना कोड चलाने की कोशिश की। मुझे यह त्रुटि मिली और यह समस्या को ठीक करने का एक आसान समाधान है। –

संबंधित मुद्दे

 संबंधित मुद्दे