2015-04-15 66 views
1

我是PowerShell的新手,我正在尝试编写脚本来提取.tar.gz文件。PowerShell可以提取.tgz文件吗?

它需要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 Files\7-Zip\7z.exe' e .\files.tar.gz 
& 'C:\Program Files\7-Zip\7z.exe' x -aoa -ttar .\files.tar -o'c:\foobar' 

我想这两个命令组合成一个命令,这样我可以跳过写files.tar文件保存到磁盘。

然而,当我尝试结合的功能,我得到错误信息“不正确的函数”

有没有办法来组合这些2 7zip的命令到1?

& 'C:\Program Files\7-Zip\7z.exe' e .\files.tar.gz -so | & 'C:\Program Files\7-Zip\7z.exe' x -aoa -ttar -si -o'c:\foobar' 
+1

有使用7-​​ZIP DLL,它可能会在这里有用的(我没有用它在所有但一个PowerShell模块)。这些命令中的每一个都能正确工作吗? (如果您从变量中的第一个命令捕获标准输出并通过标准输入将其传输到第二个命令?) –

+0

不要忘记,您可以在PowerShell中轻松使用.NET程序集。您可能可以使用像SharpCompress或tar-cs之类的东西。 –

回答

8

正如你可以看到7-Zip不是很擅长这个。自2009年以来,人们一直在使用asking for tarball原子操作。Here is a small program (490 KB)在Go中可以做到这一点,我为compiled it

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) 
    } 
    } 
} 
0

如果您已经安装了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 
相关问题