วิธีการทำงานของ Powershell Foreach ในขณะที่ และลูปอื่นๆ

วิธีการทำงานของ Powershell Foreach ในขณะที่ และลูปอื่นๆ

ขั้นตอนแรกที่สำคัญในการเรียนรู้การเขียนโปรแกรมคือการทำงานกับลูป โชคดีที่ PowerShell ยังคงเติบโตไปพร้อมกับทักษะของคุณ





วิธีดูช่องท้องถิ่นบน roku

คุณสามารถกำหนดกรอบคำสั่งที่มีอยู่ที่คุณใช้ทุกวันในลูปเพื่อประหยัดเวลาและความพยายาม สคริปต์ของคุณทำงานหนักในขณะที่คุณทำงานสำคัญในการอ่านบทความเพิ่มเติมเกี่ยวกับ MakeUseOf!





Powershell ForEach Loops: ประตูสู่การจัดการข้อมูลขั้นสูง

ForEach เป็นนามแฝงสำหรับ ForEach-Object (นามแฝงเป็นเพียงทางลัดสำหรับคำสั่งใน PowerShell) นี่เป็นเวลาที่ดีที่จะพูดถึงวิธีที่ PowerShell จัดการข้อมูล





เช่นเดียวกับภาษาโปรแกรมสมัยใหม่ส่วนใหญ่ PowerShell เป็น Object-Oriented . ทุกอย่างใน PowerShell เป็นอ็อบเจ็กต์ หมายความว่าแม้แต่ตัวแปร มีคุณสมบัติและหน้าที่ขยายออกไป . คุณสมบัตินั้นคือเหตุผลที่คุณสามารถตั้งค่าการค้นหาของคุณเป็นตัวแปร และจบลงด้วยอาร์เรย์ของผลลัพธ์

$yourVar = Get-ChildItem *
foreach ($file in $yourVar){
Your Steps
}

ในบางภาษา การประมวลผลอาร์เรย์นี้จะเป็นกระบวนการหลายขั้นตอน ขั้นแรก หาความยาวแล้วนับแต่ละขั้นตอน



ใน PowerShell คุณก้าวผ่านอาร์เรย์และดำเนินการกับแต่ละรายการโดยใช้ ForEach วิธีนี้ช่วยให้คุณประหยัดโค้ดได้หลายบรรทัด ซึ่งจะเป็นประโยชน์หากคุณมีสคริปต์ที่ยาวกว่า ตัวอย่างเช่น ต่อไปนี้คือสคริปต์ขนาดเล็กที่จะใช้ Powershell ForEach สองลูป มันสร้างไฟล์ ZIP ของไฟล์ทั้งหมดที่คุณไม่ได้เปิดใน 30 วัน

การสร้างระบบจัดเก็บไฟล์โดยใช้ ForEach Loops

มาแบ่งขั้นตอนกัน คุณใช้ รับ-ChildItem เพื่อรับไฟล์ทั้งหมดในโฟลเดอร์เอกสาร ตัวแปรสภาพแวดล้อม $env:USERPROFILE รันสคริปต์โดยใช้โปรไฟล์ปัจจุบัน ตัวแปรนี้พกพาสะดวกกว่าพาธแบบฮาร์ดโค้ด ผลลัพธ์ของการค้นหานั้นถูกกำหนดให้กับตัวแปร $ MyDocs . จากนั้นเราสร้าง ForEach loop โดยให้มันก้าวผ่านแต่ละอัน $Doc ใน $MyDocs .





$oldDocs = @()
$MyDocs = Get-ChildItem -Path '$($env:USERPROFILE)Documents' -Recurse
foreach ($doc in $MyDocs){
if($doc.LastAccessTime -lt $(Get-Date).addDays(-30)){
$oldDocs += $doc
}
}
$ArchiveFolder = New-Item -Path '$($env:USERPROFILE)Documents$((Get-Date -Format MMddyy).toString())' -ItemType Directory
foreach ($doc in $oldDocs){
Move-Item -Path $doc.FullName -Destination '$($ArchiveFolder.FullName)$($doc.Name)' -Confirm $false
}
$source = $ArchiveFolder.FullName
$destination = '$($env:USERPROFILE)Documents$($ArchiveFolder.Name).zip'
Add-Type -AssemblyName 'system.io.compression.filesystem'
[io.compression.zipfile]::CreateFromDirectory($source, $destination)
if(test-path $destination){
Remove-Item -Path $ArchiveFolder -Recurse -Confirm $false
}

