在Powershell中使用7-zip

问题描述

我想从csv.gz zip文件提取csv文件。我已经下载了7-zip,并尝试将其与下面的代码一起使用:

$7zprogram = "C:\Program Files\7-Zip\7z.exe"
$sourcefile = "C:\Users\Mitesh\Desktop\file.csv.gz"
$destination = "C:\Users\Mitesh\Desktop\"

& $7zprogram e $sourcefile "-o$destination"

这不起作用,并且由于出现错误消息,因为“术语“ C:\ Program Files \ 7-Zip \ 7z.exe”未被识别为cmdlet,函数,.......。 “。

可能是什么问题?如果缺少某些内容,有人可以帮我纠正这里的代码

解决方法

尝试一下:

$command = "$installRoot\bin\7za.exe" 
$cmdparams = "x `"$Source`" -o`"$destination`" -bb3 $OverWriteSwitch >`"$env:Temp\Decompression-7z-$global:time.log`"" 

Invoke-Expression "& $command $cmdparams" 
    if ($LASTEXITCODE -gt 0) {  
        write-log "Error decompressing $Source in $Destination - check log file $env:Temp\Decompression-7z-$global:time.log"
    }

} else 
{
    write-log  "Successfully decompressed $source into $Destination"
}
,

这是使用.NET 仅适用于gzip文件的一个替代答案。我认为该应该在PowerShell 2.0及更高版本上有效。为了方便起见,我添加了一个与GZip相互转换的功能。如果要整理通过的文件,将其添加到-RemoveInputFile文件中,则有一个可选的.gz开关,反之亦然。在测试过程中,确保以其他方式返回时文件不存在很有用。 请警惕在使用示例文件进行测试之前使用此 。无论如何,这里是功能。

function ConvertTo-Gzip {
    Param (
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [System.IO.FileSystemInfo]
        $InputObject,[Parameter(Mandatory=$false)]
        [switch]
        $RemoveInputFile
    )
    Process {
        
        if ($InputObject -is [System.IO.DirectoryInfo]) {
            throw "You cannot gunzip a directory!"
        }
        else {
            # Create Filestream for new gz archive
            [System.IO.FileStream]$CompressedFileStream = [System.IO.File]::Create($InputObject.FullName + ".gz")
            $GZipStream = [System.IO.Compression.GZipStream]::new($CompressedFileStream,[System.IO.Compression.CompressionMode]::Compress)

            # Copy file to GZip filestream
            $Filestream = $InputObject.OpenRead()
            $FileStream.CopyTo($GZipStream)

            # Cleanup filestreams
            $FileStream.Dispose()
            $Filestream = $null
            $GZipStream.Dispose()
            $GZipStream = $null

            # Remove the initial file if requested.
            if ($PSBoundParameters.ContainsKey('RemoveInputFile')) {
                $InputObject.Delete()
            }
        }
    }
}

function ConvertFrom-Gzip {
    Param (
        [Parameter(Mandatory=$true,ValueFromPipeline=$true)]
        [ValidateScript({(Get-Item $_).Name.EndsWith(".gz")})]
        [System.IO.FileInfo]
        $InputObject,[Parameter(Mandatory=$false)]
        [switch]
        $RemoveInputFile
    )
    Process {
        # Create a new file and open a filestream for it
        $NewFilename = $InputObject.FullName.Remove($InputObject.FullName.Length - $InputObject.Extension.Length)
        $DecompressedFileStream = [System.IO.File]::Create($NewFilename)

        # Open the compressed file and copy the file to the decompressed stream
        $CompressedFileStream = $InputObject.OpenRead()
        $GZipStream = [System.IO.Compression.GZipStream]::new($CompressedFileStream,[System.IO.Compression.CompressionMode]::Decompress)
        $GZipStream.CopyTo($DecompressedFileStream)

        # Cleanup
        $DecompressedFileStream.Dispose()
        $GZipStream.Dispose()
        $CompressedFileStream.Dispose()
        $DecompressedFileStream,$GZipStream,$CompressedFileStream = $null

        # Remove the initial file if requested.
        if ($PSBoundParameters.ContainsKey('RemoveInputFile')) {
            $InputObject.Delete()
        }
    }
}

示例用法:

Get-Item C:\Users\Ash\Desktop\test1.txt | ConvertTo-Gzip -RemoveInputFile
Get-Item C:\Users\Ash\Desktop\test1.txt.gz | ConvertFrom-Gzip -RemoveInputFile
,

Powershell之类的声音找不到7z.exe。

您可以使用以下版本的代码来验证这一理论:

$7zprogram = "C:\Program Files\7-Zip\7z.exe"
$sourcefile = "C:\Users\Mitesh\Desktop\file.csv.gz"
$destination = "C:\Users\Mitesh\Desktop\"


if(Test-Path -Path $7zprogram){
    & $7zprogram e $sourcefile "-o$destination"
}else{
    Write-Host "7z.exe does not exist";
}

我假设它将输出7z.exe does not exist。如果是这样,请确保已安装7zip,并且其文件名和路径正确(通过了我的命令的正确测试,并且语法正确/应该可以使用)。您的问题几乎可以肯定是以下一行:$7zprogram = "C:\Program Files\7-Zip\7z.exe"