我正在寻找一个在MAC地址的每两位数之后添加“ - ”的脚本。这里已经有一个脚本可以解决这个问题。
$macs = Get-Content C:\Users\metho\Desktop\mac.txt
$output = foreach ($mac in $macs){
$mac.insert(2,"-").insert(5,"-").insert(8,"-").insert(11,"-").insert(14,"-")
}
$output | Out-File C:\Users\nmetho\Desktop\mac1.txt
我遇到的问题是我使用的CSV文件包含四列,因此上述脚本对我不起作用。
Description, MacAddress, IPAddess, Location
CJ0001, 00351AC0353C, 192.168.2.5, Room1
我希望仅修改MacAddress
字段,以便以00-35-1A-C0-35-3C的格式获得“Mac地址”。
我可以使用此脚本来实现我正在寻找的内容,还是需要从头开始?
答案 0 :(得分:1)
这应该有效:
$macs | ForEach-Object {
Select Description, @{Name='MacAddress'; Expression={ ($_.MacAddress -split '([A-Z0-9]{2})' | Where-Object {$_}) -join '-' }}, IPAddess, Location
}
打破表达式:
{ `
( `
$_.MacAddress -split '([A-Z0-9]{2})' ` # regex split the mac address up every two alpha-numeric chars
| Where-Object {$_} ` # filter to only return non-blank splits
) `
-join '-' # join the 2-char pairs with a '-'
}
修改强>
以下是一个完整的示例,将您的代码与我的代码混合,输入文件,然后输出:
# remove comment before -Header if no header
$csv = Import-Csv -Path C:\Users\metho\Desktop\Macadd.csv # -Header Description, MacAddress, IPAddess, Location
$csv | ForEach-Object { Select HostName, @{Name='MacAddress'; Expression={ ($_.MacAddress -split '([A-Z0-9]{2})' | Where-Object {$_}) -join '-' }} } |
Export-Csv -Path C:\Users\metho\Desktop\MacAdd_v1.csv -NoTypeInformation
虽然这可以通过不使用变量来简化,如:
Import-CSV C:\Users\metho\Desktop\Macadd.csv |
ForEach-Object { Select HostName, @{Name='MacAddress'; Expression={ ($_.MacAddress -split '([A-Z0-9]{2})' | Where-Object {$_}) -join '-' }} } |
Export-CSV C:\Users\metho\Desktop\MacAdd_v1.csv -NoTypeInformation
答案 1 :(得分:1)
这是经过测试和运作的。根据讨论评论,我已经检查了不是MAC地址预期长度的字符串。如果您在以后运行它,它还将确保它不会添加更多破折号:
Import-CSV 'C:\Users\metho\Desktop\macadd.csv' | ForEach-Object {
If ($_.MacAddress.length -eq 12){
$_.MacAddress = $_.MacAddress.insert(2,"-").insert(5,"-").insert(8,"-").insert(11,"-").insert(14,"-")
} Else {
Write-Warning "The MAC Address $($_.MacAddress) is not 12 characters"
}
Write-Output $_
} | Export-CSV 'C:\Users\metho\Desktop\macadd_v1.csv' -NoTypeInformation