2013-02-15 3 views
5

Я новичок в powershell и нуждаюсь в помощи. Мой первый скрипт для работы - автоматизировать новых и названных пользователей в среде AD.Powershell - комбинированные массивы

Дамп CSV будет производиться один раз в день из нашей системы Peoplesoft. Я использую Import-CSV и создаю 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 Затем экспорт $ total он вернул всех трех пользователей в тестовый файл. Почему это работает, а не оригинал? – user2077056

+1

В этом случае вы инициализируете '$ total' в качестве массива, а затем сразу же добавляете« плюсы ». Так powershell знает, что вы делаете операцию с массивом и действуете соответствующим образом. В исходном коде вы инициализируете '$ new' в качестве массива, но затем повторно назначаете его на вывод командлета перед выполнением плюсовых равных. Если командлет возвращает только одно значение, powershell изменит '$ new' на скалярную переменную, а затем плюсы-равны не имеют смысла. – 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
-------- -------- --- - --------
True True FileInfo System.IO.FileSystemInfo
True True Object [] System.Array

1

Таким образом, вы импортируете тот же CSV е ile 3 раза? не лучше ли импортировать его один раз, а затем настроить массивы для фильтрации «просмотров» этого?

Соответственно этому. Вы также должны иметь возможность использовать значение «Count» из каждого массива, чтобы сказать, было ли возвращено 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 вы хотите добавить вывод в ваш предварительно определенный массив, не устанавливайте его равным выходу import-csv.

$new = @() 
$new += Import-Csv $File | Where-Object { 
      $_.TermDate -eq "" -and $_.LastName -ne "" -and $_.Processdate -eq "" 
     } 
Смежные вопросы