Windows 批处理文件:合并当前文件夹中的所有 .docx 文件?

Windows 批处理文件:合并当前文件夹中的所有 .docx 文件?

我想将文件夹中的所有 .docx 文件与 .bat 文件合并(不使用 Powershell,因为我需要确保目标计算机都设置为允许 powershell 脚本)。如果输出文件以父文件夹名称命名,那就太好了。

这里有一个用于合并 docx 文件的命令行实用程序:

https://github.com/jamessantiago/DocxMerge

它需要以下语法:docxmerge.exe -i $input_files -o $output_file_name

简单版本(应该可以工作一次/如果 docxmerge 修复了排序错误 = 不太可能)

@echo off & setlocal enabledelayedexpansion
cd %1
set files=

for %%i in (*.docx) do set files=!files! "%%i"

set name=
for %%i in (.) do set name=%%~nxi

DocxMerge.exe -i %files% -o "%name%.docx" -f

=> 成功率为 90%,但是:output.docx 包含的文档顺序错误:

如果回显 %files%,则会按正确的字母顺序显示文件名。但出于某种原因,docxmerge 运行后会显示以下顺序:

10 页文档示例

Page 1  

Page 10  

Page 9  

...  

Page 2

========

我需要根据当前字母列表重新排序,如下所示:

  • 文件 1
  • 其余文件按相反顺序排列(即 10、9、...、2)

============================================================

解决方法版本:

@echo off & setlocal enabledelayedexpansion

set name=
for %%i in (.) do set name=%%~nxi

del /f %name%.docx

set files=
set firstFile=

for %%i in (*.docx) do (
    if [!firstFile!]==[] (
        set firstFile="%%i"
    ) else (
        set files="%%i" !files!
    )
)

set files=%firstFile% %files%

DocxMerge.exe -i %files% -o "%name%.docx" -f

答案1

您无需将文件名打印到文本文件中再读取。您只需使用循环将名称收集到变量中即可for

该脚本应该可以工作:

@echo off & setlocal enabledelayedexpansion
cd %1
set files=

for %%i in (*.docx) do set files=!files! "%%i"

DocxMerge.exe -i %files% -o "%~n1.docx"

它将包含 .docx 文件的文件夹作为其第一个也是唯一的参数,这意味着您只需将文件夹拖放到批处理文件中即可。

参数中给出的文件夹名称将用作输出文件的名称。这是通过将参数扩展为仅带有 的文件名来实现的%~n1

如果要将批处理文件放在包含 .docx 文件的文件夹中,而不使用参数,则可以使用以下命令获取当前文件夹的名称

set name=
for %%i in (.) do set name=%%~nxi

如果文件处理顺序错误,您可以通过替换set files=!files! "%%i"来逆转顺序set files="%%i" !files!

编辑:

错误的顺序听起来肯定像是 DocxMerge 中的一个错误。您可以通过将第一个文件存储在单独的变量中,然后在循环后将该值添加到其余文件的前面来解决此问题for

@echo off & setlocal enabledelayedexpansion
set files=
set firstFile=

for %%i in (*.docx) do (
    if [!firstFile!]==[] (
        set firstFile="%%i"
    ) else (
        set files="%%i" !files!
    )
)
set files=%firstFile% %files%

set name=
for %%i in (.) do set name=%%~nxi

DocxMerge.exe -i %files% -o "%name%.docx" -f

要删除先前合并的结果,使其不包含在新合并中,只需移动

set name=
for %%i in (.) do set name=%%~nxi

在循环上方for添加if exist "%name%.docx" del "%name%.docx"

答案2

我有一个文件夹,里面有许多包含 Word 文档的子文件夹。我想合并每个文件夹中的 Word 文档,然后将每个文件夹中创建的合并文档合并为一个大文档。

下面的代码是合并文件夹中的文档,当我执行循环并将其添加到上面的 for 循环以进入每个子文件夹并创建单独的合并文档时,它会说“-i 是必需的”。为什么我会收到此消息?

下面的代码:

@echo off & setlocal enabledelayedexpansion

set /A C=0    
FOR /R %%a in (.) do (    
  pushd %%a    
  echo In directory:    
  cd    
  SET firstFile=    
  SET files=

  FOR %%X in (*.docx) DO (    
  IF [!firstFile!]==[] (    
          SET firstFile="%%X"    
    ECHO yes        
      ) ELSE (    
          SET files="%%X" !files!       
    ECHO next    
      )    
   )

   ECHO ifclose    
     SET files=%firstFile% %files%    
 set /A C=C+1

 DocxMerge.exe -i %files%  -o "doc%C%.docx" -f

 pause    
 rem leave the directory    
 popd    
 pause    
)

答案3

顺序错误是一个非常常见的问题。与其每次都修改脚本和命令,不如重命名源文件:我使用高级重命名器和这种简单的内置方法高级重命名方法。这样,任何程序和脚本都会识别页面和文件的正确顺序,因为 002 总是在 010 之前。

相关内容