วิธีคัดลอกไฟล์ใน PowerShell ด้วย Copy-Item
เราสามารถใช้ PowerShell เพื่อคัดลอกไฟล์จากที่หนึ่งไปยังอีกที่หนึ่งด้วย Copy-Item cmdlet ตำแหน่งอาจเป็นโฟลเดอร์ในเครื่องอื่นหรือคอมพิวเตอร์ระยะไกล นอกจากไฟล์แล้ว เรายังสามารถคัดลอกโฟลเดอร์ทั้งหมดที่มีโฟลเดอร์ย่อยและเนื้อหาได้อีกด้วย และยังสามารถกรองไฟล์ที่เราคัดลอกได้อีกด้วย
ในบทความนี้ เราจะดูตัวอย่างต่างๆ ของการคัดลอกไฟล์ด้วย PowerShell
คัดลอกไฟล์ด้วย PowerShell
เริ่มต้นด้วยพื้นฐานในการคัดลอกไฟล์ด้วย PowerShell เมื่อคุณต้องการคัดลอกไฟล์เดียว คุณจะต้องระบุเส้นทางต้นทางและโฟลเดอร์ปลายทาง:
Copy-Item -Path "C:\temp\files\la-ams-ad01-log-1.txt" -Destination "d:\temp\"
# Copy is a shorthand for Copy-Item:
Copy "C:\temp\files\la-ams-ad01-log-1.txt" "d:\temp\"โปรดทราบว่าคุณจะต้องลงท้ายชื่อโฟลเดอร์ปลายทางด้วย\ไม่เช่นนั้น คุณจะเปลี่ยนชื่อไฟล์ นี่เป็นหนึ่งในคุณสมบัติที่มีประโยชน์ของ Copy-Item cmdlet เราสามารถระบุชื่อใหม่สำหรับไฟล์บนปลายทางได้:
# Copy and rename the file:
Copy-Item -Path "C:\temp\files\la-ams-ad01-log-2.txt" -Destination "d:\temp\logfile.txt"คัดลอกหลายไฟล์
หากต้องการคัดลอกหลายไฟล์ด้วย PowerShell คุณสามารถใช้ตัวกรอง ซึ่งฉันจะอธิบายในบทความต่อไป หรือเลือกหลายไฟล์ในเส้นทาง ในการดำเนินการนี้ คุณจะต้องแยกแต่ละไฟล์ด้วยเครื่องหมายจุลภาค คุณจะต้องใช้โฟลเดอร์สำหรับปลายทาง
# Copy ad01-log-1.txt and ad01-log-2.txt
Copy-Item -Path C:\temp\files\ad01-log-1.txt,C:\temp\files\ad01-log-2.txt -Destination d:\temp\โฟลเดอร์คัดลอก PowerShell
เราสามารถใช้ Copy-Item cmdlet เพื่อคัดลอกโฟลเดอร์ทั้งหมดไปยังตำแหน่งใหม่ แต่เมื่อพูดถึงการคัดลอกโฟลเดอร์ สิ่งสำคัญคือต้องใช้การลงท้ายที่ถูกต้องในเส้นทางต้นทางและปลายทาง:
| Source | Destination | Results |
|---|---|---|
| c:\temp | d:\temp | Creates only the folder temp |
| c:\temp\ | d:\temp\ | Creates only the folder temp |
| c:\temp\* | d:\temp | Create folder temp and copy only the files from c:\temp |
| c:\temp\ | d:\temp -Recurse | Copies folder inc subfolders and all content |
ในตัวอย่างด้านล่าง ฉันจะใช้โครงสร้างโฟลเดอร์ต่อไปนี้โดยมีโฟลเดอร์ย่อยเป็นแหล่งที่มา:
C:\TEMP\FILES
│ 11022022-app.log
│ 11032021-app.log
│ 11032022-app.log
│ 11102021-app.log
│ 15032022-app.log
│ la-ams-ad01-log-1.txt
│ la-ams-ad01-log-2.txt
│ la-ams-ad01-log-3.txt
│ la-ams-ad01-log-4.txt
│ la-ams-file02-log-1.txt
│ la-ams-file02-log-2.txt
│
└───subfolder
la-osl-ad01-log-1.txt
la-osl-file01-log-1.txt
LT3452-process-errors.log
LT3452-process.log
readme.txtหากต้องการคัดลอกเฉพาะไฟล์และโฟลเดอร์ย่อยว่างจาก c:\temp\files เราจำเป็นต้องใช้ไวด์การ์ดสำหรับเส้นทางต้นทาง:
Copy-Item -Path "C:\temp\files\*" -Destination "d:\temp\"
# Result
D:\TEMP
│ 11022022-app.log
│ 11032021-app.log
│ 11032022-app.log
│ 11102021-app.log
│ 15032022-app.log
│ la-ams-ad01-log-1.txt
│ la-ams-ad01-log-2.txt
│ la-ams-ad01-log-3.txt
│ la-ams-ad01-log-4.txt
│ la-ams-file02-log-1.txt
│ la-ams-file02-log-2.txt
│
└───subfolder # Note - Sub folder is emptyหากต้องการคัดลอกเนื้อหาทั้งหมดรวมถึงโฟลเดอร์ย่อยด้วย PowerShell เราจะต้องระบุพารามิเตอร์ -recurce วิธีนี้จะทำให้เนื้อหาของโฟลเดอร์ย่อยถูกคัดลอกไปยังตำแหน่งใหม่ด้วย:
# Copy all content including subfolder:
Copy-Item -Path "C:\temp\files\*" -Destination "d:\temp\" -Recurse
# Result
D:\TEMP
│ 11022022-app.log
│ 11032021-app.log
│ 11032022-app.log
│ 11102021-app.log
│ 15032022-app.log
│ la-ams-ad01-log-1.txt
│ la-ams-ad01-log-2.txt
│ la-ams-ad01-log-3.txt
│ la-ams-ad01-log-4.txt
│ la-ams-file02-log-1.txt
│ la-ams-file02-log-2.txt
│
└───subfolder
la-osl-ad01-log-1.txt
la-osl-file01-log-1.txt
LT3452-process-errors.log
LT3452-process.log
readme.txtคัดลอกและรวมหลายโฟลเดอร์พร้อมกัน
สิ่งที่คุณอาจไม่ได้ใช้มากนักแต่มีประโยชน์มากก็คือความสามารถในการคัดลอกและรวมหลายโฟลเดอร์พร้อมกันด้วย Copy-Item cmdlet เราสามารถระบุเส้นทางต้นทางหลายเส้นทางไปยัง cmdlet และปลายทางเดียวได้
วิธีนี้จะทำให้เนื้อหาของตำแหน่งต้นทางทั้งหมดถูกคัดลอกไปยังตำแหน่งเดียว:
Copy-Item -Path c:\logs-server-A\*,c:\logs-server-b\* -Destination d:\logsกรองไฟล์ที่จะคัดลอก
ด้วยพารามิเตอร์ Include และ Exclude เราสามารถกรองไฟล์ที่จะคัดลอกหรือไม่ ตัวกรองจะจับคู่กับชื่อเต็มของไฟล์ (รวมถึงนามสกุล) และกับชื่อโฟลเดอร์ในเส้นทางต้นทางของคุณ
ดังนั้นในการคัดลอกเฉพาะไฟล์ที่มีนามสกุล .log เราสามารถใช้ตัวกรองรวมดังนี้:
# Copy only files with the extension .log
Copy-Item -Path c:\temp\* -Destination d:\temp -Include *.log
# Result
# Note that the .log files from the subfolder are note copied
D:\TEMP
11022022-app.log
11032021-app.log
11032022-app.log
11102021-app.log
15032022-app.logสังเกตสัญลักษณ์ตัวแทนซึ่งจำเป็นเสมอหากคุณต้องการกรองส่วนหนึ่งของชื่อ สิ่งที่ควรทราบก็คือพารามิเตอร์ -Recurse จะไม่ทำงานที่นี่ หากคุณมีโฟลเดอร์ย่อยที่มีไฟล์ .log อยู่ในโฟลเดอร์นั้นจะไม่ถูกคัดลอก ตัวกรองจะใช้เฉพาะกับระดับบนสุดของเส้นทางเท่านั้น
การใช้ตัวกรองแยก
การยกเว้นไฟล์ทำงานในลักษณะเดียวกัน เราสามารถระบุส่วนหนึ่งของชื่อไฟล์และโฟลเดอร์ที่เราไม่ต้องการคัดลอกได้ โปรดทราบว่าหากโฟลเดอร์ย่อยไม่ตรงกับสตริงที่ยกเว้น โฟลเดอร์นั้นจะถูกคัดลอกพร้อมกับเนื้อหาทั้งหมดด้วย
# Copy everything, except .log files:
Copy-Item -Path c:\temp\files\* -Destination d:\temp\ -Exclude *.log -Recurse
# Result:
D:\TEMP
│ la-ams-ad01-log-1.txt
│ la-ams-ad01-log-2.txt
│ la-ams-ad01-log-3.txt
│ la-ams-ad01-log-4.txt
│ la-ams-file02-log-1.txt
│ la-ams-file02-log-2.txt
│
└───subfolder
la-osl-ad01-log-1.txt
la-osl-file01-log-1.txt
readme.txtคัดลอกไฟล์ไปยังคอมพิวเตอร์ระยะไกลด้วย PowerShell
นอกจากนี้ยังสามารถคัดลอกไฟล์ไปยังและจากคอมพิวเตอร์ระยะไกลด้วย PowerShell ได้อีกด้วย มีสองวิธีในการทำเช่นนี้ คุณสามารถสร้างไดรฟ์เครือข่ายชั่วคราวได้โดยใช้ New-PSDrive cmdlet หรือโดยการสร้างเซสชัน PowerShell ใหม่ลงในคอมพิวเตอร์ระยะไกลก่อน
เพื่อให้ทำงานได้ คุณจะต้องมีสิทธิ์เข้าถึงคอมพิวเตอร์ระยะไกล หรือใช้ข้อมูลประจำตัวของคอมพิวเตอร์ระยะไกลเพื่อเริ่ม PSSession:
$Session = New-PSSession -ComputerName "LazyServer01" -Credential "LazyAdmin\User01"ด้วยเซสชันที่สร้างและจัดเก็บไว้ในตัวแปร $session เราสามารถคัดลอกรายการไปยังตำแหน่งใดก็ได้บนคอมพิวเตอร์ระยะไกล เส้นทางปลายทางในกรณีนี้คือเส้นทางภายในเครื่องคอมพิวเตอร์ระยะไกล ดังนั้นหากต้องการคัดลอกไฟล์ไปยังโฟลเดอร์ temp บนคอมพิวเตอร์ระยะไกล คุณสามารถใช้ c:\temp เป็นเส้นทางปลายทางได้:
# Copy all files from the local temp folder to the temp folder on the remote computer
Copy-Item -Path c:\temp\local\* -Destination c:\temp\remote\ -ToSession $Session -Recurseคุณสามารถใช้วิธีเดียวกันนี้ในการคัดลอกไฟล์จากคอมพิวเตอร์ระยะไกลไปยังเครื่องคอมพิวเตอร์ของคุณด้วย PowerShell ในกรณีนี้ เราจำเป็นต้องใช้เพียงพารามิเตอร์ -FromSession แทน -ToSession
$Session = New-PSSession -ComputerName "LazyServer01" -Credential "LazyAdmin\User01"
Copy-Item -Path c:\temp\remote* -Destination c:\temp\local\ -FromSession $Session -Recurseห่อขึ้น
PowerShell Copy-Item cmdlet มีประโยชน์มากเมื่อต้องคัดลอกไฟล์ในเครื่องคอมพิวเตอร์หรือคอมพิวเตอร์ระยะไกลของคุณ คุณไม่สามารถเปรียบเทียบกับคำสั่ง robocopy ที่ทรงพลังได้ แต่ถึงกระนั้น มันก็ยังคงเป็น cmdlet ที่มีประโยชน์
ฉันหวังว่าบทความนี้จะช่วยให้คุณคัดลอกไฟล์หรือโฟลเดอร์ด้วย PowerShell หากคุณมีคำถามใด ๆ เพียงแค่แสดงความคิดเห็นด้านล่าง
