Передача объекта из одного скрипта в другой - PullRequest
1 голос
/ 10 мая 2019

У меня проблема с передачей члена массива другому сценарию. У меня есть скрипт сборки VM, который извлекает из CSV, в результате я получаю объект $ VM с .Name, .CPU, .RAM, .IP и т. Д. Я хочу передать этот объект VM другому сценарию (внутри нового сервера ), который затем может действовать, но не в состоянии это сделать. Я проверял правильный синтаксис, чтобы передать простой массив, как показано ниже, но все еще не увенчался успехом:

CSV:

Name,NumCPU,MemoryGB,IPAddress
JLTest01,2,4,172.24.16.25

script1:

Function TestMe {
[CmdLetBinding()]
Param (
  [Parameter(Mandatory, Position=1)]
     [array]$arr
)

$arr | Out-GridView
}

TestMe

Сценарий вызова:

$aVMs = Import-Csv -Path "PathToCsv"

foreach($VM in $aVMs) {  
   $command = "<path>\TestMe.ps1 " + "-arr $($VM)"
   Invoke-Expression $command
}

Это приводит к ошибке, которая возникает при разборе массива. Ошибка гласит:

Термин «JLTest01» не распознается как имя командлета, функции, файла сценария или работоспособной программы. Проверьте правильность написания имени или, если путь был указан, проверьте правильность пути и повторите попытку. В строке: 1 символ: 48 + ... \ Desktop \ TestMe.ps1 -arr @ {Name = JLTest01; NumCPU ...

Просто пытаюсь выяснить, что именно я делаю неправильно, и что мне нужно сделать, чтобы передать объект второму сценарию.

1 Ответ

1 голос
/ 10 мая 2019

Не используйте Invoke-Expression (который редко является подходящим инструментом, и обычно следует избегать по соображениям безопасности ):

Струнизация пользовательских объектов, выводимых с помощью Import-Csvв исполнении $($VM) не сохраняет исходные объекты;это приводит к хеш-таблице - , как представление, которое не подходит для программной обработки и нарушает синтаксис командной строки, которую вы передаете Invoke-Expression.

Вместо этого просто вызовите вашнепосредственно сценарий:

$aVMs = Import-Csv -Path "PathToCsv"

.\TestMe.ps1 -arr $aVMs

Обратите внимание, что я передаю $aVMs в целом вашему сценарию, учитывая, что ваш параметр -arr имеет тип массива.

Если вылучше обрабатывайте объекты один за другим, придерживайтесь подхода foreach (но тогда вы должны объявить тип вашего $arr параметра как [pscustomobject] вместо [array]):

$aVMs = Import-Csv -Path "PathToCsv"

foreach ($VM in $aVMs) {
  .\TestMe.ps1 -arr $VMs
}

Другойможно объявить $arr как принимающий конвейерный ввод, добавить блок process в свой сценарий, а затем pipe $aVMs в свой сценарий ($aVMs | .\TestMe.ps1).


Кроме того, не вкладывайте функцию с тем же именем в ваш скрипт .ps1, который вы вызываете из скрипта, особенно если не передать аргументы;Сценарии могут напрямую объявлять параметры, как функции:

[CmdLetBinding()]
Param (
  [Parameter(Mandatory, Position=1)]
  [array]$arr
)

$arr | Out-GridView
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...