2015-02-05 78 views
2

我正在寻找解决方案来解决使用Powershell v4创建tar.gz存档的问题。我找不到由Microsoft创建或验证的提供此类功能的扩展/数据包。是否存在这样的解决方案[tar-ing和gzip-ing]?如何使用powershell创建tar gz文件

回答

1

Microsoft在.Net 2.0中实现了gzipstream in System.IO.Compression C#中有许多例子,Powerhell中有许多例子。 Powershell Community Extensions也具有Write-Zip和Write-Tar功能。这是gzip的功能,我做了一段时间。它应该更新以处理多个输入和更好的输出命名。它也一次只处理一个文件。但如果你想看看它是如何完成的,它应该让你开始。

function New-GZipArchive 
{ 
    [CmdletBinding(SupportsShouldProcess=$true, 
        PositionalBinding=$true)] 
    [OutputType([Boolean])] 
    Param 
    (
     # The input file(s) 
     [Parameter(Mandatory=$true, 
        ValueFromPipeline=$true, 
        Position=0)] 
     [ValidateNotNull()] 
     [ValidateNotNullOrEmpty()] 
     [ValidateScript({Test-Path $_})] 
     [String] 
     $fileIn, 

     # The path to the requested output file 
     [Parameter(Position=1)] 
     [ValidateNotNull()] 
     [ValidateNotNullOrEmpty()] 
     #validation is done in the script as the only real way to determine if it is a valid path is to try it 
     [String] 
     $fileOut, 

     # Param3 help description 
     [Switch] 
     $Clobber 
    ) 
    Process 
    { 
     if ($pscmdlet.ShouldProcess("$fileIn", "Zip file to $fileOut")) 
     { 
      if($fileIn -eq $fileOut){ 
       Write-Error "You can't zip a file into itself" 
       return 
      } 
      if(Test-Path $fileOut){ 
       if($Clobber){ 
        Remove-Item $fileOut -Force -Verbose 
       }else{ 
        Write-Error "The output file already exists and the Clobber parameter was not specified. Please input a non-existent filename or specify the Clobber parameter" 
        return 
       } 
      } 
      try{ 
       #create read stream     
       $fsIn = New-Object System.IO.FileStream($fileIn, [System.IO.FileMode]::Open, [System.IO.FileAccess]::Read, [System.IO.FileShare]::Read) 
       #create out stream 
       $fsOut = New-Object System.IO.FileStream($fileOut, [System.IO.FileMode]::CreateNew, [System.IO.FileAccess]::Write, [System.IO.FileShare]::None) 
       #create gzip stream using out file stream 
       $gzStream = New-Object System.IO.Compression.GZipStream($fsout, [System.IO.Compression.CompressionMode]::Compress) 
       #create a shared buffer 
       $buffer = New-Object byte[](262144) #256KB 
       do{ 
        #read into buffer 
        $read = $fsIn.Read($buffer,0,262144) 
        #write buffer back out 
        $gzStream.Write($buffer,0,$read) 
       } 
       while($read -ne 0) 
      } 
      catch{ 
       #really should add better error handling 
       throw 
      } 
      finally{ 
       #cleanup 
       if($fsIn){ 
        $fsIn.Close() 
        $fsIn.Dispose() 
       } 
       if($gzStream){ 
        $gzStream.Close() 
        $gzStream.Dispose() 
       } 
       if($fsOut){ 
        $fsOut.Close() 
        $fsOut.Dispose() 
       } 
      } 
     } 
    } 
} 

用法:

dir *.txt | %{New-GZipArchive $_.FullName $_.FullName.Replace('.txt','.gz') -verbose -clobber} 
VERBOSE: Performing operation "Zip file to C:\temp\a.gz" on Target "C:\temp\a.txt". 
VERBOSE: Performing operation "Remove file" on Target "C:\temp\a.gz". 
VERBOSE: Performing operation "Zip file to C:\temp\b.gz" on Target "C:\temp\b.txt". 
VERBOSE: Performing operation "Remove file" on Target "C:\temp\b.gz". 
VERBOSE: Performing operation "Zip file to C:\temp\c.gz" on Target "C:\temp\c.txt". 
VERBOSE: Performing operation "Remove file" on Target "C:\temp\c.gz". 
+1

怎么样的去皮过程? – user3376246 2015-02-06 05:56:24

+1

看看powershell社区扩展https://pscx.codeplex.com/他们有一个写-tar脚本。我不知道更简单的方法,因为我从来不需要在Windows上使用tar文件。 – StephenP 2015-02-08 22:48:08

+0

Powershell社区扩展现在在Github上:https://github.com/Pscx/Pscx – garie 2017-07-12 16:25:44