复制没有文件的文件夹,没有文件夹的文件或使用PowerShell的所有文件

时间:2012-04-03 15:36:00

标签: file powershell copy directory

我希望能够编写一个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

但这不是可以轻易解码的东西,也不可能重新整合源结构。如果不重新发明轮子,我会对如何实现这一点感到欣慰。

4 个答案:

答案 0 :(得分:30)

以下是处理您描述的每种情况的一些想法。

仅限文件夹结构

这会将源复制到目标,递归子目录但排除所有文件。

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

答案 1 :(得分:19)

复制文件夹中的所有内容

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} 
祝你好运!

答案 2 :(得分: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 

答案 3 :(得分:0)

我建议我的解决方案:

$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