问题描述
我想从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"