2013-02-15 2 views
5

저는 PowerShell을 처음 사용하여 도움이 필요합니다. 내 첫 번째 스크립트는 광고 환경에서 신규 사용자 및 사용자를 자동화하는 것입니다.Powershell - 배열 조합

CSV 덤프는 Peoplesoft 시스템에서 매일 한 번 수행됩니다. Import-CSV을 사용하고 3 개의 배열 (new, term 및 processed)을 만듭니다.

내가 가지고있는 문제는 일단 모든 사용자를 반복하고 파일에 다시 넣으 려하면 3 개의 배열을 결합하는 것입니다. 코드는 $New += $Term 줄에서 나옵니다. 이 사실은 테스트 파일에 각 사용자 유형 (신규, 용어 및 처리 된)의 레코드가 1 개 밖에 없다는 사실에 기인한다고 생각합니다. (필자는 더 많은 사용자 및 hellip을 추가 할 수 있습니다. 특정 일). 아래 샘플 코드는 다음과 같습니다.

#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

'$ New + = $ Term' 그리고 그 줄은 어디에 있습니까? – aquinas

+0

코드 및 오류 진술을 추가했습니다 ... 사과드립니다. – user2077056

답변

11

Import-Csv이 1 개의 결과 만 반환하는 경우 변수가 배열이 아닌 것으로 가정하면 연결이 실패합니다. @()으로 변수를 미리 초기화했기 때문에 변경되지 않습니다. 사실, 그 단계는 필요하지 않습니다.

결과를 배열로 처리하려면 Import-Csv 행 전체를 @()에 넣거나 나중에 유사한 작업을 수행 할 수 있습니다.

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

우수하다, 감사합니다! 나는 그것을 시도 할 것이다. 사이드 노트, 모든 것을 새로운 배열로 보내려고했습니다 ....즉, '$ total = @()' $ total + = $ new $ total + = $ term 내 보낸 파일은 세 명의 사용자가 모두 내 보낸입니다. 왜 이것이 원래의 것이 아니라 작동합니까? – user2077056

+1

그 경우 배열로'$ total'을 초기화하고, 즉시 그 위에 "plus-equal"을합니다. 따라서 powershell은 배열 작업을 수행하고 적절하게 작동한다는 것을 알고 있습니다. 원래 코드에서'$ new'를 배열로 초기화하지만 plus-equals를 수행하기 전에 cmdlet의 출력에 다시 할당하십시오. cmdlet이 1 개의 값만 반환하면 powershell은'$ new'를 스칼라 변수로 변경 한 다음 plus-equals가 의미가 없습니다. – latkin

+1

'$ a = @ ($ b) + @ ($ c)'는 비슷한 문제를 해결했습니다. 도움이되는 답변 @latkin을 주셔서 감사합니다. – kevinmicke

0

또한 변수를 타입 캐스팅하여 유형을 적용 할 수 있습니다 :

$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 f를 3 번? 그것을 한 번 가져 와서 배열을 필터링 된 "보기"로 설정하는 것이 낫지 않습니까?

일종의 같은. 또한 각 배열의 "Count"값을 사용하여 하나 이상의 결과가 반환되었는지 여부를 말할 수 있어야합니다. 당신은 CSV에서 가져올 때

#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

은 내가 늦게이 토론에 간다 알고 있지만 이미 빈 배열로 새로운 $를 정의하기 때문에 다른 사람을 위해 그 ... 함께 제공, 당신은 추가 할 출력을 미리 정의 된 배열로 가져오고 import-csv의 출력과 동일하게 설정하지 마십시오.

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