簡體   English   中英

PowerShell將文件復制到目標的子文件夾,同時排除目標中的某些文件夾

[英]PowerShell to copy files to destination's subfolders while excluding certain folders in the destination

因此,我整天都在不停地跳着舞,而永不過時的一句“給貓剝皮的方法不止一種”,讓我決定加入社區。

場景:

源文件夾“ C:\\ Updates”具有100個各種擴展名的文件。 僅將所有內容復制到“ C:\\ Prod \\”子文件夾中 ,從而覆蓋所有可能找到的重復項。

注意事項:

  1. “ C:\\ Prod”中的子文件夾名稱(目的地)非常動態並且經常更改。

  2. 使用命名約定來確定在復制源文件(保留原始版本)時需要排除目標中的哪些子文件夾。 為了便於說明,可以說任何以“!stop”開頭的文件夾名稱都應排除在復制過程之外。 (!停止*,如果考慮使用通配符)

所以,在這里,如果我很幸運,我希望得到比我更多的人來解決PS中的問題。 我今天對Copy-Item和xcopy進行了修改,因此很高興聽到其他人的輸入。

謝謝!

-克里斯

試一下:

Get-ChildItem -Path C:\Prod -Exclude !stop* -Directory `
| ForEach-Object { Copy-Item -Path C:\Updates\* -Destination $_ -Force }

這將抓取與過濾器不匹配的C:\\ Prod中的每個文件夾( -Directory開關確保僅抓取文件夾),並將其通過管道傳遞到ForEach-Object命令,在此我們運行Copy-Item命令將文件復制到目錄。

-Directory開關並非在所有版本的PowerShell中都可用; 我不知道它是哪個版本推出的。 如果您使用的舊版PowerShell不支持-Directory則可以使用以下腳本:

Get-ChildItem -Path C:\Prod -Exclude !stop* `
| Where-Object { $_.PSIsContainer } `
| ForEach-Object { Copy-Item -Path C:\Updates\* -Destination $_ -Force }

要僅選擇不以“!stop”開頭的子文件夾,請執行此操作

$Source = "C:\Updates\*"
$Dest =   "C:\Prod"
$Stop =   "^!stop"

$Destinations = GCI -Path $Dest |?{$_.PSIsContainer -and $_.Name -notmatch $Stop }
ForEach ($Destination in $Destinations) {
  Copy-Item -Path $Source -Destination $Destination.FullName -Force 
}

立即編輯將所有文件從Update復制到Source的子目錄中,而不以“!stop”開頭。-whatif開關顯示將發生的情況,以備腳本刪除-whatif。

Edit2簡化了腳本。 如果C:\\ Prod的子/子文件夾也將收到副本,則在管道前面的gci包含-rec選項。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM