PowerShell: передача ArrayList объектов в другой скрипт в качестве аргумента - PullRequest
1 голос
/ 02 мая 2020

Надеюсь, у вас все хорошо и хорошо!

Я новичок в PowerShell, поэтому извиняюсь, если это что-то базовое c, что я не понимаю. Я искал решение по всему Google.

Я пытаюсь передать ArrayList, содержащий объекты, в другой скрипт PowerShell, чтобы выполнить что-то еще.

Сообщение об ошибке, что я получение: «Невозможно обработать преобразование аргумента для параметра« al ». Невозможно преобразовать значение« System.Collections.Hashable System.Collections.Hashable System.Collections.Hashable »типа« System.String »в тип« System.Collections.ArrayList ». ""

В script1.ps1:

$al = New-Object System.Collections.ArrayList

...

$obj =  @{"var1"="apple"; "var2"="banana"; "var3"="carrot";}
$al.Add($obj)

...


foreach ($i in $al) {
    $temp = $($i.var1)
    write-host "$temp"     #outputs "apple" correctly
}

invoke-expression -Command "script2.ps1 -al '$al'"

В script2.ps1:

param ([System.Collections.ArrayList]$al)

...

foreach ($i in $al) {
    $temp = $($i.var1)
    write-host "$temp"     #error message
}

Заранее спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 02 мая 2020

По причине, с которой я не знаком, Invoke-Expression преобразует ваш ArrayList в HashTable. Если вам действительно нужен ArrayList в script2.ps1, вы можете сделать $al глобальной переменной (см. Ниже).

Обновленный script1.ps1

$al = New-Object System.Collections.ArrayList
$obj = @{"var1" = "apple"; "var2" = "banana"; "var3" = "carrot"; }
$al.Add($obj)

foreach ($i in $al) {
    $temp = $($i.var1)
    write-host "$temp"     
}

$Global:al = $al

invoke-expression -Command "$PSScriptRoot\script2.ps1"

Обновленный script2.ps1

param()

$Global:al.GetType().FullName

foreach ($i in $Global:al) {
    $temp = $($i.var1)
    write-host "$temp"     
}
0 голосов
/ 02 мая 2020

То, что вы создаете в $ obj, является хеш-таблицей. Нет необходимости помещать это в список массивов для того, что вы хотите. Вы должны быть в состоянии сделать это.

В скрипте 1

$obj =  @{"var1"="apple"; "var2"="banana"; "var3"="carrot"}
Write-Host $obj["var1"]
& .\script2.ps1 -ht $obj

Скрипт 2

Param (
    [hashtable]$ht
)
Write-Host $ht["var1"]

ArrayList не будет использоваться для спаривания значения ключа.

[System.Collections.ArrayList]$al = "apple","banana","carrot"
$al.Add("orange")

Отчасти проблема в том, что вам не нужно добавлять кавычки вокруг переменной, она преобразует $al в строку.

& .\script2.ps1 -al $al

Вы должны решить, что лучше для работы, как правило, словарь или список. Это обсуждалось везде в течение многих лет.

...