ROBOCOPY with progress bar


ในบทความก่อนหน้านี้ "Backup by ROBOCOPY command" เราได้ทำการ Backup โดยใช้คำสั่ง Robocopy ในการ backup ไฟล์ไปแล้ว แต่ข้อจำกัดคือไม่สามารถทำเป็น Progress bar ในการแสดงผลสถานะว่ากำลังดำเนินการไปถึงขั้นตอนใหนแล้วได้
บทความนี้จะเพิ่มในส่วนการแสดง Progress bar ขึ้นมา โดยจะใช้คำสั่ง Robocopy เหมือนเดิม แต่จะใช้ผ่านตัว PowerShell กัน
มาดูวิธีการกันเลย


ก่อนอื่นให้เปิดตัว PowerShell ขึ้นมา
โดยกด Window + R เพื่อเปิด Run ขึ้นมา
จากนั้นพิมพ์ว่า Powershell
ให้เลือกเปิด Window Powershell ISE โดยทำการคลิ๊กขวาแล้วเลือก Run as Administrator

จะได้หน้าต่าง Window Powershell ISE แบบนี้


จากนั้นให้ทำการคัดลอก Code ด้านล่างนี้ไปวางในส่วน Script pane
**Code ด้านล่างนี้ผมได้แทรกคำอธิบายไว้ด้วยแล้วนะครับ

$Source = "E:\Calibrate_Plan"
#กำหนดตำแหน่งที่จะ Backup file
$Destination = "E:\Backup"
#กำหนดตำแหน่งที่จะเก็บไฟล์ไว้
$robocmd = "robocopy " + $Source + " " + $Destination +  " /mir /bytes"
#กำหนดคำสั่งในการ Backup โดยใช้ robocopy //ใช้การคัดลอกแบบ /mir

$staging = invoke-expression "$robocmd /l"
#ทำการ run command โดยใช้พารามิเตอร์ /l เพื่อเป็นการทดสอบก่อน (ยังไม่ได้ backup จริง)

$ttnewfile=$staging -match 'new file'
$ttmodified = $staging -match 'newer'
$totalfile = $ttnewfile + $ttmodified   
#เก็บค่าไฟล์ที่ต้อง Backup ทั้งหมดไว้ในตัวแปร $totalfile


$ttBytearray = [System.Collections.ArrayList]@()

foreach ($file in $totalfile)
{

$arrayID = $ttBytearray.add($file.substring(13,13).trim()) 
#ทำการตัดเอา Text ในส่วนของขนาดไฟล์มาเก็บไว้ใน $ttBytearray
#ในส่วน arrayID ถ้าไม่ทำอย่างนี้ จะแสดงตัวเลขลำดับ array ออกมาทาง output
}
$totalByte = (($ttBytearray | measure-object -sum).sum)
#ทำการรวมขนาดไฟล์ที่ต้องทำการคัดลอกทั้งหมด


#Start backup file
$robocopyjob = Start-Job -Name robocopy -ScriptBlock {param ($command) ; Invoke-Expression -Command $command} -ArgumentList $robocmd 
#เริ่มทำการสำรองข้อมูล โดยสร้างเป็น job ขึ้นมาเพื่อใช้ตรวจสอบสถานะ

while ($robocopyjob.State -eq 'running')
# Loop ตรวจสอบเพื่อแสดงสถานะ
{

$progress = Receive-Job -Job $robocopyjob -Keep -ErrorAction SilentlyContinue

$totolFileCount = $totalfile.count

if ($progress)
{
$copiedfiles = ($progress | Select-String -SimpleMatch 'new file', 'newer')

            if ($copiedfiles) #ตรวจสอบค่า null หรือเปล่า
            {
            if ($copiedfiles.count -le 0) { $TotalFilesCopied = $copiedfiles.Count }
            else { $TotalFilesCopied = $copiedfiles.Count - 1 }

            $FilesRemaining = ($totalfile.count - $TotalFilesCopied)
           
            $Bytesarray = [System.Collections.ArrayList]@()
            foreach ($Newfile in $copiedfiles)   #count finished copy size
            {
                if($Newfile)
                {
                $curCopy =  $Bytesarray.add($Newfile.tostring().substring(13, 13).trim())
                #เก็บขนาดไฟล์ที่กำลังคัดลอกใส่ไว้ในตัวแปร $Bytearray
                }
            }
           
            $TotalCopies = (($Bytesarray | measure-object -sum).sum)
            #หาขนาดไฟล์ ที่ได้ทำการคักลอกไปแล้ว
            $PercentComplete = (($TotalCopies/$totalByte) * 100)
            #หา % ที่ทำไปได้ปัจจุบัน
            Write-Progress -Id 1 -Activity "Backup files, $TotalFilesCopied of $totolFileCount  " -Status "status" -PercentComplete $PercentComplete
            #สร้าง progress bar แสดงสถานะ การสำรองข้อมูลขึ้นมา
            }
}
}
Write-Progress -Id 1 -Activity "Copying files from $Source to $Destination" -Status 'Completed' -Completed 
#สร้าง Progress แสดงสถานะว่าทำการคัดลอกข้อมูลเรียบร้อยแล้ว
$results = Receive-Job -Job $robocopyjob 
#ดึงผลลัพธ์มาเก็บไว้ใน $result
Remove-Job $robocopyjob
#ปิด job ที่สร้างไว้

    $results[5] 
    $results[-13..-1] 
    #ดึงข้อมูลมาแสดงทาง output โดยแสดงผล 5 บรรทัดแรก และ 13 บรรทัดสุดท้าย
    
cmd /c pause | out-null
#คำสั่งหยุดรอ


จากนั้นให้ทำการบันทึกไว้
Script pane

ไฟล์ที่สร้างขึ้นมา


การที่จะรันตัว Script นี้ได้ต้องทำการเปิด Set-ExecutionPolicy ไว้ก่อนด้วยนะครับ
พารามิเตอร์ตัวนี้ ปกรติ windows จะตั้งเป็น Restrict หรือปิดการใช้งานไว้

วิธีการเปิดหรือ Un-restrict ทำได้โดย
พิมพ์คำสั่ง Set-executionpolicy unrestricted แล้วกด Enter

จะมีหน้าต่างแจ้งเตือนขึ้นมา ให้กด "Yes"

ตอนนี้ก็สามารถ Run Script ได้แล้ว
หากต้องการปิดเหมือนเดิมก็ใช้คำสั่ง 
Set-executionpolicy restricted


ทดลอง Run คำสั่งในการ Backup ใน Window Powershell ISE ก็จะได้ผลดังนี้
ปุ่ม Run script

Progress bar
สรุปการ COPY


และหาก Run ตัว Powershell ที่เราได้ทำการสร้างไว้ก็จะได้ผลดังนี้

Progress bar แบบ text
สรุปผลการ Backup


เก็บไว้เป็นทางเลือกในการแบคอัพ อีกวิธีหนึ่งละกันครับ





ความคิดเห็น

โพสต์ยอดนิยมจากบล็อกนี้

Make BIG checkbox in Excel

เทคนิคการสร้าง Folder ลับ (การซ่อน Folder) 2

Measurement Equipment Management Software (Calibration Plan Software)