Powershell可以提取.tgz文件吗?



我是Powershell的新手,我正在尝试编写一个脚本来提取.tar.gz文件。

解压缩文件需要 2 个步骤。

# Create a .tar file
7z.exe a -ttar files.tar *.txt 
7z.exe a -tgzip files.tar.gz files.tar

# These 2 work
 & 'C:Program Files7-Zip7z.exe' e .files.tar.gz 
 & 'C:Program Files7-Zip7z.exe' x -aoa -ttar .files.tar  -o'c:foobar'

我正在尝试将这两个命令合并为一个命令,以便我可以跳过将files.tar文件写入磁盘。

但是,当我尝试组合这些功能时,我收到错误消息"功能不正确"

有没有办法将这 2 个 7zip 命令合并为 1?

 & 'C:Program Files7-Zip7z.exe' e .files.tar.gz -so | & 'C:Program Files7-Zip7z.exe' x -aoa -ttar -si -o'c:foobar'

如您所见,7-Zip在这方面不是很好。人们一直在要求自2009年以来的压缩包原子操作。这是一个小程序(490 KB)在Go中可以做到,我为您编译了它。

package main
import (
  "archive/tar"
  "compress/gzip"
  "flag"
  "fmt"
  "io"
  "os"
  "strings"
 )
func main() {
  flag.Parse() // get the arguments from command line
  sourcefile := flag.Arg(0)
  if sourcefile == "" {
    fmt.Println("Usage : go-untar sourcefile.tar.gz")
    os.Exit(1)
  }
  file, err := os.Open(sourcefile)
  if err != nil {
    fmt.Println(err)
    os.Exit(1)
  }
  defer file.Close()
  var fileReader io.ReadCloser = file
  // just in case we are reading a tar.gz file,
  // add a filter to handle gzipped file
  if strings.HasSuffix(sourcefile, ".gz") {
    if fileReader, err = gzip.NewReader(file); err != nil {
      fmt.Println(err)
      os.Exit(1)
    }
    defer fileReader.Close()
  }
  tarBallReader := tar.NewReader(fileReader)
  // Extracting tarred files
  for {
    header, err := tarBallReader.Next()
    if err != nil {
      if err == io.EOF {
        break
      }
      fmt.Println(err)
      os.Exit(1)
    }
    // get the individual filename and extract to the current directory
    filename := header.Name
    switch header.Typeflag {
    case tar.TypeDir:
      // handle directory
      fmt.Println("Creating directory :", filename)
      // or use 0755 if you prefer
      err = os.MkdirAll(filename, os.FileMode(header.Mode))
      if err != nil {
        fmt.Println(err)
        os.Exit(1)
      }
    case tar.TypeReg:
      // handle normal file
      fmt.Println("Untarring :", filename)
      writer, err := os.Create(filename)
      if err != nil {
        fmt.Println(err)
        os.Exit(1)
      }
      io.Copy(writer, tarBallReader)
      err = os.Chmod(filename, os.FileMode(header.Mode))
      if err != nil {
        fmt.Println(err)
        os.Exit(1)
      }
      writer.Close()
    default:
      fmt.Printf("Unable to untar type : %c in file %s", header.Typeflag,
      filename)
    }
  }
}

如果你安装了python,你可以找到这个代码很方便:

$path = 'C:yourPythonFile.py'
$str = "import tarfile",
       "tar = tarfile.open(""C:/yourTarFile.tar"")",
       "tar.extractall(""."")",
       "tar.close()"
[System.IO.File]::WriteAllLines($path, $str)
cd C:
python yourPythonFile.py

相关内容

  • 没有找到相关文章

最新更新