2016-09-20 2 views
1

Я пытаюсь отобразить некоторые данные, которые мой сценарий генерирует в PSObject, поэтому я могу экспортировать его в CSV, но единственный объект, который отображается, зависит от того, какой из них я сначала добавляю в массив.Невозможно отобразить PSObject

[email protected]("1","2","3") 
[email protected]("4") 
[email protected]() 
$pass | % { 
    $obj+=New-Object PSObject -Property @{Pass=$_} 
} 
$fail | % { 
    $obj+=New-Object PSObject -Property @{Fail=$_} 
} 
$obj 

Я также попытался это, но я получаю пустую строку, показывающую в таблице, где значение не в той колонке, которую я не хочу:

[email protected]("1","2","3") 
[email protected]("4") 
[email protected]() 
$pass | % { 
    $obj+=New-Object PSObject -Property @{Pass=$_;Fail=""} 
} 
$fail | % { 
    $obj+=New-Object PSObject -Property @{Pass="";Fail=$_} 
} 
$obj 

Мой желаемый результат:

Pass Fail 
---- ---- 
1  4 
2 
3 

Я пользуюсь Powershell V2.

ответ

0

Как вы поняли, PowerShell выводит только свойства первого элемента в вашем массиве. Его не спроектирован, чтобы распечатать вывод, который вы ожидаете, так, как вы его используете.


В качестве обходного пути, вы можете использовать for цикл, чтобы "построить" ваш желаемый результат:

[email protected]("1","2","3") 
[email protected]("4") 
[email protected]() 

for ($i = 0; $i -lt $pass.Count; $i++) 
{ 
    if ($fail.Count -gt $i) 
    { 
     $currentFail = $fail[$i] 
    } 
    else 
    { 
     $currentFail = "" 
    } 

    $obj+=New-Object PSObject -Property @{Fail=$currentFail;Pass=$pass[$i];} 
} 
$obj | select Pass, Fail 

Выход:

Pass Fail 
---- ---- 
1 4 
2   
3  
+0

Это замечательно, спасибо большое. –

+0

Добро пожаловать. Имейте в виду, что вы не увидите все записи, если '$ pass.count' меньше, чем' $ fail.count'. Если это может быть так, вы должны adpot скрипт. –

2

Другой ответ является правильным - вы» неправильное использование объектов. Это, как говорится, вот функция, которая поможет вам использовать их неправильно!

Function New-BadObjectfromArray($array1,$array2,$array1name,$array2name){ 
    if ($array1.count -ge $array2.count){$iteratorCount = $array1.count} 
    else {$iteratorCount = $array2.count} 
    $obj = @() 
    $iteration=0 
    while ($iteration -le $iteratorCount){ 
     New-Object PSObject -Property @{ 
      $array1name=$array1[$iteration] 
      $array2name=$array2[$iteration] 
     } 
     $iteration += 1 
    } 
    $obj 
} 

[email protected]("1","2","3") 
[email protected]("4") 

New-BadObjectfromArray -array1 $fail -array2 $pass -array1name "Fail" -array2name "Pass" 
+0

Получалось исключение: «Индекс находился за пределами массива». –

+0

Я снова запустил его - мой должен молча продолжать - вы хотя бы получаете выход? –

+0

Если я устанавливаю '$ ErrorActionPreference' к SilentlyContinue, я получаю только одну строку: ' Сбой Pass ---- ---- 4 1 ' –

Смежные вопросы