ค้นหาเว็บไซต์

PowerShell: การใช้แถบความคืบหน้าด้วยความคืบหน้าในการเขียน


คุณเคยต้องการทำให้สคริปต์ของคุณเป็นมืออาชีพมากขึ้นหรือไม่? แถบความคืบหน้าเพิ่มความเป็นมืออาชีพให้กับงานของคุณ และให้ข้อมูลผู้ใช้ว่าสคริปต์ของคุณจะทำงานนานแค่ไหนและสคริปต์กำลังทำอะไรอยู่ ในโพสต์บล็อกนี้ ฉันจะจัดการกับความคืบหน้าในการเขียน ฉันจะเริ่มต้นตั้งแต่ต้นแล้วอธิบายวิธีใช้แถบความคืบหน้าในสคริปต์ กระโดดเข้าไปเลย


พื้นฐาน

ฉันชอบที่จะอธิบายพื้นฐานพร้อมตัวอย่างที่ผู้อ่านสามารถต่อยอดได้ โปรดทราบว่าตัวอย่างนี้มีไว้เพื่อการทดสอบและการเรียนรู้เท่านั้น นี่มันคือ.

นี่คือรหัส


$services = Get-Service

$count=$services.Count

For($i = 1; $i -le $count; $i++)
{

Write-Progress -Activity "Services" `
-PercentComplete (($i*100)/$count) `
-Status "$(([math]::Round((($i)/$count * 100),0))) %"

Start-Sleep -Milliseconds 100
}

สิ่งนี้นำไปสู่แถบความคืบหน้าต่อไปนี้:

ให้ฉันอธิบายว่าจะเกิดอะไรขึ้นเมื่อสคริปต์ทำงาน

บรรทัดที่ 1


$services = Get-Service

นั่นเป็นเรื่องง่าย บรรทัดที่ 1 ดึงบริการ Windows ทั้งหมดและจัดเก็บไว้ในตัวแปร $services

บรรทัดที่ 3

$count=$services.Count

ในบรรทัดที่ 3 จะนับจำนวนบริการของ Windows ค่านี้จะได้รับการประมวลผลในภายหลัง

บรรทัดที่ 5


For($i = 1; $i -le $count; $i++)

บรรทัดที่ 5 ทำอะไรได้บ้าง? เป็นเงื่อนไขสำหรับ for loop ที่ตั้งค่า $i เป็น 1 ตามด้วยเงื่อนไขที่ว่า $i ต้องน้อยกว่าหรือเท่ากับจำนวนของบริการ เราได้รับจำนวนบริการจากตัวแปร $servcies สุดท้าย $i จะนับจนถึงจำนวนสูงสุดที่กำหนดโดยเงื่อนไข

เราต้องการสิ่งนี้จริงๆ สำหรับ for loop สำหรับแถบความคืบหน้าของเรา หากไม่มีตัวนับนี้ แถบความคืบหน้าจะไม่สามารถแสดงสถานะการทำงานปัจจุบันให้คุณได้

บรรทัดที่ 6

บรรทัดที่ 6 เริ่มต้นการวนซ้ำ for รหัสจะอยู่ในวงเล็บปีกกา รหัสลูปสิ้นสุดในบรรทัดที่ 10

บรรทัดที่ 8 ถึง 10


Write-Progress -Activity "Services" `
-PercentComplete (($i*100)/$count) `
-Status "$(([math]::Round((($i)/$count * 100),0))) %"

บรรทัดที่ 8 เป็นส่วนที่น่าสนใจที่สุดของโค้ด และบรรทัดของโค้ดนั้นคือเนื้อหาเกี่ยวกับโพสต์บนบล็อกนี้ ความคืบหน้าในการเขียนเข้ามามีบทบาท

บรรทัดที่ 8 เริ่มต้นการเขียนความคืบหน้าด้วยชื่อ กิจกรรม “บริการ”

จากนั้นแถบความคืบหน้าจะต้องกำหนดเปอร์เซ็นต์ของสถานะในขณะที่ลูปกำลังทำงาน ในการทำเช่นนั้น Write-Progress จะใช้พารามิเตอร์ PercentComplete ในการคำนวณความคืบหน้าของแถบ $i คูณด้วย 100 แล้วหารด้วยจำนวนบริการ

