Передача настраиваемого объекта другому сценарию ps1

Я хочу передать объект, созданный на заказ, из сценария в другой.

В начале subscript.ps1 находятся входные параметры:

param(
  [string]$someString,
  [object]$custClassData
 )

В main.ps1 я пытаюсь вызвать subscript.ps1 после введения настраиваемого объекта:

class custClass{
   [string]$string1
   [string]$string2
   [string]$string3
}

$customizedObject = [custClass]::new()
$customizedObject.string1 = "smthng1"
$customizedObject.string2 = "smthng2"
$customizedObject.string3 = "smthng3"
$scriptPath = ".\subscript.ps1"
$smString = "somethingsomething"
powershell.exe -file $scriptPath -someString $smString -custClassData $customizedObject

При таком вызове, если я проверяю индекс $ custClassData.GetType, он возвращает System.String, поэтому я получаю только имя объекта там. Если я создаю класс и объект в PowerShell вручную, помещаю туда данные и передаю их в индекс, типом будет custClass.

Вы не можете передать живой объект в новый процесс PowerShell.exe. Аргументы командной строки для собственных исполняемых файлов являются строками и не могут быть ничем другим.

user4003407 31.10.2018 12:29
1
1
2 784
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

В subscript.ps1 параметр $custClassData должен подтверждать тип [CustClass], а не [object]. Так что-то вроде:

param(
  [string]$someString,
  [CustClass]$custClassData
 )

Таким образом, данные, передаваемые в этот параметр, должны иметь тип [CustClass].

Кроме того, способ вызова subscript.ps1 не выглядит правильным. Вам не нужно вызывать powershell.exe, чтобы вызвать subscript.ps1. powershell.exe всегда выдает здесь ошибку.

Вам следует изменить subscript.ps1 на subscript.psm1, превратить содержимое скрипта в функцию и использовать ее следующим образом:

В индексе .psm1:

function Do-TheNeedful {
    param(
      [string]$someString,
      [CustClass]$custClassData
    )
    #~
    # do work
    #~
}

В main.ps1

class custClass{
   [string]$string1
   [string]$string2
   [string]$string3
}

Import-Module subscript.psm1

$customizedObject = [custClass]::new()
$customizedObject.string1 = "smthng1"
$customizedObject.string2 = "smthng2"
$customizedObject.string3 = "smthng3"
Do-TheNeedful -someString "a_string" -custClassData $customizedObject

В итоге мы получили индекс в виде точки и переместили функциональность в функцию. . .\subscript.ps1Do-TheNeedful -someString "xy" -custClassData $customizedObject

Pekafu 06.11.2018 15:03

Красивое решение! Твердо об этом подумал. Хорошая штука, @Pekafu

Matt Oestreich 06.11.2018 15:40

Вызов powershell.exe преобразует все в строки. Вместо этого запустите файл сценария напрямую:

Файл: sub.ps1

param(
  [object]$foo
)

$foo

Файл: main.ps1

class myClass{
    [string]$A
}

$myObject = [myClass]::new()
$myObject.A = "BAR"

.\sub.ps1 $myObject

Другие вопросы по теме