การทำงานกับไฟล์และโฟลเดอร์
การนำทางผ่านไดรฟ์ 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 ขณะนี้เป็นอาร์เรย์ที่มีชื่อคอมพิวเตอร์ในแต่ละองค์ประกอบ