ste*_*e_o 20 directory powershell copy file
我希望能够编写一个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
Run Code Online (Sandbox Code Playgroud)
上面的每个文件夹都有各种不同大小的文件,各种文件扩展名.
我想有一个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
Run Code Online (Sandbox Code Playgroud)
并将其复制到:
c:\TestData\yyyyMMdd_hhmmss_ProdData_Fld1_MyFile.dat
Run Code Online (Sandbox Code Playgroud)
但这不是可以轻易解码的东西,也不可能重新整合源结构.我很欣赏任何关于如何在不重新发明轮子的情况下实现这一目标的想法.
ajk*_*ajk 31
以下是处理您描述的每种情况的一些想法.
仅限文件夹结构
这会将源复制到目标,递归子目录但排除所有文件.
robocopy $source $dest /e /xf *.*
Run Code Online (Sandbox Code Playgroud)
仅文件(展平结构)
有几种方法可以解决这个问题,但我不知道一种特别好或优雅的方式.这是一个尴尬但有效的方法 - 对于每个子目录,它运行非递归副本到根目标文件夹.批评或更好的替代品将是最受欢迎的.
Get-ChildItem $source -Recurse |
Where-Object { $_.PSIsContainer -eq $true } |
Foreach-Object { robocopy $_.FullName $dest }
Run Code Online (Sandbox Code Playgroud)
一切
这种情况是最直接的.
robocopy $source $dest /e
Run Code Online (Sandbox Code Playgroud)
您可以自己试验开关(robocopy /?沿途引用)以微调过程.在我看来,最棘手的情况是使目录结构变得平坦.您将做出一些决定,例如您希望如何处理出现在多个目录中的相同文件名.
至于如何从命令行接受选项,我建议为你的三种情况组合Powershell参数集.有很多博客文章讨论这个概念,但你也可以看到TechNet或help about_Functions_Advanced_Parameters在Powershell中运行.
Rei*_*out 20
复制文件夹hierarchie中的所有内容
Copy-Item $source $dest -Recurse -Force
Run Code Online (Sandbox Code Playgroud)
要复制hierarchie,您可以尝试:
$source = "C:\ProdData"
$dest = "C:\TestData"
Copy-Item $source $dest -Filter {PSIsContainer} -Recurse -Force
Run Code Online (Sandbox Code Playgroud)
要展平文件结构,您可以尝试:
$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}
Run Code Online (Sandbox Code Playgroud)
祝好运!
我提出我的解决方案:
$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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
38239 次 |
| 最近记录: |