如何在PowerShell中遍历CSV匹配列名并创建AzSql防火墙规则
解决PowerShell遍历CSV创建Azure SQL防火墙规则的问题
问题根源:错误使用-contains运算符
你用-contains判断字符串是否包含子串是错误的。-contains是集合运算符,用于检查数组这类集合是否包含某个完整元素,而非判断字符串是否包含子串。比如'Start IPv4 address' -contains 'Start'会返回False,因为它在寻找与'Start'完全匹配的元素,而不是包含关系。
正确的字符串包含判断方式
要判断字符串是否包含指定子串,可选用以下三种方式:
- 通配符匹配:
$column.Name -like '*Start*'(*代表任意长度的字符) - 字符串内置方法:
$column.Name.Contains('Start')(默认区分大小写,忽略大小写可改用$column.Name.IndexOf('Start', [StringComparison]::OrdinalIgnoreCase) -ge 0) - 正则匹配:
$column.Name -match 'Start'
简化代码:直接访问CSV列名
其实无需遍历所有属性,Import-Csv会自动将CSV每行转换为对象,对象属性就是CSV的列名(注意列名含空格,需用引号包裹访问)。
完整工作代码
# 导入目标CSV文件 $csv = Import-Csv -Path "C:\Pathtofile" # 遍历CSV每一行数据 foreach ($line in $csv) { # 提取各字段值,列名含空格需用引号包裹 $ruleName = $line.'Name/desc' $startIp = $line.'Start IPv4 address' $endIp = $line.'End IPv4 Address' # 执行Azure SQL防火墙规则创建命令,替换为你的资源组和服务器名称 New-AzSqlServerFirewallRule -ResourceGroupName "ResourceGroup01" ` -ServerName "Server01" ` -FirewallRuleName $ruleName ` -StartIpAddress $startIp ` -EndIpAddress $endIp }
额外优化:添加错误处理
如果需要捕获命令执行异常,可加入try/catch块:
foreach ($line in $csv) { try { $ruleName = $line.'Name/desc' $startIp = $line.'Start IPv4 address' $endIp = $line.'End IPv4 Address' Write-Host "正在创建规则: $ruleName" New-AzSqlServerFirewallRule -ResourceGroupName "ResourceGroup01" ` -ServerName "Server01" ` -FirewallRuleName $ruleName ` -StartIpAddress $startIp ` -EndIpAddress $endIp ` -ErrorAction Stop Write-Host "规则 $ruleName 创建成功" } catch { Write-Error "创建规则 $ruleName 失败: $_" } }
内容的提问来源于stack exchange,提问作者user3486773
相关产品推荐
相关产品推荐

