如何将Json参数传递给powershell脚本

nnvyjq4y  于 2022-12-05  发布在  Shell
关注(0)|答案(4)|浏览(212)

我想将Json数据传递给Powershell脚本。

PowerShell脚本:

Get-AzMySqlFirewallRule -资源群组名称“dev”-服务器名称“dev-DB-Server”|输出文件“file.json”
New-AzMySqlFirewallRule -名称“”-资源组名称“dev”-服务器名称“dev-core”-结束IP地址“”-开始IP地址““
在上面的powershell脚本中,我需要从下面提到的Json文件中获取“”的值。因此,如何在运行时获取Json参数值,所有3个参数都应传递给上面的命令,以便它将创建新的防火墙规则到新的数据库服务器。
此外,当我运行powershell命令(Get-AzMySqlFirewallRule -资源组名称“dev”-服务器名称“dev-DB-Server”|Out-File“file.json”)我正在以下面的格式获取Json文件数据。不确定此格式是否正确,但我需要从pdbr_home,1.2.3.4和www.example.com开始的以下值5.6.7.8,类似地,另外2行数据应传递到此处的powershell命令New-AzMySqlFirewallRule -Name“”-ResourceGroupName“dev”-ServerName“dev-core”-EndIPAddress“”- 通过for循环启动IP地址“".

文件.Json:

[
        {
        "EndIPAddress": "1.3.2.2",
        "Id": "/subscriptions/abcdefg/resourceGroups/dev/providers/Microsoft.DBforMySQL/servers/db-dev-  vm/firewallRules/praveen_Home",
        "Name": "praveen_Home",
        "StartIPAddress": "4.3.1.2",
        "Type": "Microsoft.DBforMySQL/servers/firewallRules"
      },
      {
        "EndIPAddress": "2.4.5.6",
        "Id": "/subscriptions/abcdefg/resourceGroups/dev/providers/Microsoft.DBforMySQL/servers/db-dev-  vm/firewallRules/pdbr_Home",
        "Name": "pdbr_Home",
        "StartIPAddress": "3.2.1.2",
        "Type": "Microsoft.DBforMySQL/servers/firewallRules"
      }
    ]

下面的命令输出如下。
PS /home/praveen〉获取命令 json

CommandType     Name                                               Version    Source
-----------     ----                                               -------    ------
Cmdlet          ConvertFrom-Json                                   7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          ConvertTo-Json                                     7.0.0.0    Microsoft.PowerShell.Utility
Cmdlet          Test-Json                                          7.0.0.0    Microsoft.PowerShell.Utility
Application     json_pp                                            0.0.0.0    /usr/bin/json_pp
Application     json_pp                                            0.0.0.0    /bin/json_pp

错误:

错误:

New-AzMySqlFirewallRule: /home/praveen/dbtest.ps1:21
Line |
  21 |  …  -ServerName "praveen-dev" -EndIPAddress $entry.EndIPAddress -StartI …
     |                                              ~~~~~~~~~~~~~~~~~~~
     | Cannot bind argument to parameter 'EndIPAddress' because it is an empty string.

最后一个解决方案现在对我很有效:

####################### 正在将防火墙规则从源数据库服务器更新到目标数据库服务器###################

Write-Host -NoNewline "Updating Firewall rules from Soiurce DB server to Target DB server"
Get-AzMySqlFirewallRule -ResourceGroupName $ResourceGroupName -ServerName $SourceDBServerName | Select-Object Name, StartIPaddress, EndIPaddress | Convertto-Json | Out-File "firewallrule.json"
foreach ($frule in (Get-Content firewallrule.json -raw | ConvertFrom-Json)) {
  New-AzMySqlFirewallRule -Name $frule.Name -ResourceGroupName $ResourceGroupName -ServerName $TargetDBServerName -EndIPAddress $frule.EndIPAddress -StartIPAddress $frule.StartIPAddress
}
2nbm6dog

2nbm6dog1#

在写入文件. Docs之前使用Convertto-Json:https://learn.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertto-json?view=powershell-7.2

Get-AzMySqlFirewallRule -ResourceGroupName "dev" -ServerName "dev-DB-Server" | Convertto-Json | Out-File "file.json"

