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

Write-Progress (Microsoft.PowerShell.Utility)


Write-Progress

โมดูล :
Microsoft.PowerShell.Utility

แสดงแถบความคืบหน้าภายในหน้าต่างคำสั่ง PowerShell

ไวยากรณ์

Write-Progress
     [[-Activity] <String>]
     [[-Status] <String>]
     [[-Id] <Int32>]
     [-PercentComplete <Int32>]
     [-SecondsRemaining <Int32>]
     [-CurrentOperation <String>]
     [-ParentId <Int32>]
     [-Completed]
     [-SourceId <Int32>]
     [<CommonParameters>]

คำอธิบาย

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

PowerShell 7.2 เพิ่มตัวแปรอัตโนมัติ $PSStyle ที่ใช้ในการควบคุมวิธีที่ PowerShell แสดงข้อมูลบางอย่างโดยใช้ลำดับหลีก ANSI สมาชิก $PSStyle.Progress ช่วยให้คุณสามารถควบคุมการแสดงแถบมุมมองความคืบหน้าได้

  • $PSStyle.Progress.Style - สตริง ANSI ที่ตั้งค่ารูปแบบการแสดงผล
  • $PSStyle.Progress.MaxWidth - ตั้งค่าความกว้างสูงสุดของมุมมอง ค่าเริ่มต้นคือ 120 ค่าต่ำสุดคือ 18
  • $PSStyle.Progress.View - enum ที่มีค่า Minimal และ Classic Classic คือการเรนเดอร์ที่มีอยู่โดยไม่มีการเปลี่ยนแปลง Minimal คือการแสดงผลขั้นต่ำเพียงบรรทัดเดียว Minimal เป็นค่าเริ่มต้น

สำหรับข้อมูลเพิ่มเติมเกี่ยวกับ $PSStyle โปรดดู about_ANSI_Terminals.md

บันทึก

หากโฮสต์ไม่รองรับ Virtual Terminal $PSStyle.Progress.View จะถูกตั้งค่าเป็น Classic โดยอัตโนมัติ

ตัวอย่าง

ตัวอย่างที่ 1: แสดงความคืบหน้าของ For loop

for ($i = 1; $i -le 100; $i++ ) {
    Write-Progress -Activity "Search in Progress" -Status "$i% Complete:" -PercentComplete $i
    Start-Sleep -Milliseconds 250
}

คำสั่งนี้แสดงความคืบหน้าของลูป for ที่นับจาก 1 ถึง 100

Write-Progress cmdlet ประกอบด้วยส่วนหัวของแถบสถานะ Activity บรรทัดสถานะ และตัวแปร $i (ตัวนับใน for loop) ซึ่งบ่งบอกถึงความสมบูรณ์ของงาน

ตัวอย่างที่ 2: แสดงความคืบหน้าของ For loops ที่ซ้อนกัน

$PSStyle.Progress.View = 'Classic'

for($I = 0; $I -lt 10; $I++ ) {
    $OuterLoopProgressParameters = @{
        Activity         = 'Updating'
        Status           = 'Progress->'
        PercentComplete  = $I * 10
        CurrentOperation = 'OuterLoop'
    }
    Write-Progress @OuterLoopProgressParameters
    for($j = 1; $j -lt 101; $j++ ) {
        $InnerLoopProgressParameters = @{
            ID               = 1
            Activity         = 'Updating'
            Status           = 'Progress'
            PercentComplete  = $j
            CurrentOperation = 'InnerLoop'
        }
        Write-Progress @InnerLoopProgressParameters
        Start-Sleep -Milliseconds 25
    }
}

Updating
Progress ->
 [ooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo]
OuterLoop
Updating
Progress
 [oooooooooooooooooo                                                   ]
InnerLoop

ตัวอย่างนี้ตั้งค่ามุมมองความคืบหน้าเป็น คลาสสิก จากนั้นแสดงความคืบหน้าของลูป for ที่ซ้อนกันสองลูป โดยแต่ละลูปแสดงด้วยแถบความคืบหน้า

คำสั่ง Write-Progress สำหรับแถบความคืบหน้าที่สองจะมีพารามิเตอร์ Id ที่ทำให้แตกต่างจากแถบความคืบหน้าแถบแรก

หากไม่มีพารามิเตอร์ Id แถบความคืบหน้าจะซ้อนทับกัน แทนที่จะแสดงไว้ด้านล่างกัน

ตัวอย่างที่ 3: แสดงความคืบหน้าขณะค้นหาสตริง

# Use Get-WinEvent to get the events in the System log and store them in the $Events variable.
$Events = Get-WinEvent -LogName system
# Pipe the events to the ForEach-Object cmdlet.
$Events | ForEach-Object -Begin {
    # In the Begin block, use Clear-Host to clear the screen.
    Clear-Host
    # Set the $i counter variable to zero.
    $i = 0
    # Set the $out variable to an empty string.
    $out = ""
} -Process {
    # In the Process script block search the message property of each incoming object for "bios".
    if($_.message -like "*bios*")
    {
        # Append the matching message to the out variable.
        $out=$out + $_.Message
    }
    # Increment the $i counter variable which is used to create the progress bar.
    $i = $i+1
    # Determine the completion percentage
    $Completed = ($i/$Events.count) * 100
    # Use Write-Progress to output a progress bar.
    # The Activity and Status parameters create the first and second lines of the progress bar
    # heading, respectively.
    Write-Progress -Activity "Searching Events" -Status "Progress:" -PercentComplete $Completed
} -End {
    # Display the matching messages using the out variable.
    $out
}

คำสั่งนี้แสดงความคืบหน้าของคำสั่งเพื่อค้นหาสตริง "bios" ในบันทึกเหตุการณ์ของระบบ

ค่าพารามิเตอร์ PercentComplete คำนวณโดยการหารจำนวนเหตุการณ์ที่ได้รับการประมวลผล $i ด้วยจำนวนเหตุการณ์ทั้งหมดที่ดึงข้อมูล $Events.count แล้วคูณผลลัพธ์นั้นด้วย 100

ตัวอย่างที่ 4: แสดงความคืบหน้าสำหรับแต่ละระดับของกระบวนการที่ซ้อนกัน

$PSStyle.Progress.View = 'Classic'

foreach ( $i in 1..10 ) {
  Write-Progress -Id 0 "Step $i"
  foreach ( $j in 1..10 ) {
    Write-Progress -Id 1 -ParentId 0 "Step $i - Substep $j"
    foreach ( $k in 1..10 ) {
      Write-Progress -Id 2  -ParentId 1 "Step $i - Substep $j - iteration $k"
      Start-Sleep -Milliseconds 150
    }
  }
}

Step 1
     Processing
    Step 1 - Substep 2
         Processing
        Step 1 - Substep 2 - Iteration 3
             Processing

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

พารามิเตอร์

-Activity

ระบุบรรทัดแรกของข้อความในส่วนหัวเหนือแถบสถานะ ข้อความนี้อธิบายกิจกรรมที่กำลังรายงานความคืบหน้า

พิมพ์ :

String

ตำแหน่ง:

0

ค่าเริ่มต้น:

None

ที่จำเป็น:

False

ยอมรับอินพุตไปป์ไลน์:

False

ยอมรับอักขระตัวแทน:

False

-Completed

บ่งชี้ว่ามองเห็นแถบความคืบหน้าหรือไม่ หากละเว้นพารามิเตอร์นี้ Write-Progress จะแสดงข้อมูลความคืบหน้า

พิมพ์ :

SwitchParameter

ตำแหน่ง:

ตั้งชื่อ

ค่าเริ่มต้น:

None

ที่จำเป็น:

False

ยอมรับอินพุตไปป์ไลน์:

False

ยอมรับอักขระตัวแทน:

False

-CurrentOperation

ระบุบรรทัดข้อความด้านล่างแถบความคืบหน้า ข้อความนี้อธิบายการดำเนินการที่กำลังเกิดขึ้น

