Powershell 2.0从zip提取某些文件(包括子目录)

问题描述 投票:1回答:1

抱歉,这个问题分散在互联网上,但是我还没有找到一个令人满意的答案,该答案仅使用Powershell 2.0(带有.NET v3.5)-没有外部库或程序

我正在使用以下代码从log.txt中提取ZipFile.zip(无论log.txt的位置如何]

$Destination = (new-object -com shell.application).NameSpace('C:\ZipExtractDir')
$ZipFile = (new-object -com shell.application).NameSpace('C:\ZipFile.zip')

$Destination.CopyHere(($Zipfile.Items() | where-object {$_.Name -like '*log.txt'}), 1044)
  • 如果log.txt在目录根\log.txt中,则可以工作>
  • 如果log.txt在子目录\Subfolder\log.txt中则失败
  • 如果引用文字(.zip)路径则失败{$_.Name -Like '*Subfolder\log.txt'}(双引号和单引号均失败)
  • 尝试使用-eq-like-contains''"" $_.FullName

  • 我很确定我过滤不正确-任何人都可以提供此代码的帮助,以便它也可以解析子目录吗?

抱歉,这个问题分散在Internet上,但是我还没有找到令人满意的答案,该答案仅使用Powershell 2.0(带有.NET v3.5)-没有外部库或程序正在使用...]]] >

类似于已经完成的工作,您可以像这样设置Shell.Application命名空间。然后,您可以将提取的目录复制到目标路径。

$zipFilePath = "Zipfile.zip"
$destinationPath = "C:\Users\Public\Downloads"

$zipfile = (New-Object -Com Shell.Application).NameSpace($zipFilePath)
$destination = (New-Object -Com Shell.Application).NameSpace($destinationPath)
$destination.CopyHere($zipfile.Items())

然后列出log.txt文件,我们可以使用Join-Path构建完整的提取路径。这基本上只是将压缩文件名从Join-Path附加到目标路径。然后只需使用System.IO.Path.GetFileNameWithoutExtension()System.IO.Path.GetFileNameWithoutExtension()Get-ChildItem开关递归列出文件。

-Recurse

并且要对PowerShell 2.0]进行测试,我们可以将-Filter$extractedPath = Join-Path -Path $destinationPath -ChildPath ([System.IO.Path]::GetFileNameWithoutExtension($zipFilePath)) Get-ChildItem -Path $extractedPath -Filter log.txt -Recurse 一起使用:

-version 2

UPDATE

如果要在提取前检查文件,则需要自己递归目录。以下是如何完成此操作的演示。

powershell.exe

用法:

powershell.exe -version 2 .\test.ps1
powershell file zip extract subdirectory
1个回答
0
投票

类似于已经完成的工作,您可以像这样设置Shell.Application命名空间。然后,您可以将提取的目录复制到目标路径。

© www.soinside.com 2019 - 2024. All rights reserved.