ภายในลูปเราตรวจสอบดูว่าแต่ละไฟล์เป็น .หรือไม่ LastAccessTime ทรัพย์สินมีอายุมากกว่า 30 วัน เราได้รับสิ่งนี้ด้วย รับวันที่ cmdlet และใช้ the AddDays ฟังก์ชันกับลบสามสิบ ถ้าใช่ เราเพิ่มไฟล์ไปที่ $myOldDocs อาร์เรย์ หลังจากการจัดเรียงไฟล์เสร็จสิ้น เราจะนำอาร์เรย์ที่เสร็จสมบูรณ์แล้วสร้างไฟล์ zip กระบวนการนี้ซับซ้อนกว่าเล็กน้อยเนื่องจากเกี่ยวข้องกับการเรียกใช้ .NET เล็กน้อย ไม่ต้องกังวลหากคุณไม่ค่อยเข้าใจ - คุณสามารถขโมยรหัสจาก เอกสารช่วยเหลือ TechNet นี้ .

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





ในขณะที่และทำในขณะที่: วนซ้ำตามเงื่อนไข

หากคุณต้องการเรียกใช้ลูปเฉพาะเมื่อตรงตามเงื่อนไขเฉพาะ ให้ใช้การวนรอบ หากคุณกำลังใช้ตัวแปรเพื่อติดตามการนับ ให้ตั้งค่านั้นก่อน

i=0
while(i<10){
Your Steps
i+=1
}

ปัญหาคือถ้าคุณไม่ได้ใช้ตัวนับ คุณอาจต้องการให้โค้ดของคุณทำงานอย่างน้อยหนึ่งครั้ง แม้ว่าการทดสอบจะเป็นจริงก็ตาม กรณีนี้กับสคริปต์ตัวอย่างด้านล่าง ดังนั้นในกรณีเหล่านั้น คุณต้องการใช้ Do-While loop ไวยากรณ์แตกต่างกันเล็กน้อย

do{
Your Steps
}while(Conditional Statement)

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

วิธีถ่ายโอนรูปภาพ iphone ไปยัง mac

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

รีบูตและตรวจสอบ: การใช้ Do-While Loop

สคริปต์นี้ง่ายกว่าเล็กน้อย ขั้นแรก คุณใช้ รีสตาร์ทคอมพิวเตอร์ คำสั่งให้รีบูตเครื่องระยะไกล (เราใช้ IP จำลองสำหรับคำสั่งรีบูต อย่าลืมเขียนทับสิ่งนี้ด้วย DNS/IP ของคอมพิวเตอร์ของคุณ) จากนั้นสร้างตัวแปรตัวนับ ผม และตั้งค่าเป็น 0 จากนั้น ให้ Do loop ของคุณมี Start-Sleep หยุดสคริปต์เป็นเวลา 300 วินาที (5 นาที) คำสั่งที่สองเพิ่มคำสั่งหนึ่งไปยังตัวนับ

Restart-Computer -ComputerName 127.0.0.1
i=0
do{
Start-Sleep -Seconds 300
$i += 1
}while((!(Test-Connection 127.0.0.1 -Quiet)) -or $i -gt 3)
if($i -gt 3){
Write-Ouput 'Remote Machine not responding, please check.'
}
else{
Write-Output 'Reboot Succeeded'
}

