我正在尝试产生多个进程,以使用Microsoft的.doc
将文件夹中的.docx
文件递归转换为wordconv.exe
。我知道这将产生无数个,所以这不是这里的问题。
这是我所拥有的:
@echo off
set "WCONV=C:\Program Files\Microsoft Office\root\Office16\Wordconv.exe"
FOR /D /r %%F in ("*") DO (
pushd %CD%
cd %%F
FOR %%X in (*.doc) DO (
echo "%%F\%%X"
start /b "" %WCONV% -oice -nme "%%X" "%%Xx" && del "%%X"
)
popd
)
问题是del "%%X"
似乎是在start /b
成功完成后执行的,而不是在%WCONV% -oice -nme "%%X" "%%Xx"
完成后执行的,因此原始.doc
文件在{{1 }}开始努力。
如何对wordconv
进行分组,使其作为%WCONV% -oice -nme "%%X" "%%Xx" && del "%%X"
生成的一个命令?
编辑以澄清:
如果我依次运行脚本,而没有start /b
,则一切正常,因为仅在转换成功后才转换并删除docs中的文档。这就是我的意思:
start /b
答案 0 :(得分:2)
在您的代码中,&&
确实不是派生子进程的一部分。要强制解析器包括它们,请对其进行转义:
start /b "" "%WCONV%" -oice -nme "%%X" "%%Xx" ^&^& del "%%X"
(注意:我个人会使用/min
而不是/b
,但使用ymmv)
根据评论,以下内容应为您工作:
start /b "" cmd /c ""%WCONV%" -oice -nme "%%X" "%%Xx" && del "%%X""
答案 1 :(得分:0)
请尝试一下,我添加了一条附加的If
语句,以确保没有文件循环回到For
循环中。
@Echo Off
Set "WCONV=C:\Program Files\Microsoft Office\root\Office16\Wordconv.exe"
For /D /R %%F In (*) Do (
PushD "%%F"
For %%X In (*.doc) Do (
If /I "%%~xX"==".doc" (
Echo "%%F\%%X"
Start /B "" Cmd /C ""%WCONV%" -oice -nme "%%X" "%%Xx" && Del "%%X""
)
)
PopD
)
但是,使用Where
命令只能隔离.doc
文件。同样,您甚至可能不需要将For
循环嵌套在另一个循环中:
@Echo Off
Set "WCONV=C:\Program Files\Microsoft Office\root\Office16\Wordconv.exe"
For /F Delims^=^ EOL^= %%A In ('Where /R . *.doc 2^>Nul') Do (
Echo "%%A"
Start /B "" Cmd /C ""%WCONV%" -oice -nme "%%A" "%%~nxAx" && Del "%%A""
)
在下面的示例中,根据Wordconv
的工作方式,您可能需要将%%nxAx
替换为%%Ax
。
答案 2 :(得分:0)
Wordconv.exe有错误。我更喜欢使用libreoffice, 但是您可以将其替换为变量“ WCONV = anyprogram.exe”中的任何程序
首先,在命令行上设置路径:
set path=%path%;c:\your libreoffice location
或
我更喜欢直接在Windows系统上包含libreoffice路径,即Windows + pause>高级配置系统>路径变量> path>编辑>新建>包含libreoffice文件夹的路径
@echo off
set "WCONV=soffice"
FOR /D /r %%F in ("*") DO (
pushd %CD%
cd %%F
FOR %%X in (*.doc) DO (
if not exist "%%X" echo Not exist ".doc" on the folder "%%F"
%WCONV% --headless --convert-to docx "%%X" "%%Xx"
if exist "%%Xx" echo convert and delete "%%F\%%X" && del "%%X"
)
popd
)