ข้ามไปที่เนื้อหาหลัก

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


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





ความคิดเห็น

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

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

เทคนิคการสร้าง Folder ลับ (การซ่อน Folder) 2 วันนี้ก็จะเอาเทคนิคการซ่อน Folder มาฝากกันเพิ่มเติมนะครับ จะต่างจากในบทความแรก https://lazedev.blogspot.com/2016/03/folder-folder.html ซึ่งเป็นการเก็บแบบ System file ธรรมดา โดยคราวนี้จะเพิ่มความสามารถให้ Folder ที่เราซ่อนไว้ให้เข้ายากขึ้นไปอีกนิด (ซ่อนได้เนียนขึ้น) นะครับ มาดูขั้นตอนกันเลย

Make BIG checkbox in Excel

ทำ Checkbox ขนาดใหญ่ใน Excel ในบางครั้งเมื่อเราต้องการทำฟอร์มเอกสารให้คนอื่นกรอก ก็มักจะมีตัว Checkbox เพื่อให้คลิ๊กเลือกในรายการที่เรากำหนดไว้ โดยจะเพิ่มจากตัว ActiveX control ที่มีอยู่แล้วใน Excel แต่ปัญหาคือเจ้าตัว checkbox นี้มันปรับขนาดไม่ได้ พอเราปรับขนาดหน้าจอเล็กลง เจ้าตัว checkbox นี่ก็จะเล็กลงตาม ทำให้ความไฮโซของแบบฟอร์มลดลงไป

เอา Password Excel VBA ออก

พอดีว่ากำลังทำโปรเจ็คฐานข้อมูลเกี่ยวกับ Excel VBA แต่ทำ ๆ ไปดันลืม พาสเวิดที่ตัวเองใส่ไว้ซะงั้น เลยต้องลำบากลำบนไปค้นหาวิธีการเอาพาสเวิดนั้นออก ดูไปแล้วก็พอมีวิธีอยู่ ก็เลยทำเป็นบทความเก็บไว้ดีกว่า มาดูกันเลย **เป็นการเอารหัสของ VBA ใน Excel ออกนะครับ ไม่ใช่รหัสของ Excel