2012-04-03 214 views
13

我希望能夠編寫一個PowerShell腳本來獲取一個文件夾(或一組文件夾)並複製文件夾結構(沒有文件)可以被創建,其中可以創建文件結構(不包括文件夾),或者可以創建文件夾(全部或選定的文件夾)和文件夾()。複製沒有文件的文件夾,沒有文件夾的文件或使用PowerShell的所有文件

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 

但是,這不是一件能容易被解碼並且不可能重新整合源結構。我很感激有關如何在不重新發明車輪的情況下實現這一目標的任何想法。

回答

13

在文件夾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} 

祝你好運!

26

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

文件夾結構只有

這將源複製到目的地,遞歸子目錄,但不包括所有文件。

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

+0

感謝您的建議。我甚至沒有安裝Robocopy,它非常適合需求。 我最終爲一個文件的結構做了什麼,就是將Show-Tree管到文本文件中。那完成了我之後的另一件事。沒有一件事會做到這一切,但3個相對簡單的作品合在一起就完成了我所需要的。 謝謝你的幫助! – 2012-04-04 13:13:16

+0

對於扁平化,您可以跳過中間部分,並使用Get-ChildItem上的-File選項(和Copy-Item而不是robocopy):Get-ChildItem $ source -Recurse -File | Foreach-Object {Copy-Item $ _。FullName $ dest}。雖然沒有太大的區別。 – Brandon 2013-06-12 20:55:13

+1

@Brandon好點。只要你使用Powershell 3,你當然可以這麼做(直到v3之前'-File'和'-Directory'參數才存在)。 – ajk 2013-06-13 03:05:07

1

下副本只是文件夾結構形式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

相關問題