Передайте несколько переменных из функции для дальнейшего использования в скрипте

Я пытаюсь создать переменную 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

Я не думаю, что полностью понимаю функции, но после столь долгого чтения я действительно не знаю, как с этим справиться.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
0
54
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

Выходной поток

Один из способов сделать это — просто отправить оба объекта в выходной поток из функции, которая фактически возвращает массив значений:

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.

Если бы я хотел подойти к этому, используя выходной поток с несколькими переменными, имеет ли значение, что переменные не будут одного типа? Одна из них — таблица HTML, а другая — строка или логическое значение.

JCoder92 30.05.2024 21:25

В любом случае это нормально, но версию pscustomobject проще поддерживать, если вы планируете добавлять или удалять возвращаемые значения. В потоковой версии, если вы перестанете возвращать первый элемент (индекс 0), все последующие значения сместятся на один индекс вверх, и это может оказать существенное влияние на весь код, вызывающий вашу функцию. В версии pscustomobject все, что происходит, — это то, что код, обратившийся к первому свойству, перестает работать — весь остальной код остается таким, какой он есть, потому что последующие имена свойств не меняются.

mclayton 30.05.2024 22:25

Также было бы намного проще читать код, использующий версию pscustomobject, потому что код содержит строки свойств имен $object.First, $object.Second и т. д.), а не просто $object[0], $object[1], а самодокументируемый код — это хорошо…

mclayton 30.05.2024 22:30

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