ที่อยู่ IP ของแพดที่มีเลข 0 นำหน้า - powershell

ฉันต้องการเพิ่มที่อยู่ IP ด้วย 0

ตัวอย่าง
1.2.3.4 -> 001.002.003.004
50.51.52.53 -> 050.051.052.053

ลองสิ่งนี้:

[string]$paddedIP = $IPvariable
[string]$paddedIP.PadLeft(3, '0')

ลองแยกด้วยเช่นกัน แต่ฉันยังใหม่กับ PowerShell ...


person curiousPerson    schedule 24.09.2019    source แหล่งที่มา


คำตอบ (2)


คุณสามารถใช้การรวมกันของ .Split() และ -join

('1.2.3.4'.Split('.') | 
    ForEach-Object {$_.PadLeft(3,'0')}) -join '.'

ด้วยแนวทางนี้ คุณจะทำงานกับสตริงตลอดเวลา Split('.') สร้างองค์ประกอบอาร์เรย์ทุกๆ . อักขระ .PadLeft(3,'0') รับรองว่าจะมีอักขระ 3 ตัวโดยมีเลขศูนย์นำหน้าหากจำเป็น -join '.' รวมอาร์เรย์เป็นสตริงเดียว โดยแต่ละองค์ประกอบคั่นด้วย .


คุณสามารถใช้แนวทางที่คล้ายกันกับตัวดำเนินการรูปแบบ -f

"{0:d3}.{1:d3}.{2:d3}.{3:d3}" -f ('1.2.3.4'.Split('.') |
    Foreach-Object { [int]$_ } )

สตริงรูปแบบ :dN เปิดใช้งานการเติม N (จำนวนหลัก) โดยมีเลขศูนย์นำหน้า

วิธีนี้จะสร้างอาร์เรย์สตริงเหมือนในโซลูชันแรก จากนั้นแต่ละองค์ประกอบจะถูกไปป์ไลน์และแปลงเป็น [int] สุดท้ายนี้ การจัดรูปแบบจะถูกนำไปใช้กับแต่ละองค์ประกอบ

person AdminOfThings    schedule 24.09.2019

เพื่อเสริม คำตอบที่เป็นประโยชน์ของ AdminOfThings ด้วยทางเลือกที่กระชับยิ่งขึ้นโดยใช้ -replace ตัวดำเนินการ พร้อม บล็อกสคริปต์ ({ ... }) ซึ่งต้องใช้ PowerShell Core (v6.1+):

PSCore> '1.2.3.50' -replace '\d+', { '{0:D3}' -f [int] $_.Value }

001.002.003.050

บล็อกสคริปต์ถูกเรียกสำหรับทุกการจับคู่ของ regex \d+ (หนึ่งหลักขึ้นไป) และ $_ ภายในบล็อกสคริปต์อ้างถึง System.Text.RegularExpressions.Match ที่แสดงถึงการแข่งขันในมือ; คุณสมบัติ .Value มีข้อความที่ตรงกัน (สตริง)

person mklement0    schedule 24.09.2019
comment
นี่เป็นสิ่งที่ดี ฉันจะต้องคำนึงถึงการทดแทน Scriptblock สำหรับเวอร์ชัน Core - person AdminOfThings; 24.09.2019
comment
@AdminOfThings: ใช่ มันเป็นคุณสมบัติที่มีประโยชน์ แม้ว่าจะยังค่อนข้างซับซ้อน เพราะคุณต้องเข้าใจโครงสร้างของอินสแตนซ์ System.Text.RegularExpressions.Match ที่ $_ อ้างถึง - person mklement0; 24.09.2019