【问题标题】:Powershell Compress-Archive include empty directoriesPowershell Compress-Archive 包含空目录
【发布时间】:2021-03-18 21:04:29
【问题描述】:

我需要在 zip 文件中包含空目录和文件。我可以使用 7-Zip 手动完成这项工作,但我想自动化它,因为我经常这样做。我最近开始学习 powershell,所以我决定试一试。

我的问题是Compress-Archive 自动丢弃空目录。我的解决方法是($Files 是脚本的参数):

$items = Get-ChildItem -Path . | Where-Object { $_.Name -in $Files }
$placeholders = @()
foreach ($item in $items) {
    if (($item | Get-ChildItem | Measure-Object).Count -eq 0 ) {
        $placeholders += (New-Item -Path "$item\.placeholder")
    }
}

在脚本的结尾

foreach ($item in $placeholders) {
    $item.Delete() 
}

这可行,但它并不漂亮,因为它导致占位符文件位于最终的 zip 中。

有没有好办法在powershell中压缩空目录?

编辑整个脚本,底部有版本信息:

[CmdletBinding()]
param (
    # Files and folders to compress, comma separated
    [Parameter(Mandatory)]
    [string[]]
    $Files,

    # zip file to create
    [Parameter(Mandatory)]
    [string]
    $ZipName
)

if (-not $ZipName.Contains(".zip")) {
    $ZipName += ".zip"
}

$items = Get-ChildItem -Path . | Where-Object { $_.Name -in $Files }
$placeholders = @()
foreach ($item in $items) {
    if (($item | Get-ChildItem | Measure-Object).Count -eq 0 ) {
        $placeholders += (New-Item -Path "$item\.placeholder")
    }
}

if ((Get-ChildItem -Path . | Where-Object { $_.Name -eq $ZipName } | Measure-Object).Count -ne 0) {
    Remove-Item -Path "$ZipName"
}

$items | Compress-Archive -DestinationPath $ZipName

foreach ($item in $placeholders) {
    $item.Delete() 
}

# output of Get-Host
# Name             : ConsoleHost
# Version          : 5.1.19041.610
# InstanceId       : c799930e-ea5e-4ec9-9e5d-41d949bf4ee4
# UI               : System.Management.Automation.Internal.Host.InternalHostUserInterface
# CurrentCulture   : en-GB
# CurrentUICulture : en-GB
# PrivateData      : Microsoft.PowerShell.ConsoleHost+ConsoleColorProxy
# DebuggerEnabled  : True
# IsRunspacePushed : False
# Runspace         : System.Management.Automation.Runspaces.LocalRunspace

EDIT2 非常奇怪的东西。再次测试它,我发誓它对我不起作用。如果我给它空目录的名称,它甚至不会创建一个 zip 文件。我将在我的新 ssd 到货后立即重新安装 Windows,也许可以解决它。

顺便说一下,我需要这个用于 Wordpress 插件开发,因为您必须将插件上传到 zip 文件中。我上传了我用这个脚本创建的档案,它产生了一个非常奇怪的结果。而不是像 Wordpress 那样每次都正确解压缩 zip,而是像这样:

some\file\which\should\be\in\a\directory.php
weird\file\again.php
normal.php

不,那些是不是路径,它们是文件名。在 Windows 上,我可以很好地解压缩它。我很困惑。

【问题讨论】:

  • 我无法复制。空目录包含在 zip 文件中。你用的是什么版本的PS?可能最好显示您的 Compress-Archive 命令。
  • @DougMaurer 我编辑了这个问题,所以整个脚本和版本信息都在那里
  • 通过说| Where-Object { $_.Name -in $Files },您会自动过滤那些没有“文件”的文件夹,因此这些空文件夹不会被压缩。除非 $Files 实际上包含您要查找的文件夹名称。
  • @santisq 它确实包含目录的名称,请参阅参数说明

标签: powershell compress-archive


【解决方案1】:

正如 Doug Maurer 所说,在 PS 中压缩空文件夹时没有问题。我也对你的功能进行了测试,没有发现任何问题。我可以毫无问题地压缩空文件夹:

PS /home/zen/Documents/test> gci -Recurse ./emptyfolderIpromise/


    Directory: /home/zen/Documents/test/emptyfolderIpromise

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           3/18/2021  6:53 PM                emptyfolderinsideemptyfolder

    Directory: /home/zen/Documents/test/emptyfolderIpromise/emptyfolderinsideemptyfolder

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           3/18/2021  6:53 PM                insideemptyfolder

    Directory: /home/zen/Documents/test/emptyfolderIpromise/emptyfolderinsideemptyfolder/insideemptyfolder

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           3/18/2021  6:53 PM                insideeeee

PS /home/zen/Documents/test> superCompresser -Files emptyfolderIpromise -ZipName myemptycompressedfolder

PS /home/zen/Documents/test> gi ./myemptycompressedfolder.zip                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                      Directory: /home/zen/Documents/test                                                                                                                                                                                                                                                                                                                                                                   
Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
-----           3/18/2021  6:54 PM            638 myemptycompressedfolder.zip

PS /home/zen/Documents/test> remove-item ./emptyfolderIpromise/ -Recurse -Force

PS /home/zen/Documents/test> gi ./emptyfolderIpromise/                         

Get-Item: Cannot find path '/home/zen/Documents/test/emptyfolderIpromise/' because it does not exist.

PS /home/zen/Documents/test> Expand-Archive ./myemptycompressedfolder.zip

Recurse   ReadOnly  PS /home/zen/Documents/test> gci ./myemptycompressedfolder -Recurse                                                                                                                                  


    Directory: /home/zen/Documents/test/myemptycompressedfolder

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           3/18/2021  6:56 PM                emptyfolderIpromise

    Directory: /home/zen/Documents/test/myemptycompressedfolder/emptyfolderIpromise

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           3/18/2021  6:56 PM                emptyfolderinsideemptyfolder

    Directory: /home/zen/Documents/test/myemptycompressedfolder/emptyfolderIpromise/emptyfolderinsideemptyfolder

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           3/18/2021  6:56 PM                insideemptyfolder

    Directory: /home/zen/Documents/test/myemptycompressedfolder/emptyfolderIpromise/emptyfolderinsideemptyfolder/insideemptyfolder

Mode                 LastWriteTime         Length Name
----                 -------------         ------ ----
d----           3/18/2021  6:56 PM                insideeeee

PS /home/zen/Documents/test> 

【讨论】:

  • 我编辑了帖子,因为它太长了,无法发表评论,请查看
  • 您是否 110% 确定当您运行函数并将空文件夹作为参数传递时,您的当前目录是空文件夹所在的位置???
  • 此外,如果您可以转到 Windows 资源管理器 > 右键单击​​一个空文件夹 > 压缩它并且可以在 Powershell 中完成同样的操作,我很确定这不是您的操作系统的问题.
  • 是的,我 100% 确定,因为如果我取消注释解决方法,空文件夹将包含在带有占位符文件的 zip 中。哦,哇,我检查了内置的 Windows 存档器或任何它被称为的东西,但它不起作用,甚至发出警告说它无法放入一个或多个文件。如果我只想压缩一个空文件夹,它不会让我, 抛出错误。 Powershell 应该是跨平台的,并且行为与我想的差不多。我看到它在 linux 上很适合你,但它在 Windows 上不起作用,我们将在重新安装后看到。
  • 好吧,好吧。我实际上在 Windows 上尝试过,事实上在压缩一个空文件夹后我没有得到任何 .zip,我也没有得到任何错误。我试过-Force。所以你是对的,我是错的。现在我不确定这是 Windows 的行为还是 PS 5.1 的行为。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-10-23
  • 1970-01-01
  • 2011-02-06
相关资源
最近更新 更多