簡體   English   中英

如何將Json參數傳遞給powershell腳本

[英]How to pass Json parameters to powershell script

我想將 Json 數據傳遞給 Powershell 腳本。

PowerShell 腳本:

獲取 AzMySqlFirewallRule -ResourceGroupName“dev”-ServerName“dev-DB-Server”| 輸出文件“file.json”

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

在上面的 powershell 腳本中,我需要從下面提到的 Json 文件中獲取“”的值。那么如何在運行時獲取 Json 參數值,所有 3 個參數都應該傳遞給上面的命令,這樣它就會創建新的防火牆規則新的數據庫服務器。

此外,當我運行 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“”。 通過 for 循環。

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

下面的命令 output 如下。

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
}

在寫入文件之前使用 Convertto-Json。 文檔: 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"

按要求編輯:

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
}

試試下面的:

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
}

幾天前,我能夠在上述所有輸入的幫助下修復此解決方案。 感謝所有。非常感謝您的幫助。

將防火牆規則從源數據庫服務器更新到目標數據庫服務器

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
}

//角色定義.json

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

將其轉換為 json object,因為我需要將其作為參數傳遞到 powershell 參數中。 所以我在下面做了 -

  1. 創建了一個 powershell 參數

    $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 | ConvertFrom-Json 格式

  3. az cosmosdb sql 角色定義創建 --account-name cosmosdbaccname --resource-group 'my-rg' --body $jsonObject

但我得到以下錯誤 - 無法將字符串解析為 JSON:@{RoleName=MyReadWriteRole; 類型=自定義角色; AssignableScopes=System.Object[]; Permissions=System.Object[]} 錯誤詳細信息:預期值:第 1 行第 1 列(字符 0)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM