ค้นหาเว็บไซต์

สร้างไฟล์หากไม่มีอยู่ใน PowerShell [4 วิธี]


การใช้คำสั่ง if-else

เราสามารถใช้คำสั่ง if-else เพื่อสร้างไฟล์ได้ดังนี้:

ใช้ รายการใหม่ Cmdlet

หากต้องการสร้างไฟล์หากไม่มีอยู่ใน PowerShell:

  • ใช้ Test-Path cmdlet โดยมีเงื่อนไข if เพื่อตรวจสอบว่ามีไฟล์อยู่หรือไม่
  • ใช้ cmdlet New-Item เพื่อสร้างไฟล์ใหม่หากไม่มีอยู่
  • พิมพ์ข้อความแสดงข้อผิดพลาดในเงื่อนไข else

ใช้คำสั่ง if:

$file = "D:\test.txt"
if(!(Test-Path -Path $file)){
    New-Item -ItemType File -Path $file
    Write-Output "File '$file' created successfully"
} else {
    Write-Output "File '$file' already exists"
}

เอาท์พุท :

    Directory: D:\
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         1/16/2023   4:19 PM              0 test.txt
File 'D:\test.txt' created successfully

Test-Path cmdlet ใน PowerShell ตรวจสอบว่ามีไฟล์หรือโฟลเดอร์อยู่ในระบบไฟล์หรือไม่ cmdlet ส่งกลับค่าบูลีนโดยขึ้นอยู่กับว่ามีไฟล์ที่ต้องการอยู่หรือไม่ ไวยากรณ์พื้นฐานของ cmdlet นี้คือ Test-Path -Path โดยที่พารามิเตอร์ -Path ระบุเส้นทางไปยังไฟล์หรือโฟลเดอร์ที่เราต้องการตรวจสอบ อาจเป็นเส้นทางสัมพัทธ์หรือเส้นทางที่แน่นอนก็ได้

Test-Path cmdlet สามารถรวมกับ cmdlet อื่นๆ เช่นคำสั่ง if เพื่อดำเนินการตามเงื่อนไขกับไฟล์หรือโฟลเดอร์ นอกจากนี้ยังสามารถใช้เพื่อตรวจสอบว่ามีไฟล์อยู่หรือไม่ ตัวอย่างเช่น เราใช้มันร่วมกับคำสั่ง if เพื่อตรวจสอบว่ามี file อยู่ในระบบหรือไม่

หากไม่มีไฟล์อยู่ เราจะใช้ cmdlet New-Item cmdlet รายการใหม่สร้างไฟล์ ไดเรกทอรี ลิงก์สัญลักษณ์ ทางแยก ฮาร์ดลิงก์ คีย์รีจิสทรี และตัวแปรใหม่ในระบบไฟล์หรือรีจิสทรี cmdlet เก็บ -Path และ -ItemType เป็นพารามิเตอร์ ตัวอย่างเช่น เราสร้างไฟล์ใหม่โดยใช้ cmdlet นี้

ในคำสั่ง else หากไฟล์มีอยู่แล้ว โปรแกรมจะแสดงข้อความแสดงข้อผิดพลาดบนคอนโซล:

เอาท์พุท :

File 'D:\test.txt' already exists

ใช้ Out-File Cmdlet

หากต้องการสร้างไฟล์หากไม่มีอยู่ใน PowerShell ให้แทนที่ cmdlet New-Item ของโค้ดที่กล่าวถึงข้างต้นด้วย cmdlet Out-File

ใช้คำสั่ง if:

$file = "D:\test.txt"
if(!(Test-Path -Path $file)) {
    Out-File -FilePath $file
    Write-Output "File '$file' created successfully"
} else {
    Write-Output "File '$file' already exists"
}

เอาท์พุท :

File 'D:\test.txt' created successfully

เราได้พูดคุยถึง Test-Path cmdlet ในขณะที่อธิบายส่วนโค้ดสำหรับการใช้ New-Item cmdlet ในส่วนนี้ เราใช้ Out-File cmdlet ของ PowerShell

Out-File cmdlet จะส่งเอาต์พุตจากคำสั่งไปยังไฟล์ โดยจะเปลี่ยนเส้นทางเอาต์พุตของคำสั่งหรือสคริปต์ไปยังไฟล์แทนที่จะแสดงบนหน้าจอ โดยจะสร้างหรือเขียนทับไฟล์ที่ระบุและเขียนเอาต์พุตลงในไฟล์ แต่ในการจัดการกับการเขียนทับ เราสามารถใช้ Test-Path cmdlet ที่ตรวจสอบว่ามีไฟล์อยู่หรือไม่

