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

การทำงานกับไฟล์และโฟลเดอร์


การนำทางผ่านไดรฟ์ PowerShell และการจัดการรายการต่างๆ ในไดรฟ์นั้นคล้ายคลึงกับการจัดการไฟล์และโฟลเดอร์บนดิสก์ไดรฟ์ Windows บทความนี้อธิบายวิธีจัดการกับงานจัดการไฟล์และโฟลเดอร์เฉพาะโดยใช้ PowerShell

แสดงรายการไฟล์และโฟลเดอร์ทั้งหมดภายในโฟลเดอร์

คุณสามารถรับรายการทั้งหมดได้โดยตรงภายในโฟลเดอร์โดยใช้ Get-ChildItem เพิ่มพารามิเตอร์ บังคับ เพื่อแสดงรายการที่ซ่อนอยู่หรือรายการระบบ ตัวอย่างเช่น คำสั่งนี้แสดงเนื้อหาโดยตรงของ PowerShell Drive C:

Get-ChildItem -Path C:\ -Force

คำสั่งแสดงรายการเฉพาะรายการที่มีอยู่โดยตรง เหมือนกับการใช้คำสั่ง dir ใน cmd.exe หรือ ls ในเชลล์ UNIX หากต้องการแสดงรายการในโฟลเดอร์ย่อย คุณต้องระบุพารามิเตอร์ Recurse คำสั่งต่อไปนี้แสดงรายการทุกอย่างบนไดรฟ์ C::

Get-ChildItem -Path C:\ -Force -Recurse

Get-ChildItem สามารถกรองรายการด้วย เส้นทาง, ตัวกรอง, รวม และ ยกเว้น พารามิเตอร์ แต่โดยทั่วไปจะขึ้นอยู่กับชื่อเท่านั้น คุณสามารถทำการกรองที่ซับซ้อนตามคุณสมบัติอื่นๆ ของรายการได้โดยใช้ Where-Object

คำสั่งต่อไปนี้ค้นหาไฟล์ปฏิบัติการทั้งหมดภายในโฟลเดอร์ Program Files ที่ถูกแก้ไขครั้งล่าสุดหลังวันที่ 1 ตุลาคม 2548 และมีขนาดไม่เล็กกว่า 1 เมกะไบต์หรือใหญ่กว่า 10 เมกะไบต์:

Get-ChildItem -Path $env:ProgramFiles -Recurse -Include *.exe |
    Where-Object -FilterScript {
        ($_.LastWriteTime -gt '2005-10-01') -and ($_.Length -ge 1mb) -and ($_.Length -le 10mb)
    }

การคัดลอกไฟล์และโฟลเดอร์

การคัดลอกเสร็จสิ้นด้วย Copy-Item คำสั่งต่อไปนี้จะสำรองสคริปต์โปรไฟล์ PowerShell ของคุณ:

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak')
}

คำสั่ง Test-Path ตรวจสอบว่ามีสคริปต์โปรไฟล์อยู่หรือไม่

หากไฟล์ปลายทางมีอยู่แล้ว ความพยายามในการคัดลอกจะล้มเหลว หากต้องการเขียนทับปลายทางที่มีอยู่แล้ว ให้ใช้พารามิเตอร์ Force:

if (Test-Path -Path $PROFILE) {
    Copy-Item -Path $PROFILE -Destination $($PROFILE -replace 'ps1$', 'bak') -Force
}

คำสั่งนี้ใช้งานได้แม้ว่าปลายทางจะเป็นแบบอ่านอย่างเดียวก็ตาม

การคัดลอกโฟลเดอร์ทำงานในลักษณะเดียวกัน คำสั่งนี้จะคัดลอกโฟลเดอร์ C:\temp\test1 ไปยังโฟลเดอร์ใหม่ C:\temp\DeleteMe ซ้ำ:

Copy-Item C:\temp\test1 -Recurse C:\temp\DeleteMe

คุณยังสามารถคัดลอกรายการที่เลือกได้ คำสั่งต่อไปนี้จะคัดลอกไฟล์ .txt ทั้งหมดที่อยู่ใน C:\data ไปยัง C:\temp\text:

Copy-Item -Filter *.txt -Path c:\data -Recurse -Destination C:\temp\text

คุณยังคงเรียกใช้คำสั่งดั้งเดิม เช่น xcopy.exe และ robocopy.exe เพื่อคัดลอกไฟล์ได้

การสร้างไฟล์และโฟลเดอร์

การสร้างรายการใหม่จะทำงานเหมือนกันกับผู้ให้บริการ PowerShell ทั้งหมด หากผู้ให้บริการ PowerShell มีรายการมากกว่าหนึ่งประเภท ตัวอย่างเช่น ผู้ให้บริการ FileSystem PowerShell จะแยกความแตกต่างระหว่างไดเรกทอรีและไฟล์ คุณจะต้องระบุประเภทรายการ

