作者:敏--MM | 来源:互联网 | 2022-12-10 14:39
我开始学习PowerShell并且一直在尝试创建一个foreach循环,这样如果其中一个JSON项的状态不是STARTED,它就会使用其名称作为可执行命令中的变量来运行命令.这是我的json txt文件的样子;
{
"UNIT": {
"name": "AB",
"address": "fadasdaer",
"status": "MIA"
},
"UNIT": {
"name": "CD",
"address": "fadasdahsfaaer",
"status": "STARTED"
},
"UNIT": {
"name": "EF",
"address": "9afahegt",
"status": "DEAD"
}
}
我想要做的就是从我这里读取json.txt
并运行foreach循环并执行命令,其中名称包含在命令中.我目前有这样的东西,但我的PowerShell理解是有限的,它不起作用......
$JSON = json.txt
$check = $JSON | ConvertFrom-Json
$started=STARTED
foreach($unit in $check.unit){
if ($unit.status -notmatch $started) {
$name=$unit.name
executable.exe start $name
}
}
任何指导将不胜感激.
1> mklement0..:
您的主要问题是您的JSON格式不正确:它定义了一个对象,然后多次定义其UNIT
属性.
您应该将其定义为数组:请注意封闭的顶级[...]
和缺少UNIT
属性:
[
{
"name": "AB",
"address": "fadasdaer",
"status": "MIA"
},
{
"name": "CD",
"address": "fadasdahsfaaer",
"status": "STARTED"
},
{
"name": "EF",
"address": "9afahegt",
"status": "DEAD"
}
]
同时更正了JSON输入和其他语法问题:
$JSON = 'json.txt'
$check = Get-Content -Raw $JSON | ConvertFrom-Json
$started = 'STARTED'
foreach ($unit in $check) {
if ($unit.status -notmatch $started) {
$name = $unit.name
executable.exe start $name
}
}
如果您无法在源处修复JSON,则可以在将其传递给之前自行转换ConvertFrom-Json
:
$check = (Get-Content -Raw $JSON) `
-replace '\A\{', '[' `
-replace '\}\Z', ']' `
-replace '"UNIT": ' | ConvertFrom-JSON