ตัวอย่างเช่น เราใช้ Out-File cmdlet เพื่อสร้างไฟล์ที่มี file เป็น -Path

แทนที่ Cmdlet Test-Path

เราสามารถแทนที่ Test-Path cmdlet ภายในคำสั่ง if ด้วยสิ่งเหล่านี้เพื่อตรวจสอบว่ามีไฟล์อยู่หรือไม่:

  • Get-Item cmdlet ดึงข้อมูลเกี่ยวกับรายการในระบบไฟล์ เช่น ไฟล์หรือไดเร็กทอรี
  • Get-ChildItem cmdlet ใน PowerShell ดึงข้อมูลเกี่ยวกับไฟล์และไดเรกทอรีย่อยในไดเรกทอรี
  • Get-ItemProperty cmdlet รับคุณสมบัติของไฟล์ ไดเรกทอรี หรือรายการอื่นๆ ขึ้นอยู่กับประเภทรายการและผู้ให้บริการที่เข้าถึงรายการ
  • [System.IO.File]::Exists() เป็นวิธีการของคลาส System.IO.File ใน PowerShell ที่ตรวจสอบว่ามีไฟล์อยู่ในเส้นทางที่ระบุหรือไม่
  • dir cmdlet เป็นนามแฝงของ Get-ChildItem cmdlet

โปรดทราบว่า cmdlet เหล่านี้ทั้งหมดต้องใช้พารามิเตอร์ -ErrorAction ที่มีค่า Ignore เพื่อกำจัดข้อผิดพลาดทั้งหมด

การใช้คำสั่ง try-catch

เราสามารถแทนที่คำสั่ง if-else ของส่วนโค้ดที่กล่าวถึงข้างต้นด้วยบล็อก try-catch เพื่อสร้างไฟล์ดังต่อไปนี้:

ใช้ รายการใหม่ Cmdlet

หากต้องการสร้างไฟล์หากไม่มีอยู่ใน PowerShell:

  • ใช้คำสั่ง try เพื่อส่งข้อผิดพลาดหากมีไฟล์อยู่แล้ว
  • ใช้ cmdlet New-Item เพื่อสร้างไฟล์ใหม่ในบล็อก try
  • ใช้คำสั่ง catch เพื่อจัดการกับข้อผิดพลาดที่เกิดจากการพิมพ์ข้อความแสดงข้อผิดพลาด

ใช้คำสั่ง try-catch:

$file = "D:\test.txt"
Try {
    New-Item -ItemType File -Path $file -ErrorAction Stop
    Write-Output "File created successfully"
} Catch [System.IO.IOException]{
    Write-Host "Error: $($_.Exception.Message)"
}

เอาท์พุท :

    Directory: D:\
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         1/16/2023   4:31 PM              0 test.txt
File created successfully

ใน PowerShell คำสั่ง try-catch จะจัดการกับข้อผิดพลาดที่อาจเกิดขึ้นในสคริปต์

  • บล็อก try มีโค้ดที่อาจทำให้เกิดข้อยกเว้น
  • บล็อก catch มีโค้ดที่จะจัดการกับข้อยกเว้นหากมีปรากฏขึ้น

หากมีข้อยกเว้นปรากฏในบล็อก try ข้อผิดพลาดดังกล่าวจะถูกส่งไปยังบล็อก catch ซึ่งสามารถบันทึก แสดง หรือจัดการข้อยกเว้นได้ catch block ยังสามารถระบุการดำเนินการที่แตกต่างกันสำหรับข้อยกเว้นประเภทต่างๆ และสามารถแสดงข้อความแสดงข้อผิดพลาดได้ ช่วยให้สคริปต์ทำงานต่อไปได้แม้ว่าจะมีข้อผิดพลาดเกิดขึ้น แทนที่จะหยุดการดำเนินการ

ตัวอย่างเช่น เราใช้คำสั่ง try-catch เพื่อสร้างไฟล์ บล็อก try ประกอบด้วย cmdlet New-Item เพื่อสร้างไฟล์ใหม่ที่เส้นทางที่ระบุ คำสั่งสร้างไฟล์สำเร็จหากไม่มีอยู่ catch block จะถูกดำเนินการหากมีข้อยกเว้นเกิดขึ้น เช่น หากไฟล์นั้นมีอยู่แล้ว มันส่ง System.IO.IOException และแสดงข้อความแสดงข้อผิดพลาด:

