2012-04-03 184 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

相关问题