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

Unzip ZIP files in separate folders using Powershell

我有一个文件夹,里面有几个子文件夹。每个子文件夹 may/may 不包含一些 *.ZIP 文件。

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

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

这是我的代码:

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

有人可以帮我解决这个问题吗?

这里你正在做一个字符串扩展。做下面的练习来理解这一点。

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

下面的代码应该可以解决您的问题

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

我刚刚找到了我的问题的完美答案,我愿意 post 在这里为将来遇到此主题的任何人提供答案。

我有几个问题。其中之一是在 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
}