2017-01-25 5 views
2

В настоящее время я очень смущен Powershell и как он обрабатывает массивы/массивы и объекты PSObjects/CustomObjects.Powershell возвращает другой тип данных в зависимости от количества элементов

Высокий уровень:

Я пытаюсь импортировать файл CSV и вставив в конкретных строках «заполнители» записи. На самом деле это нормально работает. Моя единственная проблема заключается в том, что если CSV содержит только 1 элемент (линия), Powershell создает PsCustomObject. Если имеется несколько строк, Powershell предоставляет массив.

1 элемент в `$ pConnectionsOnMpDevice

$pConnectionsOnMpDevice = ($pList | ?({$_.device -like "*$pDevice*"})) 
($pConnectionsOnMpDevice).getType() 

IsPublic IsSerial Name BaseType 
True True PsCustomObject[] System.Object 

п элемент в $pConnectionsOnMpDevice

$pConnectionsOnMpDevice = ($pList | ?({$_.device -like "*$pDevice*"})) 
($pConnectionsOnMpDevice).getType() 

IsPublic IsSerial Name BaseType 
True True Object[] System.Array 

Наконец я пытаюсь добавить элемент:

$pConnectionsOnMpDevice += $MpObject 

(один из моих первых подходов было для использования (FYI):

#$pConnectionsOnMpDevice.Insert($index,$match) 

Если я пытаюсь добавить $MpObject к $pConnectionsOnMpDevice я получаю следующее сообщение об ошибке:

Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named 'op_Addition'. 
At C:\Scripts\PS_GenerateMPConfig\PS_GenerateMPConfig_06_f.ps1:90 char:13 
+    $pConnectionsOnMpDevice += $MpObject 
+    ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 
    + CategoryInfo   : InvalidOperation: (op_Addition:String) [], RuntimeException 
    + FullyQualifiedErrorId : MethodNotFound 

Я предполагаю, что это та же проблема, как описано here

Я пытался бросить $pConnectionsOnMpDevice к Arraylist по:

[System.Collections.ArrayList]::$pConnectionsOnMpDevice += $MpObject 

Но все же никакого успеха.

Есть ли у кого-нибудь совет, как я могу добавить элемент?

ответ

5

Использование оператора массива подвыражения (@()), чтобы заставить значение выражения возвращает массив:

$pConnectionsOnMpDevice = @($pList | ?({$_.device -like "*$pDevice*"})) 

I tried to cast $pConnectionsOnMpDevice to an Arraylist by:

[System.Collections.ArrayList]::$pConnectionsOnMpDevice += $MpObject 

Это не слепок, что статический вызов - PowerShell будет вызывать любые статические метод или свойство имеет то же имя, что и "$pConnectionOnMpDevice".

Удалите ::, если вы хотите операцию произнесения:

$array = 1,2,3 
$arraylist = [System.Collections.ArrayList]$array 
+0

Mathias, Большое спасибо вам помочь. Маленькое изменение, но успешное :) – cwa

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