我有一堆powerpoint演示文稿,我需要提取每一个的图像。我注意到(通过使用WinRar打开PPT文件)它包含一个' Media'所有图像所在的文件夹。是否有任何形式来提取媒体'每个文件的文件夹,每个文件的单个文件夹?
答案 0 :(得分:5)
我快速写了这个 ,所以如果有更好的方法,或者至少是一种更清洁的方式来完成你所追求的东西,我不会感到惊讶。它被编写为在存在和不存在嵌入式媒体文件夹的情况下工作。
出于测试目的,我的桌面上有一个名为pptx的文件夹,里面有四个* .pptx文件。快速脚本完成后,它为同一文件夹中的每个PowerPoint文件创建了一个文件夹。在每个文件夹中都是包含您所访问文件的媒体文件夹,或者是指示无法找到媒体文件夹的文本文件。同样,可能有一种更清洁的方式,但在此之前,这应该有效。
$Path = 'C:\users\tommymaynard\Desktop\pptx'
$Files = Get-ChildItem -Path $Path
Foreach ($File in $Files) {
New-Item -Path $File.DirectoryName -ItemType Directory -Name $File.BaseName | Out-Null
If (Get-Command -Name Expand-Archive) {
Expand-Archive -Path $File.FullName -OutputPath $File.FullName.Split('.')[0]
} Else {
Add-Type -AssemblyName System.IO.Compression.FileSystem
[System.IO.Compression.ZipFile]::ExtractToDirectory($File.FullName,$File.FullName.Split('.')[0])
} # End If-Else.
If (Test-Path -Path "$($File.FullName.Split('.')[0])\ppt\media") {
Move-Item -Path "$($File.FullName.Split('.')[0])\ppt\media" -Destination $File.FullName.Split('.')[0]
Get-ChildItem -Path $File.FullName.Split('.')[0] | Where-Object {$_.Name -ne 'media'} | Remove-Item -Recurse
} Else {
Get-ChildItem -Path $File.FullName.Split('.')[0] | Remove-Item -Recurse
New-Item -Path $File.FullName.Split('.')[0] -ItemType File -Name 'No media folder.txt' | Out-Null
} # End If-Else.
} # End Foreach.
编辑:使用.NET 所以比Expand-Archive快得多!如果您正在使用速度,并且您正在运行包含Expand-Archive的PowerShell版本,则将Get-Command -Name Expand-Archive更改为$ true -eq $ false以强制使用该.NET。要么是这样,要么只是转储第一个If-Else并取出.NET代码......如果您需要进一步的帮助,请告诉我们。
Edit2:我在自己的博客上写过这篇文章:http://tommymaynard.com/extract-media-folder-from-powerpoint-files-2017/。它有我的代码的更新版本。