我有一些值需要以特定方式格式化。明确地说,它是一个 IP 地址八位字节,我希望它采用“xxx”格式。例如,如果我有一个八位字节值“20”,我希望将其显示为“020”而不是“20”。
我最终会得到一个充满 IP 的数组,并且我想正确地格式化它们所有。
这是一个我知道有效的例子,并且我通过 get-member 发现这是一个整数。
$Test = 1
$Test.ToString("000")
001
这不起作用。我已通过 Get-Member 发现该值已是字符串。
$Test = "1"
$test.ToString("000")
Cannot find an overload for "tostring" and the argument count: "1".
At line:1 char:2
+ $test.tostring("000")
+ ~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [], MethodException
+ FullyQualifiedErrorId : MethodCountCouldNotFindBest
有什么想法可以让我获取已经格式化为字符串的值,就像我可以使用整数值一样?从长远来看,我希望示例 $test 实际上包含完整的 IP 地址。
例如 10.10.10.10 我希望是 010.010.010.010
回答 对于那些感兴趣的人。通过利用@GregL 示例,我能够整理出一个带有前导零的完整 IP 格式的工作示例,如下所示以供参考。
$Test = "10.10.10.10"
$test2 = ($test.Split(".") | ForEach-Object {$_.tostring().padleft(3, '0')}) -join "."
答案1
假设您正在尝试以这种方式格式化它们,以便它们全部显示得很好对齐。
唯一的问题是 020 和 20 不一样。这反正。
具有 TCP/IP-32 和 Windows NT 实用程序的 Windows for Workgroups 可以接受由十进制、八进制或十六进制数字组成的 Internet 协议 (IP) 地址。如果您无意中在十进制八位字节中使用了前导零,则可能会造成混淆。如果前导零,这些实用程序会将该数字解析为八进制数字,从而指定错误的 IP 地址。
文章说它只适用于 Windows 2000 和 NT,但我刚刚在我的 Windows 7 PC 上尝试过,结果还是一样。
无论如何,要回答您的初始问题,请使用以下PadLeft
步骤:
$Test = 1
$Test.ToString().PadLeft(3, '0')
001
答案2
我用这些很棒的子网数学函数由 Chris Dent 撰写。将地址列表存储在纯十进制(不是点分十进制)或纯二进制值中。对列表进行排序,然后检索列表,最后使用 ConvertTo-DottedDecimalIP 函数显示列表。他的博客中还有许多其他很棒的子网函数。