Powershell - 展开存档并重命名文件,因为它包含无效字符

Posted

技术标签:

【中文标题】Powershell - 展开存档并重命名文件,因为它包含无效字符【英文标题】:Powershell - Expand-Archive and rename files as it includes invalid characters 【发布时间】:2020-04-16 15:14:03 【问题描述】:

我在使用 powershell 解压缩档案时遇到问题。

假设我已经下载了file.zip

file.zip 的文件名中带有“冒号”。 (即foo:bar.p12

使用 7zip 手动解压缩这些文件会自动将冒号 (:) 替换为下划线 (_)。工作正常!

将 expand-archive 与 powershell 一起使用会引发以下错误:

> New-Object : Exception calling ".ctor" with "1" argument(s): "The
> given path's format is not supported." At
> C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:1004
> char:52
> + ... yFileInfo = New-Object -TypeName System.IO.FileInfo -ArgumentList $cu ...
> +                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
>     + CategoryInfo          : InvalidOperation: (:) [New-Object], MethodInvocationException
>     + FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand

这是我的代码:

$zip_location = "C:\path\to\zipfiles"
$zipfiles = Get-ChildItem $zip_location -Filter *.zip

foreach ($zip in $zipfiles) 
    Expand-Archive -Path $zip_location\$zip -DestinationPath $zip_location -Force

有没有办法用 powershell 提取这些文件?谢谢。

【问题讨论】:

如果您只是将 Expand-Archive 行更改为:Expand-Archive -Path $zip_location\$zip.Replace(":","_") -DestinationPath $zip_location -Force 刚刚试过。似乎不起作用:Expand-Archive : A positional parameter cannot be found that accepts argument 'System.Object[]'. At line:5 char:5 + Expand-Archive -Path $zip_location\$zip.Replace(":","_") -Destina ... + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidArgument: (:) [Expand-Archive], ParameterBindingException + FullyQualifiedErrorId : PositionalParameterNotFound,Expand-Archive 【参考方案1】:

使用ZipFile type 手动提取文件:

# Import the containing assembly
Add-Type -AssemblyName System.IO.Compression.FileSystem

try
  # Open the zip file with ZipFile.OpenRead()
  $zipFileItem = Get-Item .\Path\To\File.zip
  $zipFile = [System.IO.Compression.ZipFile]::OpenRead($zipFileItem.FullName)

  foreach($entry in $zipFile.Entries)
    # Remove the `:` from any file name
    $targetFileName = $entry.Fullname -replace ':','_'

    # Create new file on disk, open writable stream
    $targetFileStream = $(
        New-Item -Path $targetFileName -ItemType File -Force
    ).OpenWrite()

    # Open stream to compressed file, copy to new file stream
    $entryStream = $entry.Open()
    $entryStream.BaseStream.CopyTo($targetFileStream)

    # Clean up
    $targetFileStream,$entryStream |ForEach-Object Dispose
  

finally
  # clean up
  if($zipFile) $zipFile.Dispose() 

【讨论】:

谢谢!这真的很好,除了名字被切断了。文件名(在 zip 文件中)类似于 domain.com_FOO:Bar-test1_Username@domain.com_20200416.p12。提取的文件如下所示:Bar-test1_Username@domain.com_20200416.p12 变量如下所示:$entry.Name = Bar-test1_Username@domain.com_20200416.p12 $targetFileName = Bar-test1_Username@domain.com_20200416.p12 $entry = domain.com_FOO:Bar-test1_Username@domain.com_20200416.p12 @m4xh 更新答案以替换整个: FullName 属性 好的,今天做了一些测试,我注意到所有.pwd 文件都没有被正确提取。我可以看到$zip_location 中的所有文件,但这些文件的内容是乱码。如果我右键单击-> 属性,它会显示Size on Disk: 0 Bytes。这些.pwd 文件可以用记事本打开,并且应该只包含几行文本。 Expand-Archive 工作得很好。您知道这里可能存在什么问题吗?

以上是关于Powershell - 展开存档并重命名文件,因为它包含无效字符的主要内容,如果未能解决你的问题,请参考以下文章

powershell 复制并重命名

使用 PowerShell 重命名 zip 以匹配其内容

将 .zip 存档解压缩到 .jar 文件

将当前时间分配给powershell变量

如何在 Python 中将文件写入 Zip 文件的根目录

powershell PowerShell:文件存档