我是powershell的新手,希望列出目录中zip文件中包含的所有文件.我不想使用任何第三方工具.
Structure of the directory is
mydir > dir
a.zip
b.zip
c.zip
with each file containing files named 1.txt or 2.txt or 3.txt
I am trying to get an output in the form
a.zip:1.txt
a.zip:2.txt
b.zip:files\3.txt
b.zip:4.txt
c.zip:1.txt
d.zip:10.txt
Run Code Online (Sandbox Code Playgroud)
等等.
不幸的是我的环境不是4.5而是4.0.我能够编写这段代码但是仍然需要大量的解析来清理,因为解压缩会提供很多额外的信息.
$packagedir="C:\Packages"
$unzipcmd = "c:\bins\unzip.exe -l"
$unmatchstr = "*Archive*"
pushd .
cd $packagedir
$filelist= Get-ChildItem -Recurse | Select-Object -ExpandProperty FullName
foreach ($item in $filelist)
{$ziplist = Invoke-Expression "$unzipcmd $item";
foreach ($item2 in $ziplist)
{
if ($item2.Contains("Archive") )
{
}
else
{
echo $item "::" $item2}}
}
popd
Run Code Online (Sandbox Code Playgroud)
有没有更简单的方法来解析它.解压缩-l输出中有很多额外信息,比如列标题,分隔符和日期以及每个文件名之前的其他日期.
mou*_*sio 19
在.NET Framework 4.5中,有一个非常方便的ZipFile类.
要列出存档文件中的条目,您可以在Powershell中使用它:
[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[IO.Compression.ZipFile]::OpenRead($sourceFile).Entries
Run Code Online (Sandbox Code Playgroud)
更新:这似乎可以解决问题:]
[Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
foreach($sourceFile in (Get-ChildItem -filter '*.zip'))
{
[IO.Compression.ZipFile]::OpenRead($sourceFile.FullName).Entries.FullName |
%{ "$sourcefile`:$_" }
}
Run Code Online (Sandbox Code Playgroud)
小智 5
我也有这个疑问!我根据这个很棒的脚本制作了这个 PS 脚本:https : //gallery.technet.microsoft.com/scriptcenter/PowerShell-Get-Specific-9b35352f
它所做的只是列出所有 'txt' 文件以及找到的 zip 文件!
原始脚本将文件复制到指定的目录中——这也非常有用。
一些注意事项:
你必须定义静态变量确保没有目录变量包含最后的反斜杠,即“目录”而不是“目录/”
这里是:
#----------------------------------------------------
# STATIC VARIABLES
#----------------------------------------------------
$search = "txt"
$zips = "C:\zipfiles"
#----------------------------------------------------
Function GetZipFileItems
{
Param([string]$zip)
$split = $split.Split(".")
$shell = New-Object -Com Shell.Application
$zipItem = $shell.NameSpace($zip)
$items = $zipItem.Items()
GetZipFileItemsRecursive $items
}
Function GetZipFileItemsRecursive
{
Param([object]$items)
ForEach($item In $items)
{
$strItem = [string]$item.Name
If ($strItem -Like "*$search*")
{
Write-Host "The txt files in the zips are : $strItem"
}
}
}
Function GetZipFiles
{
$zipFiles = Get-ChildItem -Path $zips -Recurse -Filter "*.zip" | % { $_.DirectoryName + "\$_" }
ForEach ($zipFile In $zipFiles)
{
$split = $zipFile.Split("\")[-1]
Write-Host "Found zip-file : $split"
GetZipFileItems $zipFile
}
}
GetZipFiles
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
24741 次 |
| 最近记录: |