首页 > 解决方案 > 如何切断 -Delimiter -Header 'xxx' 下列中的所有值

问题描述

我的重要代码部分(这有效):

$getFile = Get-Content $file |
           ConvertFrom-Csv -Delimiter ";" -Header "Printer","Model","MAC","IP_adresa","ID_terminalu" |
           Sort-Object -Property MAC, IP_adresa |
           Group-Object MAC |
           ForEach {$_.Group | Select-Object -First 1} |
           ConvertTo-Csv -NoTypeInformation |
           % {$_.Replace('"','')} |
           Select-Object -SkipLast 1

我在 CSV 中的标题是:“打印机”、“型号”、“MAC”、“IP_adresa”、“ID_terminalu”。问题是在某些特定行中,“MAC”字段包含两个用 分隔的 MAC 地址,,例如:

苹果电脑
00-1B-A9-85-88-1A,00-22-58-5E-7D-31

使用脚本后,我从这些特定行获得输出,如下所示:

打印机型号 MAC IP_adresa ID_terminalu
TCZ176100 Brother_MFC 00-1B-A9-85-88-1A 00-22-58-5E-7D-31 192.168.xx

在这个特定的行中,IP 地址移动了一个位置,而 MAC 在这里是 2x,这很糟糕。

我只需要为 17 个字符的 MAC 标头切断所有行 == 长度为一个 MAC 地址。我尝试了很多不同的方法,但都没有奏效。我不知道如何获取特定标题下的值(当标题有 5 个属性时)并从中编辑一个特定的值。

在此处输入图像描述

我试过这个(不起作用):

$getFile = (Get-Content $file | ConvertFrom-Csv -Delimiter ";" -Header 'Tiskarna','Model','MAC','IP_adresa','ID_terminalu') |
           select Tiskarna, Model, @{Name="MAC".Substring(0,16);Expression={$_."MAC"}}, IP_adresa, ID_terminalu |
           Sort-Object -Property MAC, IP_adresa |
           Group-Object MAC |
           ForEach {$_.Group | Select-Object -First 1} |
           ConvertTo-Csv -NoTypeInformation |
           % {$_.Replace('"','')} |
           Select-Object -SkipLast 1

标签: powershell

解决方案


假设您只需要第一个 MAC 地址,您应该执行以下操作:

$headers = 'Printer', 'Model', 'MAC', 'IP_adresa', 'ID_terminalu'

$csv = Import-Csv -Delimiter ';' -Header $headers

foreach ($row in $csv) {
    if ($row.MAC.Contains(',')) {
        $row.MAC = $row.MAC.Split(',')[0]
    }
}

$csv | Sort-Object MAC, IP_adresa | ...

推荐阅读