ฉันสร้างสคริปต์สำหรับ Windows Powershell และบันทึกเป็นไฟล์. ps1 ฉันสร้างมันดังต่อไปนี้:
$linecount = 0
$editfilenumber = 1
$endfilenumber = 1
$totallines = 0
$i = 0
$interval = 100 / 1
ส่วนนี้เป็นเพียงการรีเซ็ตตัวแปรพื้นฐานทั้งหมด
$linecount
ใช้สำหรับจำนวนบรรทัดที่สร้างในส่วนใหม่ (พูดถึงเรื่องนั้นในภายหลัง) $editfilenumber
ใช้สำหรับหมายเลขไฟล์ที่กำลังถูกแก้ไข (ลบออกซ้ำ, ไม่ถูกลบ invalids ... ) $endfilenumber
ใช้สำหรับหมายเลขชิ้นส่วนที่สร้างขึ้น $totallines
ใช้สำหรับจำนวนบรรทัดทั้งหมด $i
ใช้สำหรับคำนวณเปอร์เซ็นต์ $interval
ใช้สำหรับช่วงเวลารีเฟรชของแถบความคืบหน้า (มิฉะนั้นกระบวนการจะช้ามาก)
$srcdirectory = Read-host "Select path to the source folder"
$partdirectory = Read-host "Select path to where the parts need to be stored"
$maxlines = Read-host "How many lines are in the new parts?"
$maxsize = [int]$maxlines
$partname = Read-host "How do you want the new parts to be called?"
โดยทั่วไปจะถามผู้ใช้สำหรับข้อมูลและจำนวนบรรทัดในส่วนต่างๆ
$files = Get-ChildItem $srcdirectory -filter *.txt
Write-Host "These files will be edited and combined: "
$files | format-table name
นี่จะแสดงรายการไฟล์. txt ทั้งหมดในไดเรกทอรีที่กำหนด สิ่งนี้ทำเพื่อให้ผู้ใช้ทราบว่าจะใช้ไฟล์ใด
Write-Host "Press any key to continue..." -foregroundcolor "green"
$HOST.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | OUT-NULL
$HOST.UI.RawUI.Flushinputbuffer()
สิ่งนี้จะรอการยืนยันจากผู้ใช้โดยรอให้กดปุ่ม
$start = Get-Date
นี่จะได้รับการประทับเวลาปัจจุบันเพื่อคำนวณเวลาการประมวลผลในที่สุด
ForEach ($file in $files) {
Write-host "Editing file: " $file
Write-host "Loading list..."
$list = Get-content $srcdirectory\$file
Write-host "OK" -foregroundcolor "green"
Write-host "Removing duplicates..."
$list = $list | Get-Unique
Write-host "OK" -foregroundcolor "green"
Write-host "Removing invalid..."
$list = $list | Where { $_ -notmatch "^@" } | Where { $_ -match "@" }
$list = $list -replace ';', ':' | Where {$_ -notmatch ':[^\)]+:'} | Where {$_ -notmatch '::'}
Write-host "OK" -foregroundcolor "green"
Write-host "Combining lists..."
$longlist = $longlist + $list | Get-Unique
$editfilenumber ++
Write-host "Success!" -foregroundcolor "green"
}
ส่วนนี้ค่อนข้างสำคัญ ก่อนอื่นจะแสดงไฟล์ที่กำลังแก้ไขและสร้าง$list
เนื้อหาของไฟล์นั้น หลังจากนั้นจะได้รับทุกสายที่ไม่ซ้ำกัน (และที่ซ้ำกันจึงออก) ลบบรรทัดที่ไม่ถูกต้อง (จะต้องระบุไว้สำหรับวัตถุประสงค์ของโครงการ) และในที่สุดก็จะเพิ่มการกรองเพื่อ$list
นี้จะกระทำสำหรับแต่ละไฟล์และทำให้แต่ละไฟล์กรองจะถูกเพิ่ม$longlist
$longlist
Write-Host "Removing all duplicates..."
$longlist = $longlist | Get-Unique
Write-Host "Success!" -foregroundcolor "green"
$longlist
นี้จะเอารายการที่ซ้ำกันทั้งหมดจาก
Write-host "Calculating total number of lines..."
$longlist | % { $totallines += $_.count }
Write-host "There are a total of " $totallines " unique and valid lines." -
foregroundcolor "green"
สิ่งนี้จะคำนวณจำนวนบรรทัดที่ใช้ได้ทั้งหมด นี่คือข้อมูลของผู้ใช้และใช้ในการคำนวณความคืบหน้าในแถบความคืบหน้า
Write-host "Creating parts..."
$longlist | ForEach {
Add-Content $partdirectory/$partname.$endfilenumber.txt "$_"
$linecount++
$i++
If ($linecount -eq $maxsize) {
Write-host "Success! " $partname$endfilenumber " created" -foregroundcolor "green"
$endfilenumber++
$linecount = 0
}
If ($i % $interval -eq 0) {
$percent = ($i / $totallines) * 100
$percent = [math]::Round($percent,2)
Write-Progress -Activity "Creating parts" -Status $percent -PercentComplete $percent
}
}
นี่คือส่วนที่สำคัญที่สุด มันสร้างไฟล์ที่มีชื่อไฟล์ที่ระบุในไดเรกทอรีที่ระบุ มันเพิ่ม 1 รายการ $ longlist ในไฟล์นั้น จากนั้นมันจะเพิ่มขึ้น$linecount
และ$i
1 หาก$linecount
เท่ากับขนาดไฟล์สูงสุดที่ระบุไว้ก็จะเพิ่มขึ้น$endfilecount
1 หากไม่มีบรรทัดถัดไปจะถูกเพิ่มเข้าไปในไฟล์ที่มีอยู่
ยกตัวอย่างเช่นขนาดไฟล์ที่ระบุ 10.000 Part$endfilenumber
เส้นและชื่อส่วนหนึ่งคือ บรรทัดแรกของ$longlist
ถูกเพิ่มลงในไฟล์ Part1.txt ( $endfilenumber = 1
ตามที่ระบุในบรรทัดแรกของโค้ด) เมื่อเพิ่มบรรทัดที่ 10.00 If
คำสั่งจะถูกใช้ ซึ่งหมายความว่า$endfilenumber
จะเพิ่มขึ้น 1 วิธีนี้$longlist
จะเพิ่มบรรทัดถัดไปจากลงในไฟล์ใหม่ชื่อ Part2.txt (เพราะ$endfilenumber = 2
)
ที่สองถ้าคำสั่งจะใช้สำหรับการคำนวณความคืบหน้า สิ่งนี้ไม่สำคัญดังนั้นเพื่อประหยัดเวลาฉันจะไม่อธิบายสิ่งนั้น
$end = Get-Date
$time = ($end-$start).TotalMinutes
$time = [math]::Round($time,2)
Write-host "A total of " $endfilenumber " parts have been created" -
foregroundcolor "green"
Write-host "Total processing time: " $time " minutes" -foregroundcolor "green"
Write-Host "Press any key to exit..." -foregroundcolor "green"
$HOST.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown") | OUT-NULL
$HOST.UI.RawUI.Flushinputbuffer()
นี่คือส่วนสุดท้ายของรหัส การดำเนินการนี้ใช้เวลาประทับและลบออกจากการประทับเวลาในตอนเริ่มต้น วิธีนี้คำนวณเวลาประมวลผลเป็นนาทีและปัดเศษเป็นทศนิยม 2 ตำแหน่ง บิตสุดท้ายที่รอการยืนยันจากผู้ใช้เพื่อสิ้นสุดและปิดโปรแกรม
ฉันหวังว่านี่จะช่วยได้เล็กน้อย
หมายเหตุ: โปรแกรมนี้ไม่มีผลกับไฟล์ต้นฉบับ! ดีจังฉันเดาว่า ...