พารามิเตอร์ สถานะ สามารถแสดงสิ่งที่คุณต้องการได้ ตัวอย่างเช่น อาจแสดงชื่อของบริการที่ประมวลผลในปัจจุบัน หรืออาจแสดงเปอร์เซ็นต์ของความคืบหน้า

ฉันชอบที่มันแสดงให้เห็นว่ามีการประมวลผลไปแล้วกี่เปอร์เซ็นต์ ฉันจึงตัดสินใจแสดงสถานะเป็นเปอร์เซ็นต์ด้วยวิธีทางคณิตศาสตร์ ช้าลงหน่อย. มาดูรายละเอียดกันดีกว่า

($i*100)/$count คือเครื่องคำนวณเปอร์เซ็นต์ของฉัน สมมติว่าเรามี 30 บริการ เมื่อลูปตรงกับบริการที่ห้า การคำนวณจะเป็น 5*100/30=16.66 % ซึ่งหมายความว่า 16.66 % ของกระบวนการทั้งหมดได้รับการประมวลผลแล้ว ตอนนี้วิธีทางคณิตศาสตร์เข้ามามีบทบาทแล้ว ฉันใส่รหัสทั้งหมดไว้ในวงเล็บเพื่อลบหลักลูกน้ำ (0) $ (([คณิตศาสตร์]::ปัดเศษ((($i)/$count * 100),0))) %

บรรทัดที่ 12


Start-Sleep -Milliseconds 100

บรรทัดที่ 12 ใช้เพื่อการทดสอบเท่านั้น มันทำให้แถบความคืบหน้าช้าลงเพื่อให้เราสามารถดูความคืบหน้าได้อย่างสะดวกสบาย

การใช้แถบความคืบหน้าในสคริปต์

ตอนนี้เราได้เห็นแล้วว่า Write-Progress สามารถทำให้งานของเราดูเป็นมืออาชีพมากขึ้นได้อย่างไร แล้วสคริปต์ล่ะ? จะใช้แถบความคืบหน้าในสคริปต์ได้อย่างไร? มันเกือบจะเป็นขั้นตอนเดียวกัน ฉันจะยกตัวอย่างให้คุณ

พิจารณาสคริปต์ต่อไปนี้ซึ่งจะดึงข้อมูลการกำหนดค่า IP จากโดเมนทั้งหมดที่เข้าร่วมระบบปฏิบัติการเซิร์ฟเวอร์ Windows สังเกตเครื่องหมายสีแดง นั่นคือที่ที่มันเกิดขึ้น

ในบรรทัด 3 ถึง 10 พารามิเตอร์ กิจกรรม, CurrentOperation และ PercentComplete จะถูกสร้างขึ้น ข้อมูลจะถูกบันทึกในรูปแบบแฮชเทเบิล @() Hashtables สามารถเก็บคีย์และค่าได้ คีย์ถูกกำหนดไว้แล้ว ค่าจะมาภายหลังจากการวนซ้ำที่เริ่มต้นในบรรทัดที่ 18

ในบรรทัด 22 ถึง 27 $u ตั้งค่าเป็น 0 ซึ่งเท่ากับ $i จากตัวอย่างสุดท้าย จากนั้นในบรรทัดที่ 22 การวนซ้ำจะเริ่มนับขึ้น $u และคำนวณการนับ (บัญชีคอมพิวเตอร์) และเปอร์เซ็นต์ Write-Progress เสร็จสิ้นการตั้งค่าแถบความคืบหน้า

นี่คือสคริปต์ที่ใช้งานจริง

โค้ดความคืบหน้าในการเขียนของตัวอย่างสคริปต์นี้สร้างขึ้นจากคำแนะนำที่ยอดเยี่ยมนี้ “จะเพิ่มแถบความคืบหน้าในสคริปต์ PowerShell ของคุณได้อย่างไร” ที่สามารถพบได้ที่นี่: https://www.powershellbros.com/how-to-add-progress-bar-in-your-powershell-scripts/

คุณสามารถดาวน์โหลดสคริปต์ Get-NetIPServerInfo ของฉันได้ที่นี่ (โดยไม่ต้องมีแถบความคืบหน้า): ดึงข้อมูลการกำหนดค่า IP ของเซิร์ฟเวอร์ Windows ทั้งหมดด้วย Get-NetIPServerInfo

ฉันหวังว่าโพสต์บล็อกนี้จะเป็นประโยชน์ พบกันใหม่ครั้งหน้ากับ PowerShell อีกครั้ง!

บทความที่เกี่ยวข้อง