如何使用 Compress-Archive 压缩/归档隐藏文件?
How to zip / archive hidden files using Compress-Archive?
当使用 Compress-Archive 压缩文件夹时,它会跳过所有隐藏文件。
文档页面告诉我们此 cmdlet 在后台使用 Microsoft .NET Framework API System.IO.Compression.ZipArchive。
有没有办法强制它归档隐藏文件?我无法在任何地方找到这个问题的记录。我尝试了 -Force
,但没有用。
我目前的解决方法是在压缩前使用Set-FileAttribute
删除隐藏属性。
这看起来像 Compress-Archive
cmdlet 中的 bug/oversight。由于该 cmdlet 不提供 "include hidden files" 参数但确实通过 -Path
或 -LiteralPath
参数接受源文件集合,因此我希望这...
Compress-Archive -Path (
Get-ChildItem -Path '...' -Force `
| Select-Object -ExpandProperty 'FullName' `
) -DestinationPath '...'
...或者这个...
Get-ChildItem -Path '...' -Force | Compress-Archive -DestinationPath '...'
...作为将隐藏文件传递给 cmdlet 的一种方式;为 Get-ChildItem
指定 -Force
参数的键。然而,这两个调用都会抛出这些错误...
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.
。)
在我的系统上,Microsoft.PowerShell.Archive.psm1
的 the referenced lines 812-814 是...
# 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
的隐藏文件对象的路径,cmdlet 也会在内部使用 Get-Item
...但它没有通过 -Force
,这当然会失败(尽管上一行的评论声称如此)。因此,我认为没有任何方法可以让 Compress-Archive
在您或 Microsoft 不编辑该脚本的情况下处理隐藏文件。
嗯...那真的很烦人!
我已经开始通过 Powershell 使用 7-Zip,但这当然意味着我正在使用另一种工具。这也意味着使用 Compress-Archive 几乎是多余的。
这是我的脚本的一部分,其中包含 7Zip 变量和压缩内容:
ZipPath = "$env:ProgramFiles-Zipz.exe"
If (-Not (Test-Path -Path ZipPath -PathType Leaf)) {
throw "7 Zip File 'ZipPath' Not Found"
PAUSE
}
Set-Alias 7Zip ZipPath
$ItemsToZip = @{
Path= "$TempDirectory\*"
CompressionLevel = "Fastest"
DestinationPath = $MyZipFile
Compress-Archive @ItemsToZip
7zip u $MyZipFile -ux2y2z2 "C:\Path\HiddenFile.ext"
希望对某人有所帮助
我刚刚遇到了同样的问题,我就是这样解决的
# WARNING: This only works on a windows based powershell core terminal instance.
# In a linux based powershell core instance the .dot files are not included in
# the final archive when using the -Filter example
# This will include .files like .gitignore
Get-ChildItem -Path . -Filter *.* | Compress-Archive -DestinationPath dist.zip
# This will include .dot files like .gitignore and any that are hidden like .git
Get-ChildItem -Path . -Force | Compress-Archive -DestinationPath dist.zip
我用 \[System.IO.Compression.ZipFile]::CreateFromDirectory(sourceDirectoryName, destinationArchiveFileName)
替换了 Compress-Archive
并发现(至少在 macOS 上)ZIP 文件包含一个以 .
开头的目录(这是隐藏directory/file 在 macOS 上)。这是使用 PowerShell 7.2。
当使用 Compress-Archive 压缩文件夹时,它会跳过所有隐藏文件。
文档页面告诉我们此 cmdlet 在后台使用 Microsoft .NET Framework API System.IO.Compression.ZipArchive。
有没有办法强制它归档隐藏文件?我无法在任何地方找到这个问题的记录。我尝试了 -Force
,但没有用。
我目前的解决方法是在压缩前使用Set-FileAttribute
删除隐藏属性。
这看起来像 Compress-Archive
cmdlet 中的 bug/oversight。由于该 cmdlet 不提供 "include hidden files" 参数但确实通过 -Path
或 -LiteralPath
参数接受源文件集合,因此我希望这...
Compress-Archive -Path (
Get-ChildItem -Path '...' -Force `
| Select-Object -ExpandProperty 'FullName' `
) -DestinationPath '...'
...或者这个...
Get-ChildItem -Path '...' -Force | Compress-Archive -DestinationPath '...'
...作为将隐藏文件传递给 cmdlet 的一种方式;为 Get-ChildItem
指定 -Force
参数的键。然而,这两个调用都会抛出这些错误...
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.
。)
在我的系统上,Microsoft.PowerShell.Archive.psm1
的 the referenced lines 812-814 是...
# 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
的隐藏文件对象的路径,cmdlet 也会在内部使用 Get-Item
...但它没有通过 -Force
,这当然会失败(尽管上一行的评论声称如此)。因此,我认为没有任何方法可以让 Compress-Archive
在您或 Microsoft 不编辑该脚本的情况下处理隐藏文件。
嗯...那真的很烦人! 我已经开始通过 Powershell 使用 7-Zip,但这当然意味着我正在使用另一种工具。这也意味着使用 Compress-Archive 几乎是多余的。
这是我的脚本的一部分,其中包含 7Zip 变量和压缩内容:
ZipPath = "$env:ProgramFiles-Zipz.exe"
If (-Not (Test-Path -Path ZipPath -PathType Leaf)) {
throw "7 Zip File 'ZipPath' Not Found"
PAUSE
}
Set-Alias 7Zip ZipPath
$ItemsToZip = @{
Path= "$TempDirectory\*"
CompressionLevel = "Fastest"
DestinationPath = $MyZipFile
Compress-Archive @ItemsToZip
7zip u $MyZipFile -ux2y2z2 "C:\Path\HiddenFile.ext"
希望对某人有所帮助
我刚刚遇到了同样的问题,我就是这样解决的
# WARNING: This only works on a windows based powershell core terminal instance.
# In a linux based powershell core instance the .dot files are not included in
# the final archive when using the -Filter example
# This will include .files like .gitignore
Get-ChildItem -Path . -Filter *.* | Compress-Archive -DestinationPath dist.zip
# This will include .dot files like .gitignore and any that are hidden like .git
Get-ChildItem -Path . -Force | Compress-Archive -DestinationPath dist.zip
我用 \[System.IO.Compression.ZipFile]::CreateFromDirectory(sourceDirectoryName, destinationArchiveFileName)
替换了 Compress-Archive
并发现(至少在 macOS 上)ZIP 文件包含一个以 .
开头的目录(这是隐藏directory/file 在 macOS 上)。这是使用 PowerShell 7.2。