1

我有 CSV 中的开关列表和这些开关所在的数据空间列表。在我的数据空间列表中,我有一个代表其关联的 DataSpace_Name 的 DataSpace_ID 字段。

我的交换机列表有一个 Host_Name 和 IP_Address 字段。我想要的是使用 PowerShell 和使用通配符进行正则表达式匹配,我想将 DataSpace 字段示例“ABC-COM”与列出 Host_Name 的开关匹配,该开关将是 ABC-COM-3750-SW1。我只想匹配ABC-COM...

然后对于我的结果,我希望输出根据找到的匹配项关联找到的 DataSpace_ID 值并将其包含在开关列表的输出中。

假设我匹配 ABC-COM = DATASPACE_ID 1 和 DEF-COM = DataSpace_ID 2,我的开关数据是:

主机名 IP 地址
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 .\AccessSwitchesForExport.csv -Header 'Host_Name', 'IP_Address' -Delimiter ","

    # 创建哈希表
    $哈希=@{}
    # 创建正则表达式条件
    $re = [正则表达式]".+(?=-\d+)"

    $dataSpaces 导出 | ConvertFrom-Csv | % { $hash.Add($_,”$_”) }

    # 输出
    $accessSwitchesForExport | ConvertFrom-Csv |
    选择对象@{ n = "DataSpace_ID"; e = { $hash[$re.Match($_.Host_Name).Value] } },* |
    Where-Object { $_.DataSpace_ID -ne $null }

我的 CSV 文件正如一些人所要求的那样,示例数据是:DataSpaces 和开关输出示例在帖子下方。DataSpaces 包含 DataSpace_ID 和 DataSpace_Name,开关 csv 包含 Host_Name 和 IP_Address 字段。

输出,如下所示,基于两个 csv 的比较,应显示:匹配 DataSpace_ID 和匹配的 Host_Name,以及最终表中的相关 IP 地址。

4

2 回答 2

0

谢谢你们每一个人的帮助!我使用上述建议的零碎部分得出以下结果,该结果完美运行并生成所需的数据。

#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 

输出符合预期,现在正在工作。

于 2019-07-28T00:41:33.210 回答
0

这是使用哈希表的解决方案。

$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
    }
}
于 2019-07-23T01:50:58.747 回答