我试图通过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)
}
}
答案 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