我有一个CSV中的开关列表以及这些开关所在的数据空间列表。 在我的数据空间列表中,我有一个表示其关联DataSpace_Name的DataSpace_ID字段。
我的交换机列表有一个Host_Name和IP_Address字段。 我想要的是使用PowerShell和使用通配符的正则表达式匹配,我想将数据空间字段示例"ABC-COM"与开关列表Host_Name匹配,这将是ABC-COM-3750-SW1。 我只想匹配ABC-COM...
然后对于我的结果,我希望输出基于找到的匹配项关联找到的DataSpace_ID值并将其包含在开关列表的输出中。
假设我匹配 ABC-COM = DATASPACE_ID 1 和 DEF-COM = DataSpace_ID 2,我的交换机数据为:
Host_Name IP_Address ABC-COM-3750-SW1 IP 192.168.1.2 ABC-COM-3750-SW2 IP: 192.168.1.3 DEF-COM-3750-SW1 IP: 192.168.3.5 DEF-COM-3750-SW2 IP: 192.168.3.6
因此,最终您将根据数据空间列表的比较从交换机列表中获得此输出,除了它会从数据空间名称的其他比较列表中添加DataSpace_ID列... 切换列表 输出如下所示:
DataSpace_ID Host_Name IP_Address 1 ABC-COM-3750-SW1 IP 192.168.1.2 1 ABC-COM-3750-SW2 IP: 192.168.1.3 2 DEF-COM-3750-SW1 IP: 192.168.3.5 2 DEF-COM-3750-SW2 IP: 192.168.3.6
这是我根据您的一些输入修改的最新代码,我不再收到错误,但是我的输出也没有返回任何结果。
清除主机 $hash.clear() $dataSpacesExport = import-csv -path .\DataSpaces_Export.csv -header 'DataSpace_ID', 'DataSpace_Name' -delimiter "," $accessSwitchesForExport = import-csv -path .\AccessSwitchForExport.csv -header 'Host_Name', 'IP_Address' -delimiter "," # 创建哈希表 $hash = @{} # 创建正则表达式标准 $re = [正则表达式]".+(?=-\d+)" $dataSpacesExport |转换自 CSV |% { $hash.添加($_,"$_") } # 输出 $accessSwitchesForExport |转换自 CSV | 选择对象 @{ n = "DataSpace_ID"; e = { $hash[$re.匹配($_。Host_Name)。值] } },* | Where-Object { $_.DataSpace_ID -ne $null }
我的 CSV 文件 正如一些人所要求的,示例数据是: 数据空间和交换机输出示例在下面的帖子中。 数据空间包含DataSpace_ID和DataSpace_Name,交换机 csv 包含Host_Name和IP_Address字段。
基于两个 csv 的比较的输出如下所示,应显示: 最终表中匹配DataSpace_ID与匹配Host_Name及其关联的 IP 地址。
这是一个使用哈希表的解决方案。
$dataSpacesExport = @"
DataSpace_ID,DataSpace_Name
1,ABC-COM
2,DEF-COM
"@
$accessSwitchesForExport = @"
Host_Name,IP_Address
ABC-COM-3750-SW1,IP: 192.168.1.2
ABC-COM-3750-SW2,IP: 192.168.1.3
DEF-COM-3750-SW1,IP: 192.168.3.5
DEF-COM-3750-SW2,IP: 192.168.3.6
GHI-COM-3750-SW2,IP: 192.168.3.6
"@
$re = [regex]".+(?=-d+)"
# create hashtable
$id = @{}
$dataSpacesExport | ConvertFrom-Csv | ForEach-Object { $id[$_.DataSpace_Name] = $_.DataSpace_ID }
# output
$accessSwitchesForExport | ConvertFrom-Csv |
Select-Object @{ n = "DataSpace_ID"; e = { $id[$re.Match($_.Host_Name).Value] } },* |
Where-Object { $_.DataSpace_ID -ne $null }
输出如下。
DataSpace_ID Host_Name IP_Address
------------ --------- ----------
1 ABC-COM-3750-SW1 IP: 192.168.1.2
1 ABC-COM-3750-SW2 IP: 192.168.1.3
2 DEF-COM-3750-SW1 IP: 192.168.3.5
2 DEF-COM-3750-SW2 IP: 192.168.3.6
以下代码是另一种解决方案。在这种情况下,您不需要正则表达式。
$dataSpaces = $dataSpacesExport | ConvertFrom-Csv
$accessSwitchesForExport | ConvertFrom-Csv | ForEach-Object {
foreach ($ds in $dataSpaces) {
if (!$_.Host_Name.StartsWith($ds.DataSpace_Name)) { continue }
[pscustomobject]@{
DataSpace_ID = $ds.DataSpace_ID
Host_Name = $_.Host_Name
IP_Address = $_.IP_Address
}
break
}
}
谢谢大家的帮助! 我使用了上述建议的零碎部分来得出以下结果,该结果完美运行并生成所需的数据。
#Set Present Working Directory for path to save data to. #Clear any Hash Table Data prior to start of script // $id.clear() #Import current listing of Data Spaces and Access switches from CSV format // $dataSpacesExport = import-csv -Header DataSpace_ID, DataSpace_Name -Path ".DataSpaces_Export.csv" $accessSwitchesForExport = import-csv -Header Host_Name, Device_IP -Delimiter "," -Path ".AccessSwitchesForExport.csv" #Regex text matching criteria // $re = [regex]".+(?=-d+)" # create hashtable to store output // $id=@{} # Inject DataSpaces listing into Script for processing via hash table $id // $dataSpacesExport | % {$id[$_.DataSpace_Name] = $_.DataSpace_ID} # output - Compare Access Switch listing to DataSpaces Hashtable information, produce output to out-file sw_names.txt // $accessSwitchesForExport | Select-Object @{ n = "DataSpace_ID"; e = { $id[$re.Match($_.Host_Name).Value] } },* | Where-Object { $_.DataSpace_ID -ne $null } | Out-File ./sw_names.txt -Force
输出符合预期,现在正在工作。