[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 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文件分别保存在各自不同的章节目录里,只是根目录变了,其他不变?
1

评分人数

    • pcl_test: 指定回应某楼层的在相应楼层点回复,少引用PB -2

TOP

本帖最后由 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
复制代码

TOP

本帖最后由 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()
复制代码
正则表达式漏掉特殊字符“.” 补上

TOP

回复 17# hzliew


    把 33 行改成 File.Path

TOP

回复 19# WHY


    还是您火眼金睛啊。。。

TOP

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



    哇塞,兄弟真牛B,代码简洁,堪称完美!佩服佩服!

TOP

回复 17# hzliew

17楼已改

TOP

回复  hzliew

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



    经测试运行,您的代码正确无误。至此,问题圆满解决,谢谢!

TOP

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

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

评分人数

TOP

  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
复制代码

TOP

回复 24# WHY

已改
1

评分人数

TOP

返回列表