Я пытаюсь создать переменную true/false внутри функции, а затем использовать эту переменную позже в сценарии. Моя текущая функция имеет возврат, который работает, но я не могу понять, как вернуть или создать новый объект для передачи нескольких переменных.
Поскольку скрипт теперь работает, функция вызывается с параметром имени тега, который вызывает вызов API, который извлекает файл JSON, а затем анализирует этот файл и выполняет несколько шагов. Когда я вызываю функцию, я хочу, чтобы она возвращала таблицу HTML, а также переменную true или false, если значения $ из json содержат что-либо ниже 1.
function Request-API {
[CmdletBinding()]
[OutputType([psobject])]
param (
$tagName
)
Invoke-WebRequest -Uri "***removed for company privacy*** -Headers $headers -OutFile $DataExplorerJson
#Store API results as variable
$json = Get-Content $DataExplorerJson -Raw | ConvertFrom-Json
#Check values and set $subjectCheck to TRUE if there are failures
$values = @($json.result.data.values)
foreach ($i in $values) {
if ($i -lt 1) {
$subjectCheck = $true
}
}
Write-Output "SubjectCheck "$subjectCheck
###Create $report object of containing table data
## Retrives value status from JSON. If greater than 1 sets to PASS
$condition = '1'
try {
$report = $json.result.data | ForEach-Object {
$status = 'FAIL'
if ($_.values[0] -ge $condition) {
$status = 'PASS'
}
#Adds synthetic monitor names and $values to object
[pscustomobject]@{
Application = $_.dimensionmap.PSObject.Properties.Match('*.name').Value
Status = $status
}
}
}
catch {
## Write-Output 'No failures occured'
}
#Convert report to HTML and add XML
[xml]$fullTable = $report | Select-Object Application, Status | ConvertTo-Html -Fragment
##Set color for PASS & FAIL stastuses
try {
$fullTable.SelectNodes("/table/tr/td[text()='PASS']").SetAttribute('class', 'pass')
$fullTable.SelectNodes("/table/tr/td[text()='FAIL']").SetAttribute('class', 'fail')
}
catch {
## Write-Output 'No failures occured'
}
return $fullTable
}
## Call function with $tag param
$medicalReview = 'Medical%20Review~'
$priorAuth = 'Prior%20Auth~'
$medicalReviewTable = Request-API $medicalReview
$subjectMR = $subjectCheck
Write-Host "subject check subjectMR: "$subjectMR
$priorAuthTable = Request-API $priorAuth
$subjectPA = $subjectCheck
Write-Host "subject check subjectPA: "$subjectPA
if ($subjectMR -eq $true -or $subjectPA -eq $true) {
$subject = 'Dynatrace Synthetic On Demand Monitoring Report - FAIL'
} else {
$subject = 'Dynatrace Synthetic On Demand Monitoring Report - PASS'
}
Проблема заключается в коде, начинающемся с «#Проверить значения и установить $subjectCheck». Я знаю, что $subjectCheck не передает переменную.
Я также пробовал:
$values = @($json.result.data.values)
foreach ($i in $values) {
if ($i -lt 1) {
$subjectCheck = New-Object -Property $true -TypeName psobject
}
}
Write-Output "SubjectCheck "$subjectCheck
Я не думаю, что полностью понимаю функции, но после столь долгого чтения я действительно не знаю, как с этим справиться.





Один из способов сделать это — просто отправить оба объекта в выходной поток из функции, которая фактически возвращает массив значений:
function Get-TwoResults
{
write-output "one"
write-output "two"
}
$results = Get-TwoResults
$results[0] # displays "one"
$results[1] # displays "two"
Вы также можете «распаковать» элементы возвращаемого массива в несколько переменных, например:
$first, $second = Get-TwoResults
$first # displays "one"
$second # displays "two"
Дополнительную информацию см. в разделе Назначение нескольких переменных V.
Другой вариант — объединить значения в свойства пользовательского объекта:
function Get-CustomObject
{
write-output [pscustomobject] @{
"First" = "one"
"Second" = "two"
}
}
$object = Get-CustomObject
$object
# displays:
#
# Name Value
# ---- -----
# First one
# Second two
и вы можете получить доступ к свойствам следующим образом:
$object.First # displays "one"
$object.Second # displays "two"
Обратите внимание, что вам не нужно специально указывать имя команды write-output в приведенных выше примерах кода — любые неперехваченные результаты выражения неявно возвращаются в выходной поток, как если бы вы вызвали write-output.
Два примера ниже работают так же хорошо, как и приведенные выше:
function Get-TwoResults
{
"one"
"two"
}
function Get-CustomObject
{
[pscustomobject] @{
"First" = "one"
"Second" = "two"
}
}
Также обратите внимание, что return $x функционально эквивалентен write-output $x; return.
В любом случае это нормально, но версию pscustomobject проще поддерживать, если вы планируете добавлять или удалять возвращаемые значения. В потоковой версии, если вы перестанете возвращать первый элемент (индекс 0), все последующие значения сместятся на один индекс вверх, и это может оказать существенное влияние на весь код, вызывающий вашу функцию. В версии pscustomobject все, что происходит, — это то, что код, обратившийся к первому свойству, перестает работать — весь остальной код остается таким, какой он есть, потому что последующие имена свойств не меняются.
Также было бы намного проще читать код, использующий версию pscustomobject, потому что код содержит строки свойств имен $object.First, $object.Second и т. д.), а не просто $object[0], $object[1], а самодокументируемый код — это хорошо…
Если бы я хотел подойти к этому, используя выходной поток с несколькими переменными, имеет ли значение, что переменные не будут одного типа? Одна из них — таблица HTML, а другая — строка или логическое значение.