พิมพ์ :

String

ตำแหน่ง:

ตั้งชื่อ

ค่าเริ่มต้น:

None

ที่จำเป็น:

False

ยอมรับอินพุตไปป์ไลน์:

False

ยอมรับอักขระตัวแทน:

False

-Id

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

พิมพ์ :

Int32

ตำแหน่ง:

2

ค่าเริ่มต้น:

None

ที่จำเป็น:

False

ยอมรับอินพุตไปป์ไลน์:

False

ยอมรับอักขระตัวแทน:

False

-ParentId

ระบุกิจกรรมหลักของกิจกรรมปัจจุบัน ใช้ค่า -1 หากกิจกรรมปัจจุบันไม่มีกิจกรรมหลัก

พิมพ์ :

Int32

ตำแหน่ง:

ตั้งชื่อ

ค่าเริ่มต้น:

None

ที่จำเป็น:

False

ยอมรับอินพุตไปป์ไลน์:

False

ยอมรับอักขระตัวแทน:

False

-PercentComplete

ระบุเปอร์เซ็นต์ของกิจกรรมที่เสร็จสมบูรณ์ ใช้ค่า -1 หากไม่ทราบเปอร์เซ็นต์ที่เสร็จสมบูรณ์หรือไม่เกี่ยวข้อง

พิมพ์ :

Int32

ตำแหน่ง:

ตั้งชื่อ

ค่าเริ่มต้น:

None

ที่จำเป็น:

False

ยอมรับอินพุตไปป์ไลน์:

False

ยอมรับอักขระตัวแทน:

False

-SecondsRemaining

ระบุจำนวนวินาทีที่คาดการณ์ไว้ที่เหลืออยู่จนกว่ากิจกรรมจะเสร็จสิ้น ใช้ค่า -1 หากไม่ทราบจำนวนวินาทีที่เหลือหรือไม่สามารถใช้ได้

พิมพ์ :

Int32

ตำแหน่ง:

ตั้งชื่อ

ค่าเริ่มต้น:

None

ที่จำเป็น:

False

ยอมรับอินพุตไปป์ไลน์:

False

ยอมรับอักขระตัวแทน:

False

-SourceId

ระบุแหล่งที่มาของเรกคอร์ด คุณสามารถใช้สิ่งนี้แทน Id ได้ แต่ไม่สามารถใช้กับพารามิเตอร์อื่นๆ เช่น ParentId

พิมพ์ :

Int32

ตำแหน่ง:

ตั้งชื่อ

ค่าเริ่มต้น:

None

ที่จำเป็น:

False

ยอมรับอินพุตไปป์ไลน์:

False

ยอมรับอักขระตัวแทน:

False

-Status

ระบุบรรทัดที่สองของข้อความในส่วนหัวเหนือแถบสถานะ ข้อความนี้อธิบายสถานะปัจจุบันของกิจกรรม

พิมพ์ :

String

ตำแหน่ง:

1

ค่าเริ่มต้น:

None

ที่จำเป็น:

False

ยอมรับอินพุตไปป์ไลน์:

False

ยอมรับอักขระตัวแทน:

False

อินพุต

ไม่มี

คุณไม่สามารถไปป์วัตถุกับ cmdlet นี้

เอาท์พุต

ไม่มี

cmdlet นี้ส่งคืนไม่มีผลลัพธ์

หมายเหตุ

หากแถบความคืบหน้าไม่ปรากฏขึ้น ให้ตรวจสอบค่าของตัวแปร $ProgressPreference หากตั้งค่าเป็น SilentlyContinue แถบความคืบหน้าจะไม่แสดง สำหรับข้อมูลเพิ่มเติมเกี่ยวกับการตั้งค่า PowerShell โปรดดู about_Preference_Variables

พารามิเตอร์ของ cmdlet สอดคล้องกับคุณสมบัติของคลาส System.Management.Automation.ProgressRecord สำหรับข้อมูลเพิ่มเติม โปรดดูคลาส ProgressRecord

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