簡體   English   中英

復制沒有文件的文件夾,沒有文件夾的文件或使用PowerShell的所有文件

[英]Copy folders without files, files without folders, or everything using PowerShell

我希望能夠編寫一個PowerShell腳本來獲取文件夾(或文件夾集)並復制它們,其中可以創建文件夾結構(沒有文件),其中文件結構(沒有文件夾)可以創建,或者可以創建文件(所有或選定的) AND文件夾。

    Example:

    C:\ProdData has 3 subfolders in it
    C:\ProdData\Fld1
    C:\ProdData\Fld2
    C:\ProdData\Fld3 - has 2 subfolders under it
    C:\ProdData\Fld3\MyFolder1
    C:\ProdData\Fld3\MyFolder2

上面的每個文件夾都有各種不同大小的文件,各種文件擴展名。

我想有一個PowerShell腳本,可以在其他地方復制該文件夾結構,讓我可以選擇復制文件夾結構, 文件文件和文件夾

在上面,我希望能夠將C:\\ ProdData復制到另一個文件夾,基本上將ProdData重命名為TestData(即C:\\ ProdData復制到C:\\ TestData ),或者復制整個文件夾結構。

C:\\ProdData到另一個文件夾中,該文件夾是其他東西的子文件夾: C:\\TestArea\\TestFolders\\2012-04-01\\TestData\\ProdData\\Fld1等...

並有選擇地選擇包含文件夾,文件或兩者

理想的解決方案是(僅限文件夾)獲取文件夾結構,導出/保存,讀入,並在其他地方創建相同的結構。 我發現的一些解決方案說他們只復制了文件夾結構,但如果數據存在,那么它也會被復制,你不能排除其中一個。 我對僅保留路徑的文件專用要求有部分解決方案,但它需要一個文件:

c:\ProdData\Fld1\MyFile.dat

並將其復制到:

c:\TestData\yyyyMMdd_hhmmss_ProdData_Fld1_MyFile.dat

但這不是可以輕易解碼的東西,也不可能重新整合源結構。 我很欣賞任何關於如何在不重新發明輪子的情況下實現這一目標的想法。

以下是處理您描述的每種情況的一些想法。

僅限文件夾結構

這會將源復制到目標,遞歸子目錄但排除所有文件。

robocopy $source $dest /e /xf *.*

僅文件(展平結構)

有幾種方法可以解決這個問題,但我不知道一種特別好或優雅的方式。 這是一個尷尬但有效的方法 - 對於每個子目錄,它運行非遞歸副本到根目標文件夾。 批評或更好的替代品將是最受歡迎的。

Get-ChildItem $source -Recurse |
  Where-Object { $_.PSIsContainer -eq $true } |
  Foreach-Object { robocopy $_.FullName $dest }

一切

這種情況是最直接的。

robocopy $source $dest /e

您可以自己試驗這些開關(沿途引用robocopy /? )來微調過程。 在我看來,最棘手的情況是使目錄結構變得平坦。 您將做出一些決定,例如您希望如何處理出現在多個目錄中的相同文件名。

至於如何從命令行接受選項,我建議為你的三種情況組合Powershell參數集。 有很多博客文章討論這個概念,但你也可以在Powershell中看到TechNet或運行help about_Functions_Advanced_Parameters

復制文件夾hierarchie中的所有內容

Copy-Item $source $dest -Recurse -Force

要復制hierarchie,您可以嘗試:

$source = "C:\ProdData"
$dest = "C:\TestData"
Copy-Item $source $dest -Filter {PSIsContainer} -Recurse -Force

要展平文件結構,您可以嘗試:

$source = "C:\ProdData"
$dest = "C:\TestData"
New-Item $dest -type directory
Get-ChildItem $source -Recurse | `
    Where-Object { $_.PSIsContainer -eq $False } | `
    ForEach-Object {Copy-Item -Path $_.Fullname -Destination $dest -Force} 

祝好運!

以下只復制ProdData到TestData的文件夾結構,沒有任何文件

 $from = "C:\\ProdData" $to = "C:\\TestData" Get-ChildItem -Path $from -Recurse | ?{ $_.PSIsContainer } | Copy-Item -Destination {Join-Path $to $_.Parent.FullName.Substring($from.length)} -Force 

我提議我的解決方案:

$source = "C:\temp\"
$dest = "C:\TestData\"

#create destination directory if dont exist
New-Item -ItemType Directory $dest -Force


#To copy everything in a folder hierarchie
Get-ChildItem $source -Recurse | Copy-Item -Destination {$_.FullName.Replace($source, $dest)}  -Force

#To copy only directory hierarchie:
Get-ChildItem $source -Recurse -directory | Copy-Item -Destination {$_.FullName.Replace($source, $dest)}  -Force

#To copy only file (remove doublon be carefull):
Get-ChildItem $source -Recurse -file | Copy-Item -Destination $dest -Force

暫無
暫無

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

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