Answers:
DotNetZip将允许您从PowerShell执行此操作。它不是单行的,但是该库允许您编写所需的PowerShell脚本。
您也可以使用COM界面,请参阅使用Windows PowerShell压缩文件,然后打包Windows Vista侧栏小工具。
谷歌搜索“ zip powershell”或“ unzip powershell”也可能会得到有用的结果。
这是您完全可以从Powershell无需任何外部工具即可完成的方法。这会将名为test.zip的文件解压缩到当前工作目录中:
$shell_app=new-object -com shell.application
$filename = "test.zip"
$zip_file = $shell_app.namespace((Get-Location).Path + "\$filename")
$destination = $shell_app.namespace((Get-Location).Path)
$destination.Copyhere($zip_file.items())
$destination.Copyhere($zip_file.items())
执行实际的解压缩。
function unzip($filename) { if (!(test-path $filename)) { throw "$filename does not exist" } $shell = new-object -com shell.application $shell.namespace($pwd.path).copyhere($shell.namespace((join-path $pwd $filename)).items()) }
现在,.NET Framework 4.5中提供了一个ZipFile类,您可以像这样使用:
[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)
(Resolve-Path $someDir).Path
论点而言可能更好。
您可能希望检出具有专门用于此目的的cmdlet 的PowerShell社区扩展(PSCX)。
我找到了最简单的解决方案,只使用我已经使用多年并且在UNIX环境中使用过的infozip二进制文件。
PS> zip -9r ../test.zip *
PS> cd ..
PS> unzip -t test.zip Archive: test.zip
testing: LinqRepository/ OK
testing: LinqRepository/ApplicationService.cs OK
testing: LinqRepository/bin/ OK
...
No errors detected in compressed data of test.zip.
在文本输出周围放置一个Powershell包装器是很直接的,但是实际上我从不需要它,所以我没有打扰。
我还喜欢Info-ZIP(在大多数其他Zip实用程序中都可以找到的Zip引擎)和7-Zip,这是另一个同时具有GUI和命令行Zip实用程序的收藏夹。关键是,有一些优秀的命令行实用程序可用于大多数PowerShell任务。
有一些运行命令行实用程序的技巧,这些实用程序不是在考虑使用PowerShell构建的:
运行以名称开头的数字开头的可执行文件,并在其前面加上“&”号(&)。
&7zip.exe
实用程序希望在命令行中用引号将每个令牌包装起来。
&“ c:\带有空格的路径\ SomeCommand.exe”“ / parameter2”“ / parameter2”“参数2的值”“值2`”用引号引起来“
尝试这个:
zip filename.zip (Get-ChildItem somepath\*)
甚至:
zip filename.zip (Get-Content ListOfFiles.txt)
詹姆斯·霍尔威尔(James Holwell),我喜欢您的回答,但我扩大了一点
# Example
#unzip "myZip.zip" "C:\Users\me\Desktop" "c:\mylocation"
function unzip($fileName, $sourcePath, $destinationPath)
{
$shell = new-object -com shell.application
if (!(Test-Path "$sourcePath\$fileName"))
{
throw "$sourcePath\$fileName does not exist"
}
New-Item -ItemType Directory -Force -Path $destinationPath -WarningAction SilentlyContinue
$shell.namespace($destinationPath).copyhere($shell.namespace("$sourcePath\$fileName").items())
}
我创建了一个与PowerShell 2.0兼容的模块,该模块使用本机Windows OS命令以同步方式压缩和解压缩文件。这适用于较旧的操作系统,例如Windows XP,并且不需要.Net 4.5或任何其他外部工具。该功能还将阻止脚本执行,直到所有文件都已压缩/解压缩为止。您可以在我的博客上找到更多信息和该模块。