2013-02-15 59 views
5

मैं शक्तिशक्ति के लिए नया हूं और सहायता की आवश्यकता में हूं। काम के लिए मेरी पहली लिपि एडी पर्यावरण में नए और शब्दों को स्वचालित करने के लिए स्वचालित है।पावरहेल - एरे संयोजन

एक पीएसओएसओफ़ ​​सिस्टम से रोजाना एक बार सीएसवी डंप किया जाएगा। मैं Import-CSV का उपयोग करता हूं और 3 सरणी (नया, शब्द और संसाधित) बनाता हूं।

मैं जो समस्याएं कर रहा हूं वह 3 एरे के संयोजन के साथ है जब मैं सभी उपयोगकर्ताओं के माध्यम से लूप करता हूं और इसे फ़ाइल में वापस डालने का प्रयास करता हूं। कोड $New += $Term लाइनों पर टूट जाता है। मेरा मानना ​​है कि यह इस तथ्य के कारण है कि मेरी टेस्ट फ़ाइल में प्रत्येक उपयोगकर्ता प्रकार (नया, शब्द और संसाधित) का केवल 1 रिकॉर्ड है (मुझे पता है, अधिक उपयोगकर्ता और नरक जोड़ें; नहीं कर सकते हैं। यह किसी के लिए असली दुनिया का परिणाम हो सकता है निश्चित दिन)। नीचे मेरा नमूना कोड है:

#Get Credentials from user 
$c = Get-Credential 

#Get Date for $Term array population 
$e = Get-Date -format M/d/yyyy 

#Set file location and variable for said file 
$File = "c:\users\nmaddux\desktop\adduserstuff\test.csv" 

#Import record sets for New and Term users 
$New = @() 
$Term = @() 
$Procd = @() 
$New = Import-Csv $File | Where-Object { 
      $_.TermDate -eq "" -and $_.LastName -ne "" -and $_.Processdate -eq "" 
     } 
$Term = Import-Csv $File | Where-Object { 
      $_.TermDate -ne "" -and $_.Processdate -eq "" -and $_.TermDate -le $e 
     } 
$Procd = Import-Csv $File | Where-Object { $_.Processdate -ne "" } 

#Process both new and term users provided there are records to process for each 
If ($New -ne $NULL -and $Term -ne $NULL) { 
    # Some code to process users 
} 

$new += $term 
$new += $Procd 
$new | Export-Csv $file -NoTypeInformation -ErrorAction SilentlyContinue 

तो यह निर्यात करेगा लेकिन केवल आंशिक परिणाम होगा।

त्रुटि - विधि आमंत्रण विफल हुआ क्योंकि [System.Management.Automation.PSObject] में 'op_Addition' नामक विधि नहीं है।

+1

'$ नया + = $ टर्म' और वह पंक्ति कहां है ...? – aquinas

+0

कोड और त्रुटि कथन जोड़ा गया ... मेरी माफ़ी। – user2077056

उत्तर

11

Import-Csv केवल 1 परिणाम देता है, तो आप सही है कि आपके चर एक श्रृंखला होना चाहिए नहीं माना जाता है कर रहे हैं, तो संयोजन असफल हो जायेगी। यह इस तथ्य से नहीं बदला गया है कि आपने @() के साथ अपने चर को पूर्व-प्रारंभ किया है। वास्तव में, वह कदम जरूरी नहीं है।

परिणाम को सरणी के रूप में माना जाने के लिए मजबूर करने के लिए, आप या तो लाइन @() में लपेट सकते हैं, या बाद में कुछ ऐसा कर सकते हैं।

$new = @(Import-Csv $File | Where-Object {...}) 
# or 
$new = Import-Csv $File | Where-Object {...} 
$new = @($new) 
+0

