Цепочка команд с && после "start / b" в командном файле - PullRequest
0 голосов
/ 23 февраля 2019

Я пытаюсь создать несколько процессов для рекурсивного преобразования .doc файлов в папке в .docx, используя Microsoft 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 удаляется до того, как wordconv начинает работать с ним.

Как мне сгруппировать %WCONV% -oice -nme "%%X" "%%Xx" && del "%%X", чтобыона работает как одна команда для start /b, чтобы порождать?

EDIT, чтобы уточнить: Если я запускаю скрипт последовательно, без start /b, все работает нормально, как в документах конвертируютсяи удаляется только в случае успешного преобразования.Вот что я имею в виду:

@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"

        %WCONV% -oice -nme "%%X" "%%Xx" && del "%%X"

    )
    popd
)

Ответы [ 2 ]

0 голосов
/ 23 февраля 2019

Пожалуйста, попробуйте, я добавил дополнительный оператор 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.

0 голосов
/ 23 февраля 2019

В вашем коде && действительно не является частью порожденного подпроцесса.Чтобы заставить анализатор включать их, избегайте их:

start /b "" "%WCONV%" -oice -nme "%%X" "%%Xx" ^&^& del "%%X"

(примечание: лично я бы использовал /min вместо /b, но ymmv)

На основе комментариев, у вас должно работать следующее:

start /b "" cmd /c ""%WCONV%" -oice -nme "%%X" "%%Xx" && del "%%X""
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...