我想将文件夹中的所有 .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 之前。