Как архивировать / архивировать скрытые файлы, используя Compress-Archive? - PullRequest
0 голосов
/ 30 ноября 2018

При архивировании папок с использованием Compress-Archive он пропускает все скрытые файлы.

На странице документации говорится, что этот командлет использует Microsoft .NET Framework API System.IO.Compression.ZipArchive в фоновом режиме.

Есть ли способ заставить его архивировать скрытые файлы?Я не могу найти эту проблему нигдеЯ попробовал -Force, черт возьми, это не помогло.

Мой текущий способ - использовать Set-FileAttribute для удаления скрытого атрибута перед архивированием.

1 Ответ

0 голосов
/ 30 ноября 2018

Это похоже на ошибку / недосмотр в командлете Compress-Archive.Поскольку командлет не предоставляет параметра «включить скрытые файлы», но принимает коллекцию исходных файлов с помощью параметров -Path или -LiteralPath, я бы ожидал, что это будет ...

Compress-Archive -Path (
    Get-ChildItem -Path '...' -Force `
        | Select-Object -ExpandProperty 'FullName' `
) -DestinationPath '...'

...или это ...

Get-ChildItem -Path '...' -Force | Compress-Archive -DestinationPath '...'

... чтобы работать как способ передачи скрытых файлов в командлет;ключ указывает параметр -Force для Get-ChildItem.Однако оба этих вызова выдают эти ошибки ...

Get-Item : Could not find item ....
At C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:814 char:63
+ ... Entry.LastWriteTime = (Get-Item -LiteralPath $currentFilePath).LastWr ...
+                            ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : ObjectNotFound: (...:String) [Get-Item], IOException
    + FullyQualifiedErrorId : ItemNotFound,Microsoft.PowerShell.Commands.GetItemCommand

Exception setting "LastWriteTime": "Cannot convert null to type "System.DateTimeOffset"."
At C:\WINDOWS\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:814 char:25
+ ...             $currentArchiveEntry.LastWriteTime = (Get-Item -LiteralPa ...
+                 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], SetValueInvocationException
    + FullyQualifiedErrorId : ExceptionWhenSetting

... для первого скрытого файла в списке ввода.(Обратите внимание, что при вызове первого фрагмента без Select-Object -ExpandProperty 'FullName' вместо этого выдается Compress-Archive : The path '...' either does not exist or is not a valid file system path..)

В моей системе ссылочные строки 812-814 из Microsoft.PowerShell.Archive.psm1 являются ...

# Updating  the File Creation time so that the same timestamp would be retained after expanding the compressed file. 
# At this point we are sure that Get-ChildItem would succeed.
$currentArchiveEntry.LastWriteTime = (Get-Item -LiteralPath $currentFilePath).LastWriteTime

Итак, даже если мы передадим -Force в Get-ChildItem, чтобы получить пути к скрытым файловым объектам для передачи в Compress-Archive, внутренний командлет снова извлекает эти файловые объекты, используя Get-Item ...но это не проходит -Force, что, конечно, не удастся (несмотря на то, что говорится в комментарии к предыдущей строке).Таким образом, я не думаю, что есть какой-либо способ заставить Compress-Archive работать со скрытыми файлами без редактирования сценария вами или Microsoft.

...