在批处理文件中“启动/ b”之后,用&&链接命令

时间:2019-02-23 11:30:40

标签: batch-file

我正在尝试产生多个进程,以使用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

3 个答案:

答案 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
)