试图从zip powershell中提取.sql文件

时间:2014-01-13 16:49:24

标签: powershell

我试图通过zip文件搜索并将所有.sql文件解压缩到一个目录中。我可以让它解压缩所有文件,但zip中有超过200个misc文件,我只需要6个.sql文件。是否有一种简单的方法来指定.sql?

以下是我试图开始工作的示例代码,如果有更好的方法,我很乐意听到。

$shell = new-object -com shell.application
$zip = $shell.NameSpace(“C:\Temp”)

foreach($item in $zip.items()){

    if([System.IO.Path]::GetExtension($item.Path) -eq ".sql"){

        $shell.Namespace(“C:\Project\”).copyhere($item)

    }

}

2 个答案:

答案 0 :(得分:3)

如果您拥有(或抓住)PowerShell Community Extensions,则可以使用其归档命令:

Read-Archive C:\temp\foo.zip | %{$_} | Where Name -match '\.sql' | Expand-Archive

如果您在安装了.NET 4.5的系统上使用PowerShell V3,则可以使用System.IO.Compression.ZipFile类来解压缩sql文件。

Add-Type -Assembly system.io.compression.filesystem
[IO.Compression.ZipFile]::ExtractToDirectory($zipPath, $extractPath)

答案 1 :(得分:0)

我会简化它并使用变量而不是字符串文字,如下所示:

$shell = New-Object -COM 'Shell.Application'

$zipfile     = 'C:\Temp\some.zip'
$destination = 'C:\Project'

$zip = $shell.NameSpace($zipfile)

$zip.Items() | ? { $_.Path -like '*.sql' } | % {
  $shell.NameSpace($destination).CopyHere($_)
}

但除此之外你的代码应该做得很好。

但请注意,它不会递归到zip文件中的嵌套文件夹中。你需要这样的东西来处理嵌套文件夹:

function ExtractZip($fldr, $dst) {
  $fldr.Items() | ? { $_.Path -like '*.sql' } | % {
    $shell.NameSpace($dst).CopyHere($_)
  }
  $fldr.Items() | ? { $_.Type -eq 'File folder' } | % {
    ExtractZip $_.GetFolder $dst
  }
}

ExtractZip $shell.NameSpace($zipfile) $destination