使用Powershell在单独的文件夹中解压缩ZIP文件

时间:2018-02-13 23:11:37

标签: unzip powershell-v4.0

我有一个包含多个子文件夹的文件夹。每个子文件夹可能/可能不包含一些* .ZIP文件。

我正在尝试将每个zip文件解压缩到与原始zip文件同名的单独文件夹中(如果存在则覆盖文件夹),然后删除存档。

但是我从下面的代码得到的是提取父目录中的所有ZIP文件,这不是我想要的。

这是我的代码:

foreach ($file in (dir -recurse *.zip)) { & "c:\Program Files\7-zip\7z" x "$file" -aoa }; rm dir -recurse *.zip

有人可以帮我这个吗?

2 个答案:

答案 0 :(得分:1)

您正在进行字符串扩展。做以下练习,以了解这一点。

$r = Get-ChildItem c:\Windows\System32\cmd.exe
"$r"
$r.FullName

以下代码应解决您的问题

foreach ($file in (dir -recurse *.zip)){ 
& "c:\Program Files\7-zip\7z" x $file.FullName -aoa 
}
rm dir -recurse *.zip

答案 1 :(得分:1)

我刚刚找到了我的问题的完美答案,我愿意在这里发布给所有遇到此问题的人。

我有几个问题。其中一个是处理PowerShell中的长路径(v5.1 Windows 10)。为避免这种情况,用户应在PowerShell中安装并加载PSAlphaFS模块,并使用Get-LongChildItem而不是Get-ChildItem。为此,首先需要运行以下命令来更新系统上的PowerShell执行策略:

Set-ExecutionPolicy RemoteSigned

接下来,您需要通过以下方式安装模块:

Install-Module -Name PSAlphaFS

最后用这个加载它:

import-module PSAlphaFS

现在我们已经准备好摇滚和角色了。只需将以下代码粘贴到PowerShell中即可完成任务。 (记得改变第20行的路径)

Add-Type -AssemblyName System.IO.Compression.FileSystem
function Unzip
{
  param([string]$zipfile, [string]$outpath)
  try {
    [IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $outpath)
    echo "Done with unzip of file :) "
    $true
  } 
  catch {
    echo "Oops....Can't unzip the file"
    $false
  }
 }


 $flag = $true
while($flag)
{
 $zipFiles = Get-LongChildItem -Path "c:\Downloads\New Folder\FI" -Recurse | Where-Object {$_.Name -like "*.zip"}

 if($zipFiles.count -eq 0)
 {
    $flag = $false
 }

 elseif($zipFiles.count -gt 0)
 {
    foreach($zipFile in $zipFiles)
    {
     #create the new name without .zip
     $newName = $zipFile.FullName.Replace(".zip", "")
    if(Unzip $zipFile.FullName $newName){

        Remove-Item $zipFile.FullName   
    }


    }
 }
 Clear-Variable zipFiles
}