เอาท์พุท :

Error: The file 'D:\test.txt' already exists.

ใช้ Out-File Cmdlet

หากต้องการสร้างไฟล์หากไม่มีอยู่ใน PowerShell ให้แทนที่ cmdlet New-Item ของโค้ดที่กล่าวถึงข้างต้นซึ่งอยู่ในบล็อก try ด้วย Out-File cmdlet

ใช้คำสั่ง try-catch:

$file = "D:\test.txt"
Try {
    Out-File -FilePath $file -NoClobber -ErrorAction Stop
    Write-Output "File created successfully"
} Catch [System.IO.IOException]{
    Write-Host "Error: $($_.Exception.Message)"
}

เอาท์พุท :

File created successfully

สวิตช์ -NoClobber ใน cmdlet Out-File ป้องกันไม่ให้เขียนทับไฟล์ที่มีอยู่ เมื่อสวิตช์ -NoClobber ปรากฏขึ้น หากมีไฟล์อยู่แล้วในเส้นทางไฟล์ที่ระบุ Out-File จะไม่สร้างหรือเขียนทับไฟล์และจะส่งกลับข้อผิดพลาดแทน สวิตช์นี้ช่วยเมื่อเราต้องการให้แน่ใจว่าเราไม่ได้เขียนทับไฟล์สำคัญโดยไม่ได้ตั้งใจ

ตัวอย่างเช่น เราใช้สวิตช์ -NoClobber ใน cmdlet Out-File แทนคำสั่ง if-else ขนาดใหญ่เพื่อสร้างไฟล์หากเป็นเช่นนั้น ไม่มีอยู่จริง

การใช้ One-Liners

หากต้องการสร้างไฟล์หากไม่มีอยู่ ให้ใช้หนึ่งบรรทัดดังนี้:

  • ใช้ Test-Path หรือ cmdlet อื่นๆ เพื่อตรวจสอบว่ามีไฟล์อยู่หรือไม่ หากเป็นเช่นนั้น ก็จะส่งคืน true
  • ใช้ตัวดำเนินการเชิงตรรกะ -eq เพื่อตรวจสอบว่าคำสั่งที่กล่าวถึงข้างต้นส่งคืน false หรือไม่ หากเป็นเช่นนั้น ให้ใช้ Out-File หรือ New-Item cmdlet เพื่อสร้างไฟล์

ใช้ One-Liners:

$file = "D:\test.txt"
(Test-Path -Path $file) -eq $false | New-Item -ItemType File -Path $file -ErrorAction SilentlyContinue

เอาท์พุท :

    Directory: D:\
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-a----         1/16/2023   4:48 PM              4 test.txt

เราสามารถแทนที่ Test-Path cmdlet ด้วย Get-Item หรือ cmdlet อื่นๆ ที่เราพูดคุยกันในขณะที่อธิบายส่วนโค้ดสำหรับการใช้คำสั่ง if-else . นอกจากนี้ cmdlet Out-File สามารถแทนที่ cmdlet New-Item ได้ จุดสนใจหลักของส่วนนี้คือการเขียนสคริปต์บรรทัดเดียวที่สามารถสร้างไฟล์ได้หากไม่มีอยู่

ใน PowerShell -eq เป็นตัวดำเนินการเชิงตรรกะที่เปรียบเทียบค่าสองค่าเพื่อความเท่าเทียมกัน จะส่งกลับ $True หากค่าเท่ากัน และจะส่งกลับ $False หากไม่เท่ากัน

ตัวอย่างเช่น เราตรวจสอบว่าผลลัพธ์ของ cmdlet Test-Path เท่ากับค่า False หรือไม่ หากมีไฟล์อยู่แล้ว Test-Path cmdlet จะส่งกลับ True และการเปรียบเทียบจะส่งกลับค่า False แต่ถ้าไม่มีไฟล์อยู่ Test-Path cmdlet ส่งคืน False และการเปรียบเทียบส่งคืน True

หากไม่มีไฟล์อยู่ สคริปต์จะสร้างไฟล์โดยใช้ New-Item cmdlet อย่างไรก็ตาม สวิตช์ -ErrorAction SilentlyContinue ป้องกันไม่ให้ cmdlet New-Item ส่งข้อยกเว้นหากมีไฟล์อยู่แล้ว ด้วยเหตุนี้ บรรทัดคำสั่งจะไม่แสดงเอาต์พุตหากมีไฟล์อยู่แล้ว

บทความที่เกี่ยวข้อง