使用PowerShell压缩具有特定文件名的文件?

时间:2016-12-12 13:52:03

标签: powershell

我有一组名为:20161205_abc,20161205_bcd,20161205_cde,20161206_abc,20161204_abc的文件。

我有一个脚本来压缩所有名称如下的文件:20161205 *。

Add-Type -assembly 'System.IO.Compression'

[string]$zipFN = 'u:\users\riteshthakur\desktop\myZipFile.zip'
[string]$fileToZip = 'u:\users\riteshthakur\desktop\abc\20161205*.txt'

[System.IO.Compression.ZipArchive]$ZipFile = [System.IO.Compression.ZipFile]::Open($zipFN, ([System.IO.Compression.ZipArchiveMode]::Create))
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($ZipFile, $fileToZip, (Split-Path $fileToZip -Leaf))
$ZipFile.Dispose()

抛出错误:“异常调用”CreateEntryFromFile“带有”3“参数:”路径中的字符非法。“ 在U:\ Users \ riteshthakur \ Desktop \ Zip.PS1:7 char:1 + [System.IO.Compression.ZipFileExtensions] :: CreateEntryFromFile($ ZipFile,$ fileTo ...“

请帮忙。

3 个答案:

答案 0 :(得分:1)

因为*不是可接受的字符。您可以使用Get-ChildItem和过滤器替换$ filesToZip,然后使用foreach迭代值。

Add-Type -assembly 'System.IO.Compression'
Add-Type -assembly 'System.IO.Compression.FileSystem'
[string]$zipFN = 'c:\temp\myZipFile.zip'
$filesToZip = (Get-ChildItem -Path "c:\temp\" -Filter test.*).fullname

[System.IO.Compression.ZipArchive]$ZipFile = [System.IO.Compression.ZipFile]::Open($zipFN,([System.IO.Compression.ZipArchiveMode]::Create))
foreach ($fileToZip in $filesToZip) {
    [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($ZipFile, $fileToZip, (Split-Path $fileToZip -Leaf))
}
$ZipFile.Dispose()

答案 1 :(得分:1)

在PowerShell V5中你可以简单地这样做:

$zipFN = 'u:\users\riteshthakur\desktop\myZipFile.zip'
$fileToZip = 'u:\users\riteshthakur\desktop\abc\20161205*.txt'
gci $fileToZip -File | Compress-Archive -DestinationPath $zipFN -Update

答案 2 :(得分:0)

我喜欢保留文件夹结构。您必须在上面的目录中,您希望压缩该脚本才能工作。

# myzip.ps1   
# example "ls -r foo | .\myzip foo.zip

# doesn't zip empty folders

Param([parameter(ValueFromPipeline=$True)]$file, 
  [parameter(position=0)]$zipfile)

Begin {
  if (test-path $zipfile) {
    'zipfile exists'
    exit 1
  }

  Add-Type -AssemblyName 'system.io.compression.filesystem'

  # update or create                                                            
  $zip = [System.IO.Compression.ZipFile]::Open($zipfile,'create')
}

Process {     
  # "test-path $file pathtype leaf" doesn't work right       
  if ($file | test-path -pathtype leaf) {
    $rel = $file | resolve-path -relative
    $rel = $rel -replace '^\.\\','' # take .\ off front                         
    $rel = $rel -replace '^\./',''  # osx take ./ off front
    # destination, sourcefilename, entryname, compressionlevel                  
    [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip,
      $rel, $rel, 'optimal')
  } elseif ($file | test-path -pathtype container) {
    "$file is container"
  } else {
    "$file is unknown"
  }
}

End {
  $zip.dispose()
}