Board logo

标题: [文件操作] 批处理如何打开指定目录下(包含子目录)的ppt文件并另存到其他目录 [打印本页]

作者: hzliew    时间: 2016-7-15 20:43     标题: 批处理如何打开指定目录下(包含子目录)的ppt文件并另存到其他目录

本帖最后由 pcl_test 于 2016-7-16 14:34 编辑

请教:搜索某个目录(比如D:\课件,包含子目录)下的所有ppt文件,逐一打开然并以原文件名另存到另一个目录下(比如E:\temp)后关闭,直到所有的文件都执行完毕。请问这个批处理怎么写?先谢谢了。
作者: hzliew    时间: 2016-7-15 22:12

或者谁能告诉我,如何用批处理命令实现对ppt文件的另存为也可以,不是复制,是打开后另存为哦。谢谢。
作者: gawk    时间: 2016-7-15 22:27

能够介绍一下这样操作的目的是啥?
作者: hzliew    时间: 2016-7-15 22:31

本帖最后由 pcl_test 于 2016-7-16 00:51 编辑

回复 3# gawk


    回楼上的:原因比较特殊,极少数人会碰到这个问题。由于我的课件被内部加入了水印,直接拷贝出去在别的电脑会无法读取。但如果先打开后再另存为到一个特殊目录,即可脱掉水印,就可以拷贝了。课件比较多,所以希望批处理。方法不限,能用VBS语法实现也行。
作者: hzliew    时间: 2016-7-16 09:52

