2016-10-06 71 views
0

我想使用Powershell从一系列子目录递归复制一组特定的文件到一个文件夹(没有源文件夹结构)。这些文件都遵循文件名格式“Writing(*)。xlsm”。另外,一些目录的文件存储在一个ZIP文件中,我想要搜索这些ZIP文件来获得相同的文件名。从源文件递归复制到单个目录,包括搜索ZIP文件

我见过很多可以复制文件的解决方案,但是结果重新创建了文件所在的文件夹结构,但我需要将它们全部捕获到一个目录中,而且我还没有看到任何似乎包括将ZIP文件的开头添加到搜索中的功能。

+1

您是否尝试过? –

+0

我有,是的。我没有足够的技巧来从头开始,并且我不使用PS足以知道许多更好的点,但是我可以采取代码并根据需要最多次地修改它。然而,在这种情况下,我一直没能找到任何可以在不创建子文件夹的情况下复制文件的工作,而且我还没有看到任何可用于从压缩存档中提取和复制这些文件的内容。 –

回答

0

试试这个:

$Path = "C:\" 
$Destination = "C:\Destination" 
$Files = @() 
$Files = @(Get-ChildItem -Path "$Path" -Filter "Writing*.xml" -Recurse).Fullname 

#Zip 
$ZipFiles = @(Get-ChildItem -Path "$Path" -Filter "*.Zip" -Recurse).Fullname 
[Void][Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem') 
Add-Type -AssemblyName System.IO.Compression.FileSystem 
$ToRemove = @() 
Foreach($Zip in $ZipFiles){ 
     $RawFiles = [IO.Compression.ZipFile]::OpenRead($Zip).Entries 
     foreach($RawFile in $RawFiles) { 
      If($RawFile.FullName -like "Writing*.xml"){ 
       $outpath = $Zip.Remove($Zip.Length - 4) 
       [System.IO.Compression.ZipFile]::ExtractToDirectory($Zip, $outpath) 
       $Files += "$outpath\" + $RawFiles.Fullname 
       $ToRemove += $outpath 
      } 
     } 

    } 

Foreach($File in $Files){ 
    Copy-Item -Path $Files -Destination $Destination 
} 

Foreach($Folder in $ToRemove){ 
    Remove-Item -Path $Folder -Force 
} 
+0

这对于不在zip文件中的文件非常适用。在zip文件上,似乎没有任何事情发生,它只是移动到下一个文件。我还注意到,我的一些压缩文件是rar格式,并且将过滤器从zip更改为rar时,它会为遇到的每个文件都引发错误。 –

+0

仔细观察之后,我需要修改zip文件中搜索的文件名。但是,当对这些文件使用时,它会抛出一个错误。看着进度,它解压档案,然后提示一个消息框“在......的项目有孩子,Recurse参数没有被指定......所有的孩子都会被删除。”继续删除所有提取的文件,并没有离开目标文件。 –

+0

我还注意到一些档案是以rar格式存在的,但将* .zip改为* .rar只会引发额外的错误“找不到中央目录记录结束。”是否有机会为zip或rar帐户添加任何内容? –