คำสั่งนี้จะสร้างโฟลเดอร์ใหม่ C:\temp\New Folder:

New-Item -Path 'C:\temp\New Folder' -ItemType Directory

คำสั่งนี้สร้างไฟล์ว่างใหม่ C:\temp\New Folder\file.txt

New-Item -Path 'C:\temp\New Folder\file.txt' -ItemType File

มันเป็นสิ่งสำคัญ

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

การลบไฟล์และโฟลเดอร์ทั้งหมดภายในโฟลเดอร์

คุณสามารถลบรายการที่มีอยู่ได้โดยใช้ Remove-Item แต่คุณจะได้รับแจ้งให้ยืนยันการลบหากรายการมีสิ่งอื่นอีก ตัวอย่างเช่น หากคุณพยายามลบโฟลเดอร์ C:\temp\DeleteMe ที่มีรายการอื่นๆ PowerShell จะพร้อมท์ให้คุณยืนยันก่อนที่จะลบโฟลเดอร์:

Remove-Item -Path C:\temp\DeleteMe
Confirm
The item at C:\temp\DeleteMe has children and the Recurse parameter wasn't
specified. If you continue, all children will be removed with the item. Are you
sure you want to continue?
[Y] Yes  [A] Yes to All  [N] No  [L] No to All  [S] Suspend  [?] Help
(default is "Y"):

หากคุณไม่ต้องการได้รับพร้อมท์สำหรับแต่ละรายการที่มีอยู่ ให้ระบุพารามิเตอร์ Recurse:

Remove-Item -Path C:\temp\DeleteMe -Recurse

การแมปโฟลเดอร์ในเครื่องเป็นไดรฟ์

คุณยังสามารถแมปโฟลเดอร์ในเครื่องได้โดยใช้คำสั่ง New-PSDrive คำสั่งต่อไปนี้สร้างไดรฟ์ในเครื่อง P: ที่รูทในไดเร็กทอรี Program Files ในเครื่อง ซึ่งมองเห็นได้จากเซสชัน PowerShell เท่านั้น:

New-PSDrive -Name P -Root $env:ProgramFiles -PSProvider FileSystem

เช่นเดียวกับไดรฟ์เครือข่าย ไดรฟ์ที่แมปภายใน PowerShell จะมองเห็นได้ในเชลล์ PowerShell ทันที หากต้องการสร้างไดรฟ์ที่แมปซึ่งมองเห็นได้จาก File Explorer ให้ใช้พารามิเตอร์ Persist อย่างไรก็ตาม สามารถใช้เฉพาะเส้นทางระยะไกลโดย คงอยู่

การอ่านไฟล์ข้อความลงในอาร์เรย์

รูปแบบการจัดเก็บข้อมูลทั่วไปรูปแบบหนึ่งสำหรับข้อมูลข้อความคือไฟล์ที่มีบรรทัดแยกกันซึ่งถือเป็นองค์ประกอบข้อมูลที่แตกต่างกัน Get-Content cmdlet สามารถใช้เพื่ออ่านไฟล์ทั้งหมดได้ในขั้นตอนเดียว ดังที่แสดงไว้ที่นี่:

Get-Content -Path $PROFILE
# Load modules and change to the PowerShell-Docs repository folder
Import-Module posh-git
Set-Location C:\Git\PowerShell-Docs

Get-Content ถือว่าข้อมูลที่อ่านจากไฟล์เป็นอาร์เรย์ โดยมีหนึ่งองค์ประกอบต่อบรรทัดของเนื้อหาไฟล์ คุณสามารถยืนยันสิ่งนี้ได้โดยตรวจสอบ ความยาว ของเนื้อหาที่ส่งคืน:

PS> (Get-Content -Path $PROFILE).Length
3

คำสั่งนี้มีประโยชน์มากที่สุดในการรับรายการข้อมูลลงใน PowerShell ตัวอย่างเช่น คุณอาจจัดเก็บรายชื่อคอมพิวเตอร์หรือที่อยู่ IP ไว้ในไฟล์ C:\temp\domainMembers.txt โดยมีหนึ่งชื่อในแต่ละบรรทัดของไฟล์ คุณสามารถใช้ Get-Content เพื่อดึงเนื้อหาไฟล์และวางไว้ในตัวแปร $Computers:

$Computers = Get-Content -Path C:\temp\DomainMembers.txt

$Computers ขณะนี้เป็นอาร์เรย์ที่มีชื่อคอมพิวเตอร์ในแต่ละองค์ประกอบ

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