所以基本上我想要实现的是从文本文件中获取MAC地址并将值递增1。
在Google / StackOverflow墙上砸了几个小时,认为这是一个我没有得到的概念。
的PowerShell:
$Last_MAC_Address = (Get-Content -LiteralPath "\\UNC\Path\Last MAC Address.txt")
Write-Host ($Last_MAC_Address)
# Output: 00155DE10B73
$Next_MAC_Address = (($Last_MAC_Address | Format-Hex) + 1)
答案 0 :(得分:5)
这是一个3步骤的过程,虽然PetSerAl在评论中作为单行代码回答了它,但我会稍后将其分解为后代(并使用不同的类)。
第一步是将十六进制数作为十进制数(数学基数10,而不是类型)。
第二步是小数的增量。
最后一步是将其转换回十六进制。
分解而不是一个衬里,这将完成手头的任务:
$asDecimal = [System.Convert]::ToInt64("00155DE10B73", 16)
$asDecimal++
$asHex = [System.Convert]::ToString($asDecimal, 16)
答案 1 :(得分:3)
另一种选择是使用0x
作为前缀,并将其转换为int64
:
$Next_MAC_Address = ([int64]"0x$Last_MAC_Address"+1).ToString('X12')
您还可以使用format operator(-f
)代替ToString()
方法:
$Next_MAC_Address = '{0:X12}' -f ([int64]"0x$Last_MAC_Address"+1)
然而,有一件事值得注意。 MAC addresses不仅仅是随机的6字节数字,没有任何内部结构。它们实际上由两部分组成。前3个字节组成Organizationally Unique Identifier(OUI),特定于供应商的前缀(00-15-5D是属于Microsoft的OUI之一)。只有最后3个字节是随机数,是OUI识别的供应商每张卡的唯一标识符。
考虑到这一点,您可能需要相应地拆分MAC地址,例如像这样:
$oui, $nid = $Last_MAC_Address -split '(?<=^[0-9a-f]{6})(?=[0-9a-f]{6}$)'
或者像这样:
$oui = $Last_MAC_Address.Substring(0, 6)
$nid = $Last_MAC_Address.Substring(6, 6)
并仅增加NIC标识符,并且仅在它不会溢出时才会增加:
if ($nid -ne 'ffffff') {
$Next_MAC_Address = "{0}{1:X6}" -f $oui, ([int64]"0x$nid"+1)
} else {
Write-Error 'MAC address overflow.'
}