Как перебирать свойства объекта входного параметра

У меня есть рабочий процесс Powershell для автоматизации Azure:

workflow wf
{
  param(
    [parameter(Mandatory=$True)]
    [object] $p
  )
  inlinescript
  {
    # ...
  }
}

Я тестирую его с помощью панели «Тест» и передаю значение как {"FirstName": "John", "LastName": "Smith"}. Я также пробовал {"FirstName"="John";"LastName"="Smith"} и добавлял @ перед обоими случаями.

Согласно этому

Если в модуле Runbook есть входной параметр типа объекта, используйте хэш-таблицу PowerShell с парами (имя, значение) для передачи значения. Например, если у вас есть следующий параметр в модуле Runbook: [Parameter (Mandatory = $true)][object] $FullName, вы передаете ему следующее значение: @{"FirstName"="Joe";"MiddleName"="Bob";"LastName"="Smith"}

Но во всех моих тестах $p равно нулю.

Как определить фактический объект, передать его, а затем выполнить итерацию по именам и значениям свойств?


person Jonas Stawski    schedule 19.12.2017    source источник
comment
Действительно ли значение передается как объект или оно передается как строка (JSON)?   -  person Ansgar Wiechers    schedule 20.12.2017
comment
простите мое невежество в PowerShell, но откуда мне знать?   -  person Jonas Stawski    schedule 21.12.2017
comment
Попробуйте без явного типа ([parameter(Mandatory=$True)]$p) и проверьте тип (Write-Host $p.GetType().FullName).   -  person Ansgar Wiechers    schedule 21.12.2017
comment
Интересно, после выполнения Write-Output "Type: " $p.GetType().FullName я получаю сообщение об ошибке Вы не можете вызвать метод для выражения с нулевым значением. Как с явным, так и без типа   -  person Jonas Stawski    schedule 21.12.2017
comment
Тогда, очевидно, ничего не передается параметру. Однако у меня слишком мало опыта работы с Azure и рабочими процессами, чтобы я мог помочь в дальнейшем.   -  person Ansgar Wiechers    schedule 21.12.2017
comment
Я обнаружил проблему, я забыл указать, что это выполняется как действие встроенного скрипта рабочего процесса, и поэтому мне пришлось использовать $Using:p для доступа к переменной.   -  person Jonas Stawski    schedule 22.12.2017


Ответы (1)


Чтобы получить доступ к входным параметрам в рамках действия рабочего процесса PowerShell, вы должны сделать это с помощью ключевого слова $Using. Как только я понял это, я смог увидеть, что тип передается как строка. Поэтому мне пришлось преобразовать строку json в объект с помощью командлета ConvertFrom-Json. Затем я смог перебрать свойства, получив свойство Properties для PSObject:

$pObj = $Using:p | ConvertFrom-Json
ForEach ($pr in $pObj.PSObject.Properties)
{
   #$pr.Name
   #$pr.Value
}
person Jonas Stawski    schedule 21.12.2017