简体   繁体   English

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

[英]How to pass Json parameters to powershell script

I would like to pass Json data to Powershell script.我想将 Json 数据传递给 Powershell 脚本。

PowerShell script: PowerShell 脚本:

Get-AzMySqlFirewallRule -ResourceGroupName "dev" -ServerName "dev-DB-Server" |获取 AzMySqlFirewallRule -ResourceGroupName“dev”-ServerName“dev-DB-Server”| Out-File "file.json"输出文件“file.json”

New-AzMySqlFirewallRule -Name “” -ResourceGroupName "dev" -ServerName "dev-core" -EndIPAddress "" -StartIPAddress "" New-AzMySqlFirewallRule -Name “” -ResourceGroupName “dev” -ServerName “dev-core” -EndIPAddress “” -StartIPAddress “”

In the above powershell script I need to get values to "" from Json file mentioned below.So how to get Json parameter values during run time and all 3 parameters should be passed to the above command and so that it will create new firewall rule to new DB server.在上面的 powershell 脚本中,我需要从下面提到的 Json 文件中获取“”的值。那么如何在运行时获取 Json 参数值,所有 3 个参数都应该传递给上面的命令,这样它就会创建新的防火墙规则新的数据库服务器。

Also, when I run the powershell command ( Get-AzMySqlFirewallRule -ResourceGroupName "dev" -ServerName "dev-DB-Server" | Out-File "file.json" ) I am getting my Json file data in the below format.Not sure whether this format looks good but I need the below values start from pdbr_home,1.2.3.4 and 5.6.7.8 and similarly another 2 rows of data should be passed to my powershell command here New-AzMySqlFirewallRule -Name “” -ResourceGroupName "dev" -ServerName "dev-core" -EndIPAddress "" -StartIPAddress "".此外,当我运行 powershell 命令( Get-AzMySqlFirewallRule -ResourceGroupName "dev" -ServerName "dev-DB-Server" | Out-File "file.json" )时,我正在获取以下格式的 Json 文件数据。不确定这种格式是否看起来不错,但我需要以下值从 pdbr_home、1.2.3.4 和 5.6.7.8 开始,同样,应该将另外 2 行数据传递给我的 powershell 命令,此处为 New-AzMySqlFirewallRule -Name “” -ResourceGroupName "dev" - ServerName“dev-core”-EndIPAddress“”-StartIPAddress“”。 via for loop.通过 for 循环。

file.Json:文件.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"
      }
    ]

The below command output as follows.下面的命令 output 如下。

PS /home/praveen> Get-Command json 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

Error:错误:

Error:错误:

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.

Final solution worked for me now:最终解决方案现在对我有用:

##################### Updating Firewall rules from Soiurce DB server to Target DB server ################## ##################### 将防火墙规则从源数据库服务器更新到目标数据库服务器 ##################

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
}

Use Convertto-Json before writing file.在写入文件之前使用 Convertto-Json。 Docs: https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.utility/convertto-json?view=powershell-7.2文档: https ://docs.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"

EDIT as requested:按要求编辑:

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

Another EDIT as requested (fixed my mistake - thank you @sage pourpre):根据要求进行另一个编辑(修正了我的错误 - 谢谢@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
}

try the below:试试下面的:

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
}

A different method, although the question is for JSON, would be to just store the rules in a variable.尽管问题是针对 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
}

I was able to fix this solution with help of all the above inputs few days ago.几天前,我能够在上述所有输入的帮助下修复此解决方案。 Thanks to all.Really appreciated your help.感谢所有。非常感谢您的帮助。

Updating Firewall rules from Source DB server to Target DB server将防火墙规则从源数据库服务器更新到目标数据库服务器

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
}

//role-definition.json //角色定义.json

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

Coverting it into json object as i need to pass it as an argument in a powershell parameter.将其转换为 json object,因为我需要将其作为参数传递到 powershell 参数中。 So i did below -所以我在下面做了 -

  1. Created a powershell parameter创建了一个 powershell 参数

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

  2. $jsonObject = $roleDef | $jsonObject = $roleDef | ConvertFrom-Json ConvertFrom-Json 格式

  3. az cosmosdb sql role definition create --account-name cosmosdbaccname --resource-group 'my-rg' --body $jsonObject az cosmosdb sql 角色定义创建 --account-name cosmosdbaccname --resource-group 'my-rg' --body $jsonObject

but I get below error - Failed to parse string as JSON: @{RoleName=MyReadWriteRole;但我得到以下错误 - 无法将字符串解析为 JSON:@{RoleName=MyReadWriteRole; Type=CustomRole;类型=自定义角色; AssignableScopes=System.Object[]; AssignableScopes=System.Object[]; Permissions=System.Object[]} Error detail: Expecting value: line 1 column 1 (char 0) Permissions=System.Object[]} 错误详细信息:预期值:第 1 行第 1 列(字符 0)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM