Powershell - расширяет-архивирует и переименовывает файлы, так как содержит недопустимые символы - PullRequest
2 голосов
/ 16 апреля 2020

У меня проблемы с распаковкой архива с powershell.

Допустим, я скачал file.zip

file.zip, в котором есть файлы с двоеточием в именах файлов. (т. е. foo:bar.p12)

Использование 7zip для ручного распаковывания этих файлов автоматически заменяет двоеточие (:) подчеркиванием (_). Работает нормально!

Использование команды расширения-архива с 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? Спасибо.

1 Ответ

1 голос
/ 16 апреля 2020

Используйте ZipFile тип для извлечения файла (ов) вручную:

# 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() }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...