我如何调用它以正确的方式工作。
test.ps1
function Check($file)
{
Write-Output "In function"
$test = Get-Content -Path $file |ConvertFrom-json
foreach ($line in $test)
{
if($line.1111111111 = "true")
{
$line.1111111111 = "false"
Write-Output "This is: 1111111111 and is now false"
}
if($line.1111111111 = "false")
{
Write-Output "Inside second"
}
}
}
settings.json
{
"1111111111": true,
"2222222222": true
}
所以我想在像这样的powershell中调用它
/test.ps1检查-文件C:\settings.json
但是我不能让它工作。我做错了什么?
还有没有一种方法可以在不知道111111111的名字的情况下读取它的名字,就像在这种情况下一样?
关于您的疑问:
还有没有一种方法可以在不知道111111111的名称的情况下读取它,就像在这种情况下一样?
您可以访问对象的PSObject.Properties
以了解其属性名称和值,如下所示。
至于你的条件陈述:
if($line.1111111111 = "true") { .. }
# and
if($line.1111111111 = "false") { .. }
您应该知道=
是一个赋值运算符,为了进行相等比较,您应该使用-eq
或-ceq
(区分大小写(。
下面是一个如何调用脚本并传入Json的示例,在这种情况下,我认为不需要函数。
注意,如果Json的结果是一个数组,这应该可以工作,但是如果它有嵌套的属性,这些属性是数组,这将无法正常工作。
使用test.json作为示例:
[{
"1111111111": true,
"2222222222": true
},
{
"3333333333": false,
"4444444444": true
}]
你可以这样运行脚本:
# Assuming script.ps1 and test.json are on the folder where we're located
PS /> $newJson = .script.ps1 .test.json
In script
This is: 1111111111 and is now false
This is: 2222222222 and is now false
This is: 3333333333 and was not updated
This is: 4444444444 and is now false
PS /> $newJson
[
{
"1111111111": false,
"2222222222": false
},
{
"3333333333": false,
"4444444444": false
}
]
脚本.ps1:
[cmdletbinding()]
param([string]$file)
Write-Host "In script"
$absolutePath = Convert-Path $file
$json = Get-Content -Path $absolutePath | ConvertFrom-Json
foreach ($object in $json)
{
foreach($prop in $object.PSObject.Properties)
{
if($prop.Value -eq $true) # Could be reduced to just `if($prop.Value)`
{
$prop.Value = $false
Write-Host "This is: $($prop.Name) and is now false"
}
else
{
Write-Host "This is: $($prop.Name) and was not updated"
}
}
}
$json | ConvertTo-Json