是否可以使用PowerShell创建zip存档?
当前回答
function Zip-File
{
param (
[string]$ZipName,
[string]$SourceDirectory
)
Add-Type -Assembly System.IO.Compression.FileSystem
$Compress = [System.IO.Compression.CompressionLevel]::Optimal
[System.IO.Compression.ZipFile]::CreateFromDirectory($SourceDirectory,
$ZipName, $Compress, $false)
}
注意: ZipName:要创建的Zip文件的完整路径。
SourceDirectory:包含要压缩的文件的目录的完整路径。
其他回答
对于压缩,我会使用库(如Michal所建议的,7-Zip很好)。
如果安装7-Zip,安装目录将包含7z.exe,这是一个控制台应用程序。 您可以直接调用它,并使用您想要的任何压缩选项。
如果您希望使用DLL,那也应该是可能的。 7-Zip是免费的开源软件。
一个纯PowerShell的替代方案,与PowerShell 3和。net 4.5(如果你可以使用它):
function ZipFiles( $zipfilename, $sourcedir )
{
Add-Type -Assembly System.IO.Compression.FileSystem
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir,
$zipfilename, $compressionLevel, $false)
}
只需传入您想要创建的zip归档文件的完整路径,以及包含您想要压缩的文件的目录的完整路径。
Windows下压缩解压目录的完整命令行如下:
压缩: powershell.exe -nologo -noprofile -command "&{添加- type -A 'System.IO.Compression.FileSystem';[IO.Compression.ZipFile]:: CreateFromDirectory (C: \印度河,“C: \ Indus.zip”);}” 提取: powershell.exe -nologo -noprofile -command "& {Add-Type -A 'System.IO.Compression.FileSystem';[IO.Compression.ZipFile]::ExtractToDirectory('C:\ industrial .zip','C:\Indus');}”
加载[System.IO.]类,并使用它的方法是抑制不必要错误的重要步骤,因为它不是PowerShell的原生类,所以如果没有它,将会出现各种错误上下文。
我错误地控制了我的脚本到T,但在使用[System.IO.Compression]时得到了很多额外的红色“文件存在”输出。ZipFile)类
function zipFiles(
[Parameter(Position=0, Mandatory=$true]
[string] $sourceFolder,
[Parameter(Position=1, Mandatory=$true]
[string]$zipFileName,
[Parameter(Position=2, Mandatory=$false]
[bool]$overwrite)
{
Add-Type -Assembly System.IO
Add-Type -Assembly System.IO.Compression.FileSystem
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
$directoryTest = (Test-Path $dailyBackupDestFolder)
$fileTest = (Test-Path $zipFileName)
if ( $directoryTest -eq $false)
{
New-Item -ItemType Directory -Force -Path $dailyBackupDestFolder
}
if ( $fileTest -eq $true)
{
if ($overwrite -eq $true ){Remove-Item $zipFileName}
}
try
{
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourceFolder,$zipFileName,$compressionLevel)
}
catch [System.IO.IOException]
{
Write-Output ($dateTime + ' | ' + $_.Exception.Message ) | Out-File $logFile -append -force
}
}
我在这里所做的是捕获这些IO错误,例如访问已经存在的文件,捕获该错误并将其指向我正在使用更大的程序维护的日志文件。
下面是sonjz回答的一个稍微改进的版本,它增加了一个覆盖选项。
function Zip-Files(
[Parameter(Position=0, Mandatory=$true, ValueFromPipeline=$false)]
[string] $zipfilename,
[Parameter(Position=1, Mandatory=$true, ValueFromPipeline=$false)]
[string] $sourcedir,
[Parameter(Position=2, Mandatory=$false, ValueFromPipeline=$false)]
[bool] $overwrite)
{
Add-Type -Assembly System.IO.Compression.FileSystem
$compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
if ($overwrite -eq $true )
{
if (Test-Path $zipfilename)
{
Remove-Item $zipfilename
}
}
[System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir, $zipfilename, $compressionLevel, $false)
}
推荐文章
- 调用webrequest, POST参数
- 无法加载.ps1,因为在此系统上禁止执行脚本
- 是否有一个类似拉链的功能,垫到最长的长度?
- 如何获得正在执行的cmdlet的当前目录
- 如何从批处理文件运行PowerShell脚本
- 如何从PowerShell中的外部进程捕获输出到变量?
- tar和zip的区别是什么?
- 如何将PowerShell的输出重定向到执行期间的文件
- 如何告诉PowerShell等待每个命令结束后才开始下一个?
- 什么是一个好的Java库来压缩/解压缩文件?
- Xcode -但是…我们的档案在哪里?
- 如何创建一个压缩档案与PowerShell?
- BitBucket -下载ZIP格式的源代码
- $_在PowerShell中是什么意思?
- 如何使用get - childitem只获取目录?