【发布时间】:2021-11-29 09:57:16
【问题描述】:
我正在编写一个 PowerShell 函数来构建将传递给 API 的 JSON。我正在使用 PowerShell 5。
API 需要某种格式,下面是一个示例。
{
“task”: {
“status”: {
“name”: “Resolved”
},
“owner”: {
“name”: “User”
},
“comment”: “Test”
}
}
JSON 的结构存储在嵌套的哈希表中,然后通过管道传输到 ConvertTo-Json,我通过参数传递数据值。
$baseTask = @{
task = @{
comment = $Comment;
status = @{
name = $Status;
owner = @{
name = $Owner;
}
}
}
我希望函数尽可能动态,因此我将标识符设为强制,然后将所有其他参数设为可选。
Param(
[Parameter(Mandatory=$true)]
$TaskID,
$Comment,
$Status,
$Owner
)
如果参数为 NULL,我想从定义中删除该元素,这样它就不会将 NULL 传递给 API。我有下面的逻辑。
If([String]::IsNullOrEmpty($Comment)) {
$baseTask.task.Remove(‘comment’)
}
If([String]::IsNullOrEmpty($Status)) {
$baseTask.task.Remove(‘status’)
}
If([String]::IsNullOrEmpty($Owner)) {
$baseTask.task.Remove(‘owner’)
}
这行得通;但是,如果我有 50 个参数,那么我将通过空值检查进行大量重复,所以我觉得必须有一种更动态的方式来理想地使用某种循环来做到这一点。
我想过一个哈希表,其中包含变量名和要运行的命令之间的映射,但我找不到在执行期间获取变量名的方法。
任何帮助将不胜感激。
【问题讨论】:
-
$PSCmdlet.MyInvocation.MyCommand.Parameters.Keys | Where-Object { $_ -notin $PSBoundParameters.Keys } | ForEach-Object { $baseTask.task.Remove($_) } -
谢谢丹尼尔。会看看这个。
-
非常聪明,@Daniel - 你为什么不把它写下来作为答案呢? (您可以使用
$MyInvocation...,这也使解决方案在非高级功能中起作用)。
标签: json powershell