File 使用PowerShell复制没有文件的文件夹、没有文件夹的文件或所有内容

File 使用PowerShell复制没有文件的文件夹、没有文件夹的文件或所有内容,file,powershell,copy,directory,File,Powershell,Copy,Directory,我希望能够编写一个PowerShell脚本,该脚本将获取一个文件夹(或一组文件夹)并复制它们,在其中可以创建文件夹结构(不包含文件),可以创建文件结构(不包含文件夹),或者在其中创建两个文件(全部或选定文件)可以创建和文件夹 Example: C:\ProdData has 3 subfolders in it C:\ProdData\Fld1 C:\ProdData\Fld2 C:\ProdData\Fld3 - has 2 subfolders un

我希望能够编写一个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:\testrea\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中查看或运行
关于功能的帮助\u高级\u参数

复制文件夹层次结构中的所有内容

Copy-Item $source $dest -Recurse -Force
要复制层次结构,可以尝试:

$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} 
要展平文件结构,可以尝试:

$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”
获取ChildItem-Path$from-Recurse |
?{$\.PSIsContainer}|

复制项-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

谢谢你的建议。我甚至没有安装Robocopy,它非常适合需要。最后,我对文件的结构所做的是将showtree通过管道传输到文本文件。这完成了我所追求的另一部分。没有一件事可以做到这一切,但3个相对简单的部分一起完成了我需要的。谢谢你的帮助!对于展平部分,您可以跳过中间部分,只需在Get ChildItem like(并复制Item而不是robocy)上使用-File选项:Get ChildItem$source-Recurse-File | Foreach对象{Copy Item$\ FullName$dest}。“不过差别不大。”布兰登说得对。只要您使用的是Powershell 3,您当然可以这样做(直到v3版本,
-File
-Directory
参数才存在)。我发现这对筛选特定文件以获取副本非常有用。所需要的只是在foreach
$filename=$\u.Name
中添加一个带有if check
if($filename.endswith(“dll”)
的变量,然后我就可以为开发环境调试会话提取dll。注意,您可能希望过滤掉系统dll:)。只对复制文件投赞成票。在其他例子中,我无法做到这一点。