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

วิธีคัดลอกไฟล์ใน 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 เพื่อคัดลอกโฟลเดอร์ทั้งหมดไปยังตำแหน่งใหม่ แต่เมื่อพูดถึงการคัดลอกโฟลเดอร์ สิ่งสำคัญคือต้องใช้การลงท้ายที่ถูกต้องในเส้นทางต้นทางและปลายทาง:

SourceDestination Results
c:\tempd:\tempCreates only the folder temp
c:\temp\d:\temp\Creates only the folder temp
c:\temp\*d:\tempCreate folder temp and copy only the files from c:\temp
c:\temp\d:\temp -RecurseCopies 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 หากคุณมีคำถามใด ๆ เพียงแค่แสดงความคิดเห็นด้านล่าง

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