बढ़िया, धन्यवाद! मैं कोशिश करूँगा। साइड नोट, मैंने इसे सभी को एक नई सरणी में भेजने की कोशिश की ....यानी '$ कुल = @()' $ कुल + = $ नया $ कुल + = $ शब्द फिर $ $ निर्यात करें, यह मेरी परीक्षण फ़ाइल में सभी तीन उपयोगकर्ताओं को वापस कर देता है। यह क्यों काम करता है और मूल नहीं? – user2077056

+1

उस स्थिति में आप सरणी के रूप में '$ कुल' शुरू कर रहे हैं, फिर तुरंत उस पर "प्लस-बराबर" कर रहे हैं। तो शक्तियों को पता है कि आप एक सरणी संचालन कर रहे हैं और उचित तरीके से कार्य करता है। अपने मूल कोड में, आप सरणी के रूप में '$ new' प्रारंभ करते हैं, लेकिन फिर प्लस-बराबर करने से पहले इसे cmdlet के आउटपुट पर फिर से असाइन करें। यदि cmdlet केवल 1 मान लौटाता है, तो पावरहेल स्केलर वैरिएबल में '$ new' बदल जाएगा, और फिर प्लस-बराबर समझ में नहीं आता है। – latkin

+1

'$ ए = @ ($ बी) + @ ($ सी) 'मेरे लिए एक समान समस्या हल हो गई। सहायक उत्तर @latkin के लिए धन्यवाद। – kevinmicke

0

तुम भी चर typecasting द्वारा प्रकार लागू कर सकते हैं:

$array = @() 
$array = gci test.txt 
$array.GetType() 

[array]$array = @() 
$array = gci test.txt 
$array.GetType() 

IsPublic IsSerial नाम BaseType
-------- -------- --- - --------
यह सच है यह सच है FileInfo System.IO.FileSystemInfo
सच सच वस्तु [] System.Array

1

तो तुम आयात कर रहे हैं एक ही CSV च ile 3 बार? क्या इसे एक बार आयात करना बेहतर नहीं है और फिर सरणी को "दृश्य" फ़िल्टर करने के लिए सेट करें?

इस तरह का क्रमबद्ध करें। आपको प्रत्येक सरणी से "गणना" मान का भी उपयोग करने में सक्षम होना चाहिए और यह भी कहना चाहिए कि 1 या अधिक परिणाम लौटाए गए हैं या नहीं।

#Get Credentials from user 
$c = Get-Credential 

#Get Date for $Term array population 
$e = Get-Date -format M/d/yyyy 

#Set file location and variable for said file 
$File = "c:\users\nmaddux\desktop\adduserstuff\test.csv" 

#Import record sets for New and Term users 
[array]$New 
[array]$Term 
[array]$Procd 

[array]$Import = Import-Csv $File 
[array]$New = $Import | ? {$_.TermDate -eq "" -and $_.LastName -ne "" -and $_.Processdate -eq ""} 
[array]$Term = $Import | ? {$_.TermDate -ne "" -and $_.Processdate -eq "" -and $_.TermDate -le $e} 
[array]$Procd = $Import | ? {$_.Processdate -ne ""} 

#Process both new and term users provided there are records to process for each 
if (($New.Count -gt 0) -and ($Term.Count -gt 0)) 
{ 
    # Some code to process users 
} 

$new += $term 
$new += $Procd 
$new | Export-Csv $file -NoTypeInformation -ErrorAction SilentlyContinue 
0

मैं जानता हूँ कि मैं देर से इस चर्चा में आ रहा हूँ, लेकिन किसी और के लिए जब से तुम पहले से ही एक खाली सरणी के रूप में $ नई परिभाषित कि साथ ... आता है, जब आप CSV से आयात करें आप जोड़ना चाहते हैं आपके पूर्व-परिभाषित सरणी के आउटपुट, इसे आयात-सीएसवी के आउटपुट के बराबर सेट नहीं करते हैं।

$new = @() 
$new += Import-Csv $File | Where-Object { 
      $_.TermDate -eq "" -and $_.LastName -ne "" -and $_.Processdate -eq "" 
     }