จากนั้นเราก็มีเกณฑ์ในขณะที่ของเรา เราใช้การทดสอบหรือเพื่อให้แน่ใจว่าความล้มเหลวสร้างการแจ้งเตือน อีกทางเลือกหนึ่งคือสคริปต์วนซ้ำเพื่อรอเครื่องระยะไกลอย่างไม่รู้จบ ในการตรวจสอบเครื่อง เราใช้ปุ่ม ทดสอบการเชื่อมต่อ cmdlet. เพื่อความเรียบง่าย นี่คือ Ping สำหรับ PowerShell เราเพิ่มพารามิเตอร์ -เงียบ ซึ่งบังคับให้ส่งคืน True หรือ False มากกว่าผลลัพธ์ของแพ็กเก็ต ส่วนที่สองของคำสั่ง Or จะตรวจสอบว่าตัวนับมีค่ามากกว่าสามหรือไม่

เมื่อวนรอบเสร็จสิ้น เราต้องการสร้างผลลัพธ์ นั่นหมายความว่าเราต้องตรวจสอบเคาน์เตอร์ของเรา นี่เป็นคำสั่ง if/else แบบด่วน หากมากกว่าสาม สคริปต์จะแสดงผลว่าเครื่องระยะไกลไม่ตอบสนอง หากไม่เป็นเช่นนั้น แสดงว่าการรีบูตสำเร็จ

ลูปอื่นๆ

มีลูปอีกสองประเภทใน PowerShell พวกเขาค่อนข้างเกี่ยวข้องกับสองลูปก่อนหน้านี้ แต่ไม่ได้ใช้กันทั่วไป A For loop ทำงานคล้ายกับตัวอย่างในขณะที่ คุณกำหนดเกณฑ์ทั้งหมดของคุณในการประเมิน จากนั้นตั้งค่า cmdlet ของคุณ

for($i = 0;$i -lt 10;$i++){
Your Steps
}

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

PowerShell มีความช่วยเหลือสำหรับแต่ละลูปเหล่านี้เช่นกัน คุณสามารถขอความช่วยเหลือได้โดยการเพิ่ม เกี่ยวกับ ก่อนชื่อลูปใน Get-Help จากนั้น คุณสามารถดูตัวอย่างและเคล็ดลับอื่นๆ สำหรับแต่ละประเภทได้ สิ่งเหล่านี้น่าจะมีประโยชน์หากคุณติดขัด

เติบโตไปพร้อมกับคุณอย่างต่อเนื่อง

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

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

แบ่งปัน แบ่งปัน ทวีต อีเมล ลบไฟล์และโฟลเดอร์ Windows เหล่านี้เพื่อเพิ่มพื้นที่ว่างในดิสก์

ต้องการล้างพื้นที่ดิสก์บนคอมพิวเตอร์ Windows ของคุณหรือไม่? ต่อไปนี้คือไฟล์และโฟลเดอร์ Windows ที่สามารถลบออกได้อย่างปลอดภัยเพื่อเพิ่มพื้นที่ว่างในดิสก์

อ่านต่อไป
หัวข้อที่เกี่ยวข้อง
  • การเขียนโปรแกรม
  • PowerShell
  • การเขียนสคริปต์
เกี่ยวกับผู้เขียน Michael McConnell(44 บทความที่ตีพิมพ์)

Michael ไม่ได้ใช้ Mac เมื่อถึงวาระ แต่เขาสามารถเขียนโค้ดใน Applescript ได้ เขามีปริญญาด้านวิทยาการคอมพิวเตอร์และภาษาอังกฤษ เขาเขียนเกี่ยวกับ Mac, iOS และวิดีโอเกมมาระยะหนึ่งแล้ว และเขาเป็นลิงไอทีในเวลากลางวันมานานกว่าทศวรรษ โดยเชี่ยวชาญด้านการเขียนสคริปต์และเวอร์ชวลไลเซชัน

xbox one controller ไม่ทำงานบน pc
เพิ่มเติมจาก Michael McConnell

สมัครรับจดหมายข่าวของเรา

เข้าร่วมจดหมายข่าวของเราสำหรับเคล็ดลับทางเทคนิค บทวิจารณ์ eBook ฟรี และดีลพิเศษ!

คลิกที่นี่เพื่อสมัครสมาชิก