Powershell:提取文件到目录但不创建文件夹

3
我有一个文件夹,它的结构如下: test.zip -> Mark -> Today-> *.* (每个文件) 当我解压它时,结果变成了这样:test (文件夹) -> Mark (文件夹) -> Today ->*.* (每个文件) 我该如何获得这个结构:Today (文件夹) ->*.* (每个文件)
我的意思是,我想要避免创建前两个文件夹。
最好的方法是只提取文件而不包含文件夹。
 function Unzip
 {
     param([string]$zipfile, [string]$out)
     [System.IO.Compression.ZipFile]::ExtractToDirectory($zipfile, $out)
 }

unzip Test.zip $testPath

这段代码用于解压Test.zip文件到$testPath路径。请注意,此处保留了HTML标签。 编辑: 对不起,我的问题出错了。 正确的问题是:如何仅提取文件或最后一个文件夹(今天)。我想知道是否需要临时文件夹,或者是否有适当的选项,但阅读文档似乎没有。


1
你忘记发布你用来扩展存档的代码了。 - Olaf
是的,你的代码中肯定有问题,因为[System.IO.Compression.ZipFile]::ExtractToDirectory方法会在指定的目录中提取文件,这意味着如果你指定了Mark文件夹,它将在那里提取文件,而不是在任意的测试文件夹中。但是,该方法确实可以保持文件结构完整,因此如果你想要摆脱Mark,那么ZipArchive类中的其他内容可能会有用,但不是ExtractToDirectory(参考ZipArchive:https://learn.microsoft.com/en-us/dotnet/api/system.io.compression.ziparchive?view=netframework-4.8)。 - Sage Pourpre
我需要一些时间来调查。请不要关闭这个帖子。谢谢。 - John W
你不使用标准的 Powershell cmdlet Expand-Archive 有特殊原因吗?没有必要重复发明轮子。;-) - Olaf
我不知道那个 :) 我试了一下。它有一个漂亮的文本图形,但我不知道怎么只提取最后一个文件夹或唯一的文件。没有选项,也许我得搜索方法。 - John W
1个回答

2

以下是提取文件而不考虑文件夹结构的步骤。

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'

当然,现在您放弃了文件夹结构,如果需要,您将不得不实现一些处理文件名冲突的方式(例如,如果您在两个不同的文件夹中有一个Readme.txt)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接