按要求编辑:

Get-AzMySqlFirewallRule -ResourceGroupName "dev" -ServerName "dev-DB-Server" | Select-Object Name,"StartIP address", "EndIP address"| Convertto-Json | Out-File "file.json"

另一个按要求编辑(修复了我的错误-谢谢你@sage pourpre):

foreach ($entry in (Get-Content file.json -raw | ConvertFrom-Json) {
    New-AzMySqlFirewallRule -name $entry.Name `
    -ResourceGroupName "dev" `
    -ServerName "dev-core" `
    -StartIPAddress $entry.StartIPAddress `
    -EndIPAddress $entry.EndIPAddress
}
x33g5p2x

x33g5p2x2#

请尝试以下操作:

Get-AzMySqlFirewallRule -ResourceGroupName "dev" -ServerName "dev-DB-Server" | Convertto-Json | Out-File "file.json"

$data = Get-Content "C:\Users\me\file.json" | Out-String | ConvertFrom-Json #replace path to where you have exported the json file

foreach ($line in $data) {
    New-AzMySqlFirewallRule -name $line.Name `
    -ResourceGroupName "dev" `
    -ServerName "dev-core" `
    -StartIPAddress $line.StartIPAddress `
    -EndIPAddress $line.EndIPAddress
}

另一种不同的方法(尽管问题是针对JSON)是将规则存储在变量中。

$rules = Get-AzMySqlFirewallRule -ResourceGroupName "dev" -ServerName "dev-DB-Server"
    
    foreach ($rule in $rules){
        New-AzMySqlFirewallRule -name $rule.Name `
            -ResourceGroupName "dev" `
            -ServerName "dev-core" `
            -StartIPAddress $rule.StartIPAddress `
            -EndIPAddress $rule.EndIPAddress
}
6uxekuva

6uxekuva3#

我能够修复这个解决方案的帮助下,所有上述输入前几天。感谢所有。真的很感谢你的帮助。

将防火墙规则从源数据库服务器更新到目标数据库服务器
Write-Host -NoNewline "Updating Firewall rules from Soiurce DB server to Target DB server"
Get-AzMySqlFirewallRule -ResourceGroupName $ResourceGroupName -ServerName $SourceDBServerName | Select-Object Name, StartIPaddress, EndIPaddress | Convertto-Json | Out-File "firewallrule.json"
foreach ($frule in (Get-Content firewallrule.json -raw | ConvertFrom-Json)) {
  New-AzMySqlFirewallRule -Name $frule.Name -ResourceGroupName $ResourceGroupName -ServerName $TargetDBServerName -EndIPAddress $frule.EndIPAddress -StartIPAddress $frule.StartIPAddress
}
yqkkidmi

yqkkidmi4#

//role-definition.json

{
    "RoleName": "MyReadWriteRole",
    "Type": "CustomRole",
    "AssignableScopes": ["/"],
    "Permissions": [{
        "DataActions": [
            "Microsoft.DocumentDB/databaseAccounts/readMetadata",
            "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/items/*",
            "Microsoft.DocumentDB/databaseAccounts/sqlDatabases/containers/*"
        ]
    }]
}

把它转换成json对象,因为我需要把它作为powershell参数中的一个参数来传递。
1.已创建powershell参数
$roleDef= @”{“角色名称”:“我的读写角色”,“类型”:“自定义角色”、“可分配作用域”:["/"],“权限”:[{“数据操作”:[“Microsoft.文档数据库/数据库帐户/读取元数据”,“Microsoft.文档数据库/数据库帐户/SQL数据库/容器/项目/",“Microsoft.文档数据库/数据库帐户/SQL数据库/容器/”] }] }“@
1.$jsonObject = $角色定义|转换自Json

  1. az cosmosdb sql角色定义创建--帐户名cosmosdbaccname --资源组'my-rg' --正文$jsonObject
    但我得到以下错误-无法将字符串解析为JSON:@{角色名称=我的读写角色;类型=自定义角色;可分配作用域=系统.对象[];权限=System.Object[]}错误详细信息:预期值:第1行第1列(字符0)

相关问题