我编写了一个脚本,但该脚本只能找到“C:\”根目录下的ppt文件,如何找到某目录(包含子目录)下的所有ppt文件并进行保存?我的脚本如下:
strComputer = "."
on error resume next
Set objWMIService = GetObject("winmgmts:" _
     & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set pptApp = CreateObject("PowerPoint.application")
Set FileList = objWMIService.ExecQuery _
     ("ASSOCIATORS OF {Win32_Directory.Name='c:'} Where " _
         & "ResultClass = CIM_DataFile")
For Each objFile In FileList
     If objFile.Extension = "ppt" Then
  pptApp.visible = true
  Set pptSelection = pptApp.Presentations.Open("c:\" & objFile.FileName & "." & objFile.Extension)
  pptSelection.SaveAs("c:\" & objFile.FileName & "2.ppt")
  pptSelection.close
     End If
Next
pptApp.quit
作者: WHY    时间: 2016-7-16 10:46

拿去花
  1. @if (0)==(0) echo off
  2. set "srcDir=D:\test"
  3. set "dstDir=E:\Temp"
  4. md "%dstDir%" 2>nul
  5. dir /b /a-d /s "%srcDir%\*.ppt" | cscript //nologo //e:jscript "%~f0" "%dstDir%"
  6. pause & exit
  7. @end
  8. var dstDir = WSH.Arguments(0) + '\\';
  9. var fso = new ActiveXObject('Scripting.FileSystemObject');
  10. var objApp = new ActiveXObject('PowerPoint.Application');
  11. objApp.Visible = true;
  12. while(!WSH.StdIn.AtEndOfStream){
  13.     var strFile = WSH.StdIn.ReadLine();
  14.     var strName = fso.GetBaseName(strFile);
  15.     var strNewFile = dstDir + strName + '.ppt';
  16.     var i = 0;
  17.     while(fso.FileExists(strNewFile))strNewFile = dstDir + strName + '(' + (++i) + ').ppt';
  18.     var objPres = objApp.Presentations.Open(strFile, false, false, false);
  19.     objPres.SaveAs(strNewFile, 1, false);
  20.     objPres.Close();
  21. }
  22. objApp.Quit()
复制代码

作者: hzliew    时间: 2016-7-16 11:20

本帖最后由 hzliew 于 2016-7-16 11:21 编辑

回复 6# WHY


    谢谢,不过失败了。我将你的代码保存为convert.bat,放在D:\test 下运行(该目录放了一个样本ppt文件),得到出错提示:
D:\test\convert.bat<11,1>Microsoft JScript 运行时错误: Automation 服务器不能创建对象

请按任意键继续...

我的系统为XP系统,是否跟系统有关?
作者: ygqiang    时间: 2016-7-16 11:43

回复 7# hzliew


    6楼代码,win7 64系统测试成功。
作者: hzliew    时间: 2016-7-16 12:20

问题出在var objApp = new ActiveXObject('PowerPoint.Application');这一行上。难道XP系统对调用ActiveXObject很敏感?
作者: pcl_test    时间: 2016-7-16 12:29

本帖最后由 pcl_test 于 2016-7-16 19:05 编辑

试试vbs会不会报错
  1. Dim i
  2. Set fso = CreateObject("Scripting.FileSystemObject")
  3. Set pptApp = CreateObject("PowerPoint.application")
  4. pptApp.visible = true
  5. srcFolder = "D:\ppt"  '源文件夹
  6. dstFolder = "E:\另存"  '目标文件夹
  7. If Not fso.FolderExists(dstFolder) Then fso.CreateFolder(dstFolder)
  8. Call getSubFiles(srcFolder, "ppt")
  9. pptApp.Quit
  10. msgbox "Done"
  11. '遍历文件夹查找指定扩展名文件
  12. Function getSubFiles(path, extension)
  13.     Set Folder = fso.GetFolder(path)
  14.     Set SubFolders = Folder.SubFolders
  15.       
  16.     Set Files = Folder.Files
  17.     For Each File In Files
  18.         If LCase(Right(File.Name, Len(extension))) = LCase(extension) Then
  19.             SaveAsPPT File
  20.         End If
  21.     Next
  22.       
  23.     For Each SubFolder In SubFolders
  24.         Call getSubFiles(SubFolder.Path, extension)
  25.     Next
  26.    
  27.     Set Folder = nothing
  28.     Set SubFolders = nothing
  29. End Function
  30. Function SaveAsPPT(file)
  31.     i=i+1  '避免重名
  32.     Set ppt = pptApp.Presentations.Open(file.Path)
  33.     ppt.SaveAs(dstFolder&"\"&i&"_"&file.Name)
  34.     ppt.Close
  35. End Function
复制代码

作者: hzliew    时间: 2016-7-16 12:36

本帖最后由 hzliew 于 2016-7-16 12:40 编辑
试试vbs会不会报错
pcl_test 发表于 2016-7-16 12:29



    WIN7下测试成功,下面试试XP系统
作者: pcl_test    时间: 2016-7-16 12:38

回复 11# hzliew

ppt的所在文件夹你改成你自己的没?
作者: hzliew    时间: 2016-7-16 12:41

回复  hzliew

ppt的所在文件夹你改成你自己的没?
pcl_test 发表于 2016-7-16 12:38



    不好意思,刚忘了改。改了WIN7下是成功的,现在看看XP。
作者: hzliew    时间: 2016-7-16 12:52

本帖最后由 hzliew 于 2016-7-16 12:55 编辑

怎么插入截图啊,XP系统下还是那个问题,第3行:ActiveX部件不能创建对象:“PowerPoint application”,看来这是XP系统的顽疾。。。
作者: pcl_test    时间: 2016-7-16 14:11

回复 14# hzliew

xp你重新安装微软的Office软件
  1. Set pptApp = CreateObject("PowerPoint.application")
  2. file = "D:\ppt\2.ppt"  'ppt文件
  3. pic = "D:\ppt\2.jpg"  '需插入的图片
  4. pptApp.visible = true
  5. Set ppt = pptApp.Presentations.Open(file)
  6. Set slide = ppt.Slides(1)  '第一张幻灯片
  7. Call slide.Shapes.AddPicture(pic, False, True, 100, 100, 400, 400)  '插入图片
复制代码

作者: hzliew    时间: 2016-7-16 15:36

本帖最后由 hzliew 于 2016-7-16 15:53 编辑
回复  hzliew

xp你重新安装微软的Office软件
pcl_test 发表于 2016-7-16 14:11



    真没想到是office自身的问题,重装office就好了,谢谢您的提醒。再次感谢您以及6楼的兄弟,以非常牛X的而且不同的思路和视角解决了此问题。

追加一个问题:能否在保存这些文件时保持原来文件的目录结构?比如,源目录中D:\test\chap1\1.ppt, D:\test\chap2\1.ppt, D:\test\chap3\1.ppt, 转换到E:\Temp后,分别为E:\Temp\chap1\1.ppt,E:\Temp\chap2\1.ppt,E:\Temp\chap3\1.ppt,也就是让那些上千个ppt文件分别保存在各自不同的章节目录里,只是根目录变了,其他不变?
作者: hzliew    时间: 2016-7-16 16:46

本帖最后由 pcl_test 于 2016-7-24 19:47 编辑

回复 10# pcl_test

我仿照您的代码来转换doc文档,为何提示33行类型不匹配:
  1. Set fso = CreateObject("Scripting.FileSystemObject")
  2. Set wordApp = CreateObject("Word.application")
  3. Set ws = CreateObject("WScript.Shell")
  4. wordApp.visible = true
  5. srcFolder = "D:\test"  '源文件夹
  6. dstFolder = "E:\Temp"  '目标文件夹
  7. If Not fso.FolderExists(dstFolder) Then fso.CreateFolder(dstFolder)
  8. Call getSubFiles(srcFolder, "doc")
  9. wordApp.Quit
  10. msgbox "Done"
  11. '遍历文件夹查找指定扩展名文件
  12. Function getSubFiles(path, extension)
  13.     Set Folder = fso.GetFolder(path)
  14.     Set SubFolders = Folder.SubFolders
  15.       
  16.     Set Files = Folder.Files
  17.     For Each File In Files
  18.         If LCase(Right(File.Name, Len(extension))) = LCase(extension) Then
  19.             SaveAsDOC Folder, file
  20.         End If
  21.     Next
  22.       
  23.     For Each SubFolder In SubFolders
  24.         Call getSubFiles(SubFolder.Path, extension)
  25.     Next
  26.    
  27.     Set Folder = nothing
  28.     Set SubFolders = nothing
  29. End Function
  30. Function SaveAsDOC(folder, file)  '增加保留源文件目录结构
  31.     newpath = replace(LCase(Left(folder.Path, Len(srcFolder)))&Mid(folder.Path, Len(srcFolder)+1), LCase(srcFolder), dstFolder)
  32.     If Not fso.FolderExists(newpath) Then ws.run "cmd /c md """&newpath&"", 0
  33.     Set doc = wordApp.Documents.Open(file.Path)
  34.     doc.SaveAs(newpath&"\"&file.Name)
  35.     doc.Close
  36. End Function
复制代码

作者: WHY    时间: 2016-7-16 18:00

本帖最后由 WHY 于 2016-7-17 00:30 编辑

回复 16# hzliew
  1. @if (0)==(0) echo off
  2. set "srcDir=D:\Test"
  3. set "dstDir=E:\Temp"
  4. xcopy /s /t "%srcDir%\*" "%dstDir%\"
  5. dir /b /a-d /s "%srcDir%\*.ppt" | cscript //nologo //e:jscript "%~f0" "%srcDir%" "%dstDir%"
  6. (for /f "delims=" %%i in ('dir /b /ad /s "%dstDir%\*" ^| sort /r') do rd "%%i") 2>nul
  7. pause & exit
  8. @end
  9. var arr = WSH.Arguments;
  10. var reg = new RegExp('^' + arr(0).replace(/[\^$+\-\\()[\]{}.]/g, '\\$&'), 'i');
  11. var fso = new ActiveXObject('Scripting.FileSystemObject');
  12. var objApp = new ActiveXObject('PowerPoint.Application');
  13. objApp.Visible = true;
  14. while(!WSH.StdIn.AtEndOfStream){
  15.     var strFile = WSH.StdIn.ReadLine();
  16.     var strNewFile = strFile.replace(reg, arr(1));
  17.     var objPres = objApp.Presentations.Open(strFile, false, false, false);
  18.     objPres.SaveAs(strNewFile);
  19.     objPres.Close();
  20. }
  21. objApp.Quit()
复制代码
正则表达式漏掉特殊字符“.” 补上
作者: WHY    时间: 2016-7-16 18:05

回复 17# hzliew


    把 33 行改成 File.Path
作者: hzliew    时间: 2016-7-16 18:21

回复 19# WHY


    还是您火眼金睛啊。。。
作者: hzliew    时间: 2016-7-16 18:23

回复  hzliew
WHY 发表于 2016-7-16 18:00



    哇塞,兄弟真牛B,代码简洁,堪称完美!佩服佩服!
作者: pcl_test    时间: 2016-7-16 19:10

回复 17# hzliew

17楼已改
作者: hzliew    时间: 2016-7-16 21:25

回复  hzliew

17楼已改
pcl_test 发表于 2016-7-16 19:10



    经测试运行,您的代码正确无误。至此,问题圆满解决,谢谢!
作者: WHY    时间: 2016-7-22 23:59

我觉得 pcl_test 版主17楼的vbs方案考虑不够周全

假设doc文件全部位于 E:\Temp 目录的下一级目录,创建文件夹会失败
另外,假设 srcFolder 变量值为D:\test,而实际目录名为D:\TEST
由于vbs的replace方法区分大小写,字符串不会被替换
作者: WHY    时间: 2016-7-23 11:45

  1. Dim srcDir, dstDir, fso, objApp
  2. srcDir = "D:\Test"
  3. dstDir = "E:\Temp"
  4. Set fso = CreateObject("Scripting.FileSystemObject")
  5. Set objApp = CreateObject("PowerPoint.Application")
  6. objApp.Visible = True
  7. Call EnumFiles(srcDir)
  8. objApp.Quit
  9. Set objApp = Nothing : Set fso = Nothing
  10. Function EnumFiles(strPath)
  11.     Dim objFile, strExt, arr, strNewFile, objFolder
  12.     For Each objFile In fso.GetFolder(strPath).Files
  13.         strExt = fso.GetExtensionName(objFile.Path)
  14.         If LCase(Left(strExt, 3)) = "ppt" Then
  15.             strNewFile = Replace(objFile.Path, srcDir, dstDir, 1, 1, 1)
  16.             arr = Split(strNewFile, "\")
  17.             If UBound(arr) > 1 Then Call CreateSubFolder(arr)
  18.             Call SaveFile(objFile.Path, strNewFile)
  19.         End If
  20.     Next
  21.       
  22.     For Each objFolder In fso.GetFolder(strPath).SubFolders
  23.         Call EnumFiles(objFolder.Path)
  24.     Next
  25. End Function
  26. Function CreateSubFolder(ByVal arr)
  27.     Dim i, strSubFolder
  28.     strSubFolder = arr(0)
  29.     For i = 1 To UBound(arr) - 1
  30.         strSubFolder = strSubFolder & "\" & arr(i)
  31.         If Not fso.FolderExists(strSubFolder) Then fso.CreateFolder(strSubFolder)
  32.     Next
  33. End Function
  34. Function SaveFile(strFile, ByVal strNewFile)
  35.     Dim objPres
  36.     Set objPres = objApp.Presentations.Open(strFile, false, false, false)
  37.     objPres.SaveAs(strNewFile)
  38.     objPres.Close
  39.     Set objPres = Nothing
  40. End Function
复制代码

作者: pcl_test    时间: 2016-7-23 15:15

回复 24# WHY

已改




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2