2013-02-15 41 views
5

Tôi mới sử dụng PowerShell và cần trợ giúp. Kịch bản đầu tiên của tôi cho công việc là tự động hóa người dùng mới và được gọi trong môi trường AD.Powershell - kết hợp các mảng

Kết xuất CSV sẽ được thực hiện một lần mỗi ngày từ hệ thống Peoplesoft của chúng tôi. Tôi sử dụng Import-CSV và tạo 3 mảng (mới, thuật ngữ và xử lý).

Sự cố tôi gặp phải khi kết hợp 3 mảng khi tôi lặp lại tất cả người dùng và thử đưa nó trở lại tệp. Mã ngắt tại số $New += $Term. Tôi tin rằng điều này là do thực tế rằng chỉ có 1 bản ghi của từng loại người dùng (mới, thời hạn và xử lý) trong tệp thử nghiệm của tôi (tôi biết, thêm nhiều người dùng hơn & hellip; không thể. Đây có thể là kết quả thực tế cho bất kỳ Ngày đặc biệt). Dưới đây là mã mẫu của tôi:

#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 

Vì vậy, mã sẽ xuất nhưng chỉ một phần kết quả.

lỗi - Yêu cầu phương thức không thành công vì [System.Management.Automation.PSObject] không chứa phương thức có tên 'op_Addition'.

+1

'$ New + = $ Term' Và dòng đó là ở đâu ...? – aquinas

+0

Đã thêm mã và báo cáo lỗi ... lời xin lỗi của tôi. – user2077056

Trả lời

11

Nếu Import-Csv chỉ trả về 1 kết quả, thì bạn chắc chắn rằng biến của bạn được giả định KHÔNG phải là mảng, sau đó ghép sẽ không thành công. Điều này không thay đổi bởi thực tế là bạn đã khởi tạo trước các biến của mình với @(). Trong thực tế, bước đó là không cần thiết.

Để buộc kết quả được coi là một mảng, bạn có thể quấn toàn bộ đường dây Import-Csv trong @() hoặc thực hiện tương tự sau đó.

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

Tuyệt vời, cảm ơn bạn! Tôi sẽ cố gắng làm điều đó. Lưu ý phụ, tôi đã cố gắng gửi tất cả nó tới một mảng mới ....tức là '$ total = @()' $ tổng cộng + = $ new $ tổng cộng + = $ term Sau đó, xuất tổng $ nó trả về cả ba người dùng trong tệp thử nghiệm của tôi. Tại sao điều này làm việc chứ không phải bản gốc? – user2077056

+1

Trong trường hợp đó, bạn đang khởi tạo '$ total' làm mảng, sau đó ngay lập tức thực hiện" cộng đẳng "trên đó. Vì vậy, powershell biết bạn đang làm một hoạt động mảng và hành động một cách thích hợp. Trong mã ban đầu của bạn, bạn khởi tạo '$ new' làm mảng, nhưng sau đó gán lại nó cho đầu ra của lệnh ghép ngắn trước khi thực hiện dấu cộng. Nếu lệnh ghép ngắn chỉ trả về 1 giá trị, thì PowerShell sẽ thay đổi '$ new' thành biến vô hướng, và sau đó dấu cộng bằng không có ý nghĩa. – latkin

+1

'$ a = @ ($ b) + @ ($ c)' giải quyết một vấn đề tương tự đối với tôi. Cảm ơn câu trả lời hữu ích @latkin. – kevinmicke

0

Bạn cũng có thể thực thi các loại bằng typecasting biến:

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

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

isPublic IsSerial Tên BaseType
-------- -------- --- - --------
Đúng Đúng FileInfo System.IO.FileSystemInfo
Đúng Đúng Object [] System.Array

1

Vì vậy, bạn đang nhập cùng CSV f ile 3 lần? không phải là nó tốt hơn để nhập khẩu nó một lần và sau đó thiết lập các mảng được lọc "quan điểm" của nó?

Sắp xếp như thế này. Bạn cũng có thể sử dụng giá trị "Đếm" từ mỗi mảng cũng như để cho biết liệu 1 hoặc nhiều kết quả đã được trả về hay chưa.

#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

Tôi biết tôi đang đi vào cuộc thảo luận này muộn, nhưng đối với người khác mà đến cùng ... Vì bạn đã được xác định $ mới như là một mảng trống rỗng, khi bạn nhập từ csv bạn muốn THÊM đầu ra cho mảng được xác định trước của bạn, không đặt nó bằng đầu ra của import-csv.

$new = @() 
$new += Import-Csv $File | Where-Object { 
      $_.TermDate -eq "" -and $_.LastName -ne "" -and $_.Processdate -eq "" 
     } 
Các vấn đề liên quan