Estou criando um arquivo em lote para automatizar a remuxagem do FFmpeg e outras etapas tediosas. Também quero distribuir esse arquivo em lote para outras pessoas porque parece que seria útil para outras pessoas com ideias semelhantes.
No meu código, eu faço com que um aplicativo seja aberto em uma parte inicial dele para que o usuário do código possa abrir seu editor preferido e testar se o arquivo funciona conforme o esperado. Depois, continue com o código. No entanto, quando ele abre o aplicativo, o arquivo em lote para e fecha completamente.
TL;DR: Como faço para manter a janela de lote aberta depois de executar o comando start?
Postarei os 2 primeiros blocos de código abaixo para que você possa entender o que quero dizer:
@Echo off
set /p IPath=Enter the Path of the file you wish to remux from (use "Copy as path" option and keep the Quotations):
set /p M=what is the first letter of the path of your new file?(do not include the semicolon(:))
set /p NewPath=Enter the Path you wish to remux to (must be path minus the directory BUT do not use Quotations for this)(I also recommend using a single folder to hold the files while remuxing them before sending them to their separate folders):
set /P f=have you accidentally closed the process?[y/N] Please note this will skip the remuxing process and take you through the rest of the code:
if /I "%f%" == "N" goto :FFmpeg
if /I "%f%" == "Y" goto :Premiere
:FFmpeg
ffmpeg -i %IPath% -c copy -map 0 "%M%:\%NewPath%"
goto :Premiere &:: This command takes inputs from the previous lines and sets up to remux files
:Premiere &:: this command line starts the preferred editor and waits 30 seconds to allow it to start
set /p EDITOR=Enter the .exe file for your prefered editor should look like: 'Adobe Premiere Pro.exe':
echo Starting Process. . . Please Wait
start "" "%EDITOR%"
echo Starting Process. . . Please Wait
tasklist | find /I "%EDITOR%" &:: The next couple of lines test for the editor to see if it opened or not
if errorlevel 1 (
echo could not start process
goto :FailEditor
) Else (
echo Process completed, next question--->
goto :choice
)
Atualização : Descobri que usar o cmd /k
comando anterior manterá a janela aberta, mas não continuará o código, apenas abrirá o aplicativo e irá para o diretório que especifiquei
Atualização 2 Eu tentei o /wait
comando per Raven
(Obrigado, a propósito, isso será útil no futuro), mas tudo o que ele fez no meu código foi esperar o aplicativo fechar e então fechou o arquivo em lote. Gostaria de esclarecer que estou tentando continuar o código de onde ele parou depois de abrir o aplicativo. Caso contrário, o resto do código não tem sentido.
Atualização 3 Depois de mais testes, parece que o código para abruptamente agora antes de abrir meu Editor (embora esta fosse uma versão mais antiga), aqui está o código para ele
@Echo off
Setlocal
set /p newname=Enter new file name:
set /p k= keeps breaking?[Y/N]
if /I "%k%" == "Y" goto :Premeiere
if /I "%k%" == "N" goto :start
:start
ffmpeg -i "V:\Before Remux\01.mkv" -c copy -map 0 "M:\1 REMUX HUB\%newname%.mp4" /wait
goto :Premeiere
:: this command line starts premiere pro and waits 1 minute to allow it to start
:Premiere
start "Editor" "Adobe Premiere Pro.exe"
pause
goto :choice
:choice &:: This asks user to check using premiere pro or other editing sofware for corruption/file failure
set /P c=Does the final file work as intended[Y/N]?
if /I "%c%" == "N" goto :Redo &:: this will send them to Redo the remux
if /I "%c%" == "Y" goto :Foldercreation &:: if no failure/corruption is found and user confirms this will send them to :Delete
:Redo &:: This command line re-remuxes the original video then asks the question again
ffmpeg -i "V:\Before Remux\01.mkv" -c copy -map 0 "M:\1 REMUX HUB\%newname%%%.mp4"
goto :choice2
:Foldercreation &:: This section asks the user which folder it should be stored in
set /P Folder=Which folder should this go in?
echo Checking if exists directory "M:\%Folder%" ...
cd "M:\%Folder%"
if !ERRORLEVEL! GTR 0 (
echo Directory doesn't exist, creating...
md "M:\%Folder%"
goto :Foldercreation
) else (
echo Directory already exists.
)
goto :Move
:Move
move "M:\1 REMUX HUB\%newname%.mp4" "M:\%Folder%\"
set /P c3=Did the file go to the correct folder?[Y/N]
if /I "%c3%" == "Y" goto :Delete
if /I "%c3%" == "N" goto :Foldercreation
:Delete &:: This area deletes the original file to allow obs to write the next one without issue
Del "V:\Before Remux\01.mkv"
echo This video is now remuxed please edit it
echo OBS is primed for next stream!!
pause
endlocal
exit
:choice2 &:: This asks the user again just in case
set /P c2=Does this one work? If not check for corruption in original file!!![Y/N]
if /I "%c2%" == "N" goto :corrupted
if /I "%c2%" == "Y" goto :Foldercreation
:corrupted &:: if FFmpeg fails both times user is asked to check for corruption and does not delete the original file
@Echo check for corruption
pause
endlocal
exit
Atualização 4: Desde então, descobri o motivo pelo qual ele estava parando. Foi porque eu rotulei incorretamente com uma única letra que quebrou o código e parou o programa imediatamente. Também aprendi a depurar usando comandos de pausa. Obrigado por me ajudar
Por padrão,
START
o aplicativo será executado em segundo plano e o script em lote continuará imediatamente.Para evitar executar o comando em segundo plano, use:
As
/WAIT
forçasSTART
precisam esperar a execuçãoMy_Command.exe
terminar antes de continuar o script em lote.A outra alternativa seria colocar algo depois do
START
comando que o faça esperar, como um BatchPAUSE
ou verificar em um loop se o processo que você iniciou ainda está em execução.Basta adicionar essas linhas iniciais exemplificadas abaixo e a última linha no seu código
Basicamente, essas linhas verificam se você forneceu um argumento ao executá-lo. Se não tiver, ele reinicia sozinho com um
stay
argumento " " e então espera para sempre usando otimeout.exe
comando. No seu caso, essa mecânica garante que a janela permaneça aberta enquanto espera você pressionar Enter (ou fechar a janela), o que é necessário para manter o script "rodando".