【问题标题】:Powershell : ExtractToDirectory with no folder createdPowershell:ExtractToDirectory 没有创建文件夹
【发布时间】:2020-04-21 13:22:35
【问题描述】:

我有一个这样结构的 zip 文件:test.zip -> Mark -> Today-> *.* ( every files)

当我提取它时,我得到这个:test (folder) -> Mark (folder) -> Today ->*.* ( every files)

我怎样才能得到这个结构:Today (folder) ->*.* (every files)

我的意思是,我试图避免创建前两个文件夹。

最好的办法是只提取没有文件夹的文件

 function Unzip
 {
     param([string]$zipfile, [string]$out)
     [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $out)
 }

unzip Test.zip $testPath

编辑: 对不起,我在这个问题上犯了一个错误。 正确的问题是:如何仅提取文件或最后一个文件夹(今天)。我想知道我是否需要一个临时文件夹,或者是否有一个选项,但阅读文档似乎不需要

【问题讨论】:

  • 您忘记发布用于扩展存档的代码。
  • 是的,你的代码中一定有一些东西,因为 [System.IO.Compression.ZipFile]::ExtractToDirectory 方法在你指定的目录中提取,这意味着如果你指定 Mark 文件夹,它将在那里提取文件,而不是在任意测试文件夹中.这个方法确实保持文件结构完整,所以如果你也想摆脱 Mark,那么 ZipArchive 类中的其他东西可能有用,但不是 ExtractToDirectory(对 ZipArchive 的引用:docs.microsoft.com/en-us/dotnet/api/…
  • 我需要一些时间来调查。请不要关闭帖子。谢谢
  • 您不使用标准 Powershell cmdlet Expand-Archive 是否有特殊原因? ...无需重新发明轮子。 ;-)
  • 我不知道 :) 我试过了。它有一个漂亮的文本图形,但我不知道如何只能提取最后一个文件夹或唯一的文件。没有选项,可能是我必须搜索方法

标签: powershell directory unzip


【解决方案1】:

以下是您在不考虑文件夹结构的情况下仅提取文件的方法。

Add-Type -AssemblyName 'System.IO.Compression.FileSystem'

function Unzip {
    param([string]$zipfile, [string]$out)


    $Archive = [System.IO.Compression.ZipFile]::OpenRead($zipfile)
    Foreach ($entry in $Archive.Entries.Where( { $_.Name.length -gt 0 })) {
        [System.IO.Compression.ZipFileExtensions]::ExtractToFile($entry, "$out\$($entry.Name)")
    }
    $Archive.Dispose()
}

# Example 
Unzip -zipfile 'Z:\_tmp\impfiles\1.zip' -out 'Z:\_tmp\impfiles'

当然,既然您放弃了文件夹结构,您将不得不实施(如果需要)一些方法来处理文件名冲突的可能性(例如,如果您在 2 个不同的文件夹中有一个 Readme.txt)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-07-01
    • 2016-11-03
    • 2020-03-22
    • 2011-08-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多