[英]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.
感谢所有。非常感谢您的帮助。
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 -
所以我在下面做了 -
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/ " ] }] } "@
$jsonObject = $roleDef | $jsonObject = $roleDef | ConvertFrom-Json
ConvertFrom-Json 格式
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.