我试图在函数中创建 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
我不认为我完全理解函数,但读了这么多书后我真的不知道如何处理这个问题。
一种方法是将两个对象从函数发送到输出流,这实际上返回一个值的数组:
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