วิธีใช้ Test-Path cmdlet ใน PowerShell
เมื่อทำงานกับไฟล์หรือโฟลเดอร์ใน PowerShell สิ่งสำคัญคือต้องทดสอบว่ามีเส้นทางอยู่หรือไม่ ก่อนที่คุณจะพยายามอ่านหรือบันทึกเนื้อหา นี่คือที่มาของ Test-Path cmdlet โดยจะตรวจสอบว่าองค์ประกอบทั้งหมดของเส้นทางมีอยู่และส่งกลับ $true หรือ $false
ตอนนี้ Test-Path cmdlet ใน PowerShell ไม่ได้จำกัดอยู่เพียงไฟล์และโฟลเดอร์เท่านั้น นอกจากนี้ยังสามารถใช้เพื่อทดสอบเส้นทางรีจิสทรี ทดสอบว่าไฟล์ใหม่กว่าวันที่ที่ระบุ และตรวจสอบว่าเส้นทางเป็นเส้นทางที่ถูกต้องหรือไม่
ในบทความนี้ เราจะดูวิธีใช้ Test-Path cmdlet และดูตัวเลือกต่างๆ ที่คุณสามารถทำได้
เส้นทางทดสอบ PowerShell
PowerShell Test-Path cmdlet มาพร้อมกับพารามิเตอร์ต่างๆ ที่เราสามารถใช้ได้ ฉันได้ระบุพารามิเตอร์ที่ใช้บ่อยที่สุดไว้ด้านล่าง:
- -Path
เส้นทางที่จะทดสอบ
- -Include
-
ระบุองค์ประกอบเส้นทางที่จะรวม เช่น *.txt
- -Exclude
ระบุองค์ประกอบเส้นทางที่จะยกเว้น เช่น *.txt
- -PathType
ช่วยให้คุณตรวจสอบว่าเส้นทางเป็นคอนเทนเนอร์ ใบไม้ หรืออย่างใดอย่างหนึ่ง
- -IsValid
ตรวจสอบว่าเส้นทางเป็นเส้นทางที่ถูกต้องหรือไม่
- -OlderThan
ตรวจสอบว่าไฟล์เก่ากว่าวัตถุ datetime ที่ระบุหรือไม่
- -NewerThan
ตรวจสอบว่าไฟล์ใหม่กว่าวัตถุ datetime ที่ระบุหรือไม่
ดังนั้นเพื่อทดสอบว่ามีเส้นทางอยู่หรือไม่ เราเพียงแค่ต้องระบุ Path และ cmdlet จะส่งกลับ $true หรือ $false ขึ้นอยู่กับว่ามีองค์ประกอบทั้งหมดของเส้นทางอยู่หรือไม่ หรือไม่:
Test-Path -Path "c:\Temp\TestFiles"
# Result
Trueเราสามารถใช้สิ่งนี้ในสคริปต์ของเราด้วยคำสั่ง if ง่ายๆ ดังนี้:
$path = "c:\Temp\TestFiles"
if (Test-Path -Path $path) {
Get-ChildItem -Path $path
}PowerShell ตรวจสอบว่ามีไฟล์อยู่หรือไม่
นอกจากนี้เรายังสามารถใช้ Test-Path ใน PowerShell เพื่อตรวจสอบว่ามีไฟล์อยู่หรือไม่ สำหรับสิ่งนี้ เราจะต้องระบุเส้นทางแบบเต็ม รวมถึงชื่อไฟล์ในพารามิเตอร์เส้นทาง:
# Check if the file LineNumbers.txt exists
$file = "C:\Temp\TestFiles\LineNumbers.txt"
Test-Path -Path $file
# Result
Trueในกรณีนี้ เรากำลังตรวจสอบไฟล์อย่างชัดเจน เนื่องจากเราได้ระบุเส้นทางแบบเต็มรวมถึงไฟล์ที่มีนามสกุลด้วย แต่ถ้าคุณไม่ทราบว่าเส้นทางนำไปสู่ไฟล์หรือโฟลเดอร์หรือไม่ คุณสามารถระบุพารามิเตอร์ PathType ได้
สมมติว่าเราต้องการทราบว่า $profile ชี้ไปที่ไฟล์หรือไม่ สำหรับสิ่งนี้ เราตั้งค่า PathType เป็น Leaf:
# Check if $profile is a file:
Test-Path -Path $profile -PathType leaf
# Result
TruePowerShell ตรวจสอบว่ามีโฟลเดอร์อยู่หรือไม่
เช่นเดียวกับไฟล์ เรายังสามารถตรวจสอบใน PowerShell ได้ด้วยหากมีโฟลเดอร์อยู่ สำหรับสิ่งนี้ เราเพียงแต่ต้องระบุเส้นทางไปยังโฟลเดอร์:
Test-Path -Path "c:\Temp\TestFiles"
# Result
Trueหากเราต้องการให้แน่ใจว่าเส้นทางชี้ไปที่โฟลเดอร์ เราสามารถเพิ่มพารามิเตอร์ -PathType และตั้งค่าเป็น container วิธีนี้ Test-Path cmdlet จะไม่เพียงแต่ตรวจสอบว่ามีเส้นทางอยู่หรือไม่ แต่ยังตรวจสอบว่าเป็นโฟลเดอร์หรือไม่:
# Check if $profile is a folder:
Test-Path -Path $profile -PathType container
# Result
Falseหากคุณต้องการทราบว่าโฟลเดอร์มีไฟล์อยู่หรือไม่ คุณไม่จำเป็นต้องนับด้วย Get-ChildItem ฯลฯ เราสามารถใช้ Test-Path และเพิ่ม wildcard * เพื่อตรวจสอบว่ามีไฟล์อยู่ในเส้นทางที่กำหนดหรือไม่:
# Check if there are files in the folder
Test-Path -Path "c:\Temp\TestFiles\*"
# Result
Trueการใช้รวมและไม่รวม
หากคุณต้องการทดสอบว่าโฟลเดอร์มีไฟล์เฉพาะหรือไม่ คุณสามารถใช้พารามิเตอร์ -include และ -exclude วิธีนี้ช่วยให้เราสามารถตรวจสอบได้ว่าโฟลเดอร์มีประเภทไฟล์ที่ระบุหรือไฟล์ใด ๆ ยกเว้นประเภทไฟล์ที่ระบุ
ตัวอย่างเช่น เราต้องการตรวจสอบว่ามีไฟล์บันทึกอยู่ในเส้นทางต่อไปนี้หรือไม่:
# Check if the path contains .log files
Test-Path -Path "C:\Temp\TestFiles\*" -PathType leaf -Include *.log
# Result
Falseหากเราต้องการทดสอบว่ามีไฟล์ใดๆ ยกเว้นไฟล์ .log หรือไม่ เราก็สามารถใช้การยกเว้นได้ เช่น:
# Check if the path contains .log files
Test-Path -Path "C:\Temp\TestFiles\*" -PathType leaf -Exclude *.log
# Result
Trueทดสอบว่าเส้นทางถูกต้องหรือไม่
เมื่อคุณสร้างเส้นทางแบบไดนามิกในสคริปต์ของคุณ อาจเป็นความคิดที่ดีที่จะทดสอบว่าเส้นทางที่สร้างขึ้นนั้นเป็นเส้นทางที่ถูกต้องหรือไม่ สำหรับสิ่งนี้ เราสามารถใช้พารามิเตอร์ -IsValid การดำเนินการนี้จะไม่ตรวจสอบว่ามีเส้นทางอยู่หรือไม่ เพียงแต่เป็นเส้นทางที่ถูกต้องเท่านั้น
ตัวอย่างเช่น เราสามารถตรวจสอบว่าตำแหน่งทั้งหมดในตัวแปรระบบ PATH เป็นเส้นทางที่ถูกต้องหรือไม่:
$env:path -split ";" | Test-Path -IsValid
หรือตัวอย่างที่ง่ายกว่าเล็กน้อยคือ:
$storage = "c:\temp\testfiles\"
$newFolder = "\LazyFolder"
$path = $newFolder + $storage # yes, the wrong way around
Test-Path -path $path -IsValid
# Result
Falseตรวจสอบว่าไฟล์หรือโฟลเดอร์ใหม่กว่าหรือเก่ากว่าวันที่
นอกจากการทดสอบว่ามีเส้นทางอยู่หรือไม่ เรายังสามารถตรวจสอบว่าไฟล์หรือโฟลเดอร์ใหม่กว่าหรือเก่ากว่าวันที่ที่ระบุหรือไม่ สิ่งนี้มีประโยชน์อย่างยิ่งหากคุณต้องการทราบว่าไฟล์ได้รับการอัปเดตหรือไม่
พารามิเตอร์ -NewerThan และ -OlderThan ต้องมีวัตถุวันที่หรือ datetime ซึ่งอาจเป็นสตริง datetime หรือวัตถุ datatime ดังนั้นเพื่อทดสอบว่าโฟลเดอร์ “testfiles” ใหม่กว่าวันแรกของเดือนกุมภาพันธ์หรือไม่ เราสามารถทำได้ดังนี้:
Test-Path -Path "C:\Temp\TestFiles\" -NewerThan "01 feb 2023"
# Result
Trueแต่เรายังสามารถตรวจสอบได้ว่าโฟลเดอร์นั้นเก่ากว่า 3 วันหรือไม่ สำหรับสิ่งนี้ เราสร้างวัตถุวันที่ใน PowerShell ก่อน ซึ่งเราสามารถใช้ใน Test-Path cmdlet:
# Get the date from 3 days ago
$date = (Get-Date).AddDays(-3)
# Test if the folder is newer
Test-Path -Path "C:\Temp\TestFiles\" -NewerThan $dateคุณสามารถทำเช่นเดียวกันกับ OlderThan ได้แน่นอน
ทดสอบเส้นทางรีจิสทรีด้วย PowerShell
Test-Path cmdlet ใน PowerShell ยังสามารถใช้เพื่อตรวจสอบว่ามีเส้นทางรีจิสทรีอยู่หรือไม่ ขณะนี้มีสิ่งสำคัญสิ่งหนึ่งที่ควรทราบที่นี่ ไม่สามารถทดสอบรายการรีจิสตรีได้
หากคุณดูภาพหน้าจอด้านล่าง เราสามารถทดสอบได้ว่ามีคีย์ Outlook (1) อยู่หรือไม่ แต่เราไม่สามารถทดสอบได้ว่ามีรายการ "OutlookName" (2) อยู่หรือไม่
ดังนั้นเพื่อทดสอบคีย์รีจิสทรี เราเพียงแต่ต้องระบุเส้นทางของคีย์ดังนี้:
Test-Path -Path "HKCU:\Software\Microsoft\Office\16.0\Outlook"ดังที่คุณเห็นในผลลัพธ์ด้านล่าง เส้นทางไปยังคีย์ Outlook มีอยู่ แต่ไม่พบเส้นทางไปยังรายการ OutlookName:
ห่อขึ้น
การทดสอบหรือการตรวจสอบว่าทรัพยากรมีอยู่หรือไม่มีความสำคัญในการเขียนโปรแกรมหรือภาษาสคริปต์ ช่วยให้คุณป้องกันข้อผิดพลาดหรือพฤติกรรมที่ไม่สงสัยในสคริปต์ของคุณและช่วยให้คุณจัดการข้อผิดพลาดได้อย่างเหมาะสม
Test-Path cmdlet ใน PowerShell สามารถทำได้มากกว่าที่คนส่วนใหญ่คิด แต่ในทุกกรณี จะส่งออกผลลัพธ์จริงหรือเท็จเท่านั้น
ฉันหวังว่าบทความนี้จะมีประโยชน์ หากคุณมีคำถามใด ๆ โปรดแสดงความคิดเห็นด้านล่าง


