解压缩文件并根据文件名移动到目标文件夹

时间:2016-01-14 16:37:04

标签: powershell powershell-v2.0 powershell-v3.0 powershell-v4.0 powershell-ise

我正在尝试移动zip文件夹中的文件。 Zip文件夹的名称每个月都会更改。

  1. OH_M7_AEE.zip
  2. OH_M7_AOP.zip
  3. OH_M7_AIP.zip
  4. zip文件夹包含名为 GM7_AAA_files 的子文件夹,这些子文件夹也会按月更改。

    我想要做的是将子文件夹中的csv文件移动到目标文件夹。

    所以在 OH_M7_AEE.zip 中有一个名为 GM7_AAA 的子文件夹,我想将 109EM_Main.csv 移到文件夹 Test2 109EM_Main.csv 到文件夹 Test2

    到目前为止,我只是设法使用csv文件移动子文件夹而不是我想要的。

    $path = "\\networkdrive\2. Digital\Test"
    
    $destination = "\\networkdrive\2. Digital\Test2"
    
    $shell_app= New-Object -com shell.application
    
    $files = Get-ChildItem -Path $path -filter *.zip -recurse
    
    foreach($file in $files) {
    
      $zip_file = $shell_app.namespace($file.FullName)
    
      $copyHere = $shell_app.namespace($destination)
    
      $copyHere.Copyhere($zip_file.items())
    
    }
    

    如果我没有,希望我有道理并道歉。我感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

我相信我理解你的问题。您无法很好地操作或过滤Zip文件中的项目,因为您正在处理COM对象而不是直接处理文件。而不是试图找出一种方法来操纵COM对象直接过滤掉zip文件中的csv文件,而不是我说,将整个zip文件解压缩到临时位置(存在的文件夹),然后复制/移出到目的地的文件。

#Source (Where Zip files containing CSV files are)
$path = "\\networkdrive\2. Digital\Test"

#Temp Zip Destination (Folder where we can temporarily extract the zip file)
$TempZip = "\\networkdrive\2. Digital\ExtractedZip"

#Destination (Folder where CSV's go)
$destination = "\\networkdrive\2. Digital\Test2"

$shell_app= New-Object -com shell.application

#Get Zip files
$files = Get-ChildItem -Path $path -filter *.zip -recurse

#Loop through all zip files
foreach($file in $files) {

  #Open Zip File
  $zip_file = $shell_app.namespace($file.FullName)

  #Loop through all subfolders inside Zip file
  foreach($item in $zip_file.items())
  {
    #Extract files to Temporary destination
    $shell_app.Namespace($TempZip).Copyhere($item)
  }

  #Get all the *.CSV files (not folders) from the temporary folder and move to destination
  Get-ChildItem $TempZip -Filter *.CSV -Recurse -File | Move-Item -Destination $destination

  #Clear out the files from the temp location
  Remove-Item $TempZip\* -Recurse -Force
}