การเขียนสคริปต์ powershell เพื่อคัดลอกไฟล์ที่มีนามสกุลจากโฟลเดอร์หนึ่งไปยังอีกโฟลเดอร์หนึ่ง


10

ฉันต้องการเขียนสคริปต์ powershell ที่ได้รับพารามิเตอร์ต่อไปนี้เป็นอินพุต:
โฟลเดอร์ที่คัดลอกจากส่วนขยายอนุญาตให้โฟลเดอร์ที่จะคัดลอกและบูลีนระบุว่าการเปลี่ยนแปลงควรเริ่มต้น IIS ชื่อผู้ใช้และรหัสผ่าน
cmdlets ใดที่ฉันควรพิจารณาเนื่องจากกำลังคัดลอกไปยังเซิร์ฟเวอร์ระยะไกล
ฉันจะอ่านพารามิเตอร์เป็นตัวแปรได้อย่างไร
ฉันจะเริ่ม IIS ได้อย่างไร

เนื่องจากฉันอาจต้องการคัดลอกหลายโฟลเดอร์ฉันจะเขียนสคริปต์ PowerShell ที่เรียกใช้สคริปต์ PowerShell ได้อย่างไร


ว้าวขออภัยในความล่าช้าในการตอบกลับใด ๆ ... คุณยังต้องการความช่วยเหลือหรือไม่?
มาร์โคชอว์

ใช่ฉันไม่รู้วิธีเริ่มต้น IIS ใหม่จริงหรือ ฉันจะแน่ใจได้อย่างไรว่าไฟล์ถูกคัดลอกจริงๆ?
the_drow

คำตอบ:


22

Get-ChildItemช่วยให้คุณสามารถแสดงรายการไฟล์และไดเรกทอรีรวมถึงตัวกรองชื่อซ้ำ Copy-Itemช่วยให้คุณสามารถคัดลอกไฟล์

มีการทับซ้อนกันมากมายในแง่ของการเลือกไฟล์บ่อยครั้งCopy-Itemที่มันจะเพียงพอแล้วขึ้นอยู่กับรายละเอียดของสิ่งที่คุณต้องการ (เช่นคุณต้องการที่จะรักษาโครงสร้างของโฟลเดอร์หรือไม่)

ในการคัดลอกทั้งหมด*.fooและ*.barจาก StartFolder ไปยัง DestFolder:

Copy-Item -path "StartFolder" -include "*.foo","*.bar" -Destination "DestFolder"

หากคุณต้องการรักษาโครงสร้างของโฟลเดอร์ให้ยากขึ้นเพราะคุณจำเป็นต้องสร้างชื่อโฟลเดอร์ปลายทางสิ่งที่ชอบ:

$sourcePath = 'C:\StartFolder'
$destPath = 'C:\DestFolder'

Get-ChildItem $sourcePath -Recurse -Include '*.foo', '*.bar' | Foreach-Object `
    {
        $destDir = Split-Path ($_.FullName -Replace [regex]::Escape($sourcePath), $destPath)
        if (!(Test-Path $destDir))
        {
            New-Item -ItemType directory $destDir | Out-Null
        }
        Copy-Item $_ -Destination $destDir
    }

แต่robocopyมีแนวโน้มที่จะง่ายขึ้น:

robocopy StartFolder DestFolder *.foo *.bar /s

ในที่สุดวิธีการเลือกจะขึ้นอยู่กับรายละเอียดของสิ่งที่จำเป็น

(ในข้างต้นฉันหลีกเลี่ยงนามแฝง (เช่นCopy-Itemมากกว่าcopy) และใช้ชื่อพารามิเตอร์อย่างชัดเจนแม้ว่าจะเป็นตำแหน่งก็ตาม)


2
ไม่ทำงานฉันลองแล้ว: Copy-Item -path "C:\Users\username\Pictures\" -include "*.JPG", "*.PNG" -Destination "D:\"มีและไม่มี - ชดเชย - ไม่มีอะไรเกิดขึ้น
Carmageddon

6

ฉันไม่สามารถระบุส่วน IIS ได้ แต่การคัดลอกไฟล์ในขณะที่รักษาโครงสร้างไดเรกทอรีอาจทำได้ง่ายกว่าที่แสดงในคำตอบอื่น ๆ :

Copy-Item -path "StartFolder" -Recurse -Include "*.foo","*.bar" -Destination "DestFolder" -Container

-Containerอาร์กิวเมนต์เป็นส่วนมายากลที่จะทำซ้ำโครงสร้างในรูปแบบต่างๆตามที่อยู่ในแหล่งที่มา


ฉันไม่สามารถทำงานกับ-Include... แม้ว่าฉันจะสามารถคัดลอกทุกอย่างโดยไม่ต้อง-Include
Ben Polinsky

1

ทางออกเดียวที่ได้ผลสำหรับฉันคือ

Copy-Item -path 'c:\SourceFolder\*.foo' -destination 'c:\DestFolder'

โซลูชันอื่น ๆ ที่ใช้-Includeพารามิเตอร์ไม่ทำงาน


1

อย่างที่บางคนพูดถึงที่นี่ - รวมถึงไม่ทำงาน

เพื่อให้ทำงานกับโฟลเดอร์ซ้อนกันฉันใช้สองขั้นตอนวิธี: 'ตัวกรอง' + ลบโฟลเดอร์ว่าง

#copy with folder structure
Copy-Item -path $source -Recurse -Filter "*.foo" -Destination $destination -Container

#remove empty folders
dir $destination -Directory -Recurse |
    %{ $_.FullName} |
    sort -Descending |
    where { !@(ls -force $_) } |
    rm 

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.