从函数传递多个变量以在脚本中进一步使用

问题描述 投票:0回答:1

我试图在函数中创建 true/false 变量,然后在脚本中稍后使用该变量。 我当前的函数有一个有效的返回值,但我似乎无法理解如何返回或创建新对象来传递多个变量。

随着脚本现在的运行,该函数会使用标签名称的参数来调用,该参数会调用 API 调用来检索 JSON 文件,然后解析该文件并执行几个步骤。 当我调用该函数时,如果 json 中的 $values 包含任何低于 1 的内容,我希望它返回 HTML 表以及 true 或 false 变量。

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'
}

以“#Check values and set $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

我不认为我完全理解函数,但读了这么多书后我真的不知道如何处理这个问题。

powershell function return
1个回答
0
投票

输出流

一种方法是将两个对象从函数发送到输出流,这实际上返回一个值的数组

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"

有关更多详细信息,请参阅分配多个 Vvariables

自定义对象

另一种选择是将值捆绑到自定义对象的属性中:


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 "second"

写输出

请注意,您不需要特别需要在上述代码示例中放置命令名称

write-output
- 任何未捕获的表达式结果都会隐式返回到输出流,就像您调用
write-output
一样。

另请注意,

return $x
在功能上等同于
write-output $x; return

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.