有条件地格式化 for-each 循环中的字符串

Conditionally format a string in a for-each loop

提问人:TheDemonLord 提问时间:5/31/2023 最后编辑:Ken WhiteTheDemonLord 更新时间:5/31/2023 访问量:36

问:

这是我的场景:

我有一个通过 Powershell 调用的 API,有效负载是一个 JSON 文件,这个 API 需要多次调用,每次有效负载都略有不同(想想将项目添加到列表中)。

下面是 JSON 模板的示例。

$JSONpaylod = @"
{
  "Config":
  {
  "address": $variable1,
  "authPassword": $variable2,
  "authUsername": $variable3}
}
"@

因为它需要多次完成,所以我将使用 For-Each 循环,例如:

For-each($_.item in $list){
Do things, then call the API}

但是,我卡住的地方是,根据 $list 中的当前项目,我想根据查找更新 $variable 1、$variable 2 等。

在 PowerShell 中是否有一种优雅的方法可以做到这一点?一个想法是,在我的哈希表中$list,让它像这样:

Item, var1, var2, var3  
1, 23, 1111, admin  
2, 10, 1234, admin  

但这似乎很笨拙

$variable1 = $_.var1 etc.

有没有更好的方法可以做到这一点,还是我想多了?

PowerShell for 循环 变量

评论

0赞 Walter Mitty 5/31/2023
同时,我编写了一个简单的 csv 模板引擎,该引擎将 csv 数据复制到同名变量中,然后调用 Expand-String 来扩展模板。它是通用的。您可以从 www.github.com/dcressey/Expand-Csv 下载

答:

2赞 Santiago Squarzon 5/31/2023 #1

我建议您使用 CSV 作为输入并构造遵循 Json 有效负载结构的对象,然后从那里将它们转换为 Json 字符串。这样做的好处是可以处理必须在 Json 字符串中转义的字符的转义,即 、 等。ConvertTo-JsonConvertTo-Json"\/

$csv = @'
var1, var2, var3
23, 1111, admin
10, 1234, admin
'@ | ConvertFrom-Csv

foreach($item in $csv) {
    $payload = [pscustomobject]@{
        Config = [pscustomobject]@{
            address      = $item.var1
            authPassword = $item.var2
            authUsername = $item.var3
        }
    } | ConvertTo-Json

    # do stuff with payload
}

例如,以下内容将恰好在插值的位置失败(第 3 行,位置 20。"

从 JSON 转换失败,出现错误:解析值后遇到意外字符:b. 路径“Config.address”,第 3 行,位置 20。

$item = 'foo"bar'

@"
{
  "Config": {
    "address": "$item"
  }
}
"@ | ConvertFrom-Json

这将起作用:

[pscustomobject]@{
    Config = [pscustomobject]@{
        address = 'foo"bar'
    }
} | ConvertTo-Json | ConvertFrom-Json

评论

1赞 TheDemonLord 5/31/2023
这是我最终选择的解决方案 - 谢谢你。
0赞 Santiago Squarzon 5/31/2023
@TheDemonLord很高兴它很有帮助。请注意,使用 CSV 作为输入时,每个属性上的所有值都将是字符串,如果您需要 Json 字符串将值解析为其他类型,例如,如果应该是整数,则可以在构造对象时使用运算符:$item.var1-asaddress = $item.var1 -as [int]