Powershell 如何遍历CSV并查找列名
问题描述
我有一个包含3列的CSV文件:
Name/desc Start IPv4 address End IPv4 Address
最终我需要在powershell中循环遍历此csv并执行以下操作:
New-AzSqlServerFirewallRule -ResourceGroupName "ResourceGroup01" -ServerName "Server01" -FirewallRuleName "Rule01" -StartIpAddress "192.168.0.198" -EndIpAddress "192.168.0.199"
我对Python很熟悉,但在PowerShell中却遇到了困难。以下是我目前的代码:
$csv = Import-Csv -Path "C:\Pathtofile"
foreach($line in $csv)
{
$properties = $line | Get-Member -MemberType Properties
for($i=0; $i -lt $properties.Count;$i++)
{
$column = $properties[$i]
$columnvalue = $line | Select -ExpandProperty $column.Name
if($column.name -contains 'Start'){
#write($column)
write($column.name)
}
write($column.name.GetType())
}
}
我的想法是首先检查列名是否包含“Start”,“End”或“Name”,但是我的if语句不起作用。我怀疑是因为我试图将对象与字符串进行比较。当我写下GetType()时,我对每一行都看到了这个:
IsPublic IsSerial Name BaseType
True True String System.Object
我不知道这是否意味着它是一个字符串还是其他什么?它看起来像是一个字符串,但我不明白为什么我的if语句不起作用。
我觉得如果能解决这个问题,我大概可以设置变量并在AzSqlServerFirewallRule命令中使用它们。
解决方案
假设列名确切命名为Name/desc
,Start IPv4 address
和End IPv4 Address
,并且您想要执行New-AzSqlServerFirewallRule
,您可以简化您的代码来循环遍历$csv
中的每个对象,然后可以使用点符号来引用每个属性的值:
$csv = Import-Csv -Path 'C:\Pathtofile'
foreach ($object in $csv) {
$newAzSqlServerFirewallRuleSplat = @{
ResourceGroupName = 'ResourceGroup01'
ServerName = 'Server01'
FirewallRuleName = $object.'Name/desc'
StartIpAddress = $object.'Start IPv4 address'
EndIpAddress = $object.'End IPv4 Address'
}
New-AzSqlServerFirewallRule @newAzSqlServerFirewallRuleSplat
}
此代码还使用了splatting将参数绑定到您的命令,以提高可读性。