提问人:TheDemonLord 提问时间:5/31/2023 最后编辑:Ken WhiteTheDemonLord 更新时间:5/31/2023 访问量:36
有条件地格式化 for-each 循环中的字符串
Conditionally format a string in a for-each loop
问:
这是我的场景:
我有一个通过 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.
有没有更好的方法可以做到这一点,还是我想多了?
答:
2赞
Santiago Squarzon
5/31/2023
#1
我建议您使用 CSV 作为输入并构造遵循 Json 有效负载结构的对象,然后从那里将它们转换为 Json 字符串。这样做的好处是可以处理必须在 Json 字符串中转义的字符的转义,即 、 等。ConvertTo-Json
ConvertTo-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
-as
address = $item.var1 -as [int]
评论