Перемещение пакетного файла в каталоги, добавленные во время работы пакетного файла - PullRequest
1 голос
/ 28 марта 2019

Скажем, у меня есть такая файловая система:

Directory 1
  --dataset
Directory 2
  --dataset
Directory 3
  --dataset
process.bat
copier.bat <-- RUNS

copier.bat копирует process.bat в каталог и запускает его:

Directory 1
  --dataset
  --process.bat <-- RUNS
Directory 2
  --dataset
Directory 3
  --dataset
process.bat
copier.bat

Process.bat занимает несколькоминут, и когда это будет сделано, copier.bat копирует process.bat в следующий каталог и запускает его:

Directory 1
  --dataset
  --process.bat
Directory 2
  --dataset
  --process.bat <-- RUNS
Directory 3
  --dataset
process.bat
copier.bat

Когда process.bat работает в следующем каталоге, добавляется новый каталог с другим набором данных:

Directory 1
  --dataset
  --process.bat
Directory 2
  --dataset
  --process.bat <-- RUNNING
Directory 3
  --dataset
Directory 4
  --dataset
process.bat
copier.bat

Мне нужно, чтобы copier.bat распознал, что каталог 4 добавлен во время работы process.bat, поэтому он продолжает копировать в каталог 4 и запускать process.bat.

Вот чтоНа данный момент файл copier.bat выглядит так, как он есть, он будет копироваться только в каталоги, присутствующие при первом запуске copier.bat:

for /D %%i in (*) do (
cd %%i
copy ..\process.bat process.bat
call process.bat
cd ..
)

Источник кода: https://peterfalkingham.com/2018/04/01/colmap-openmvs-scripts-updated

1 Ответ

1 голос
/ 29 марта 2019
@echo off
setlocal

:main
call :myCopier
if not errorlevel 1 goto :main

exit /b 0


:myCopier
setlocal
set "batfile=process.bat"
set "exitcode=1"

for /D %%A in (*) do (
    if not exist "%%~A\%batfile%" pushd "%%~A" && (
        set "exitcode=0"
        copy "..\%batfile%" "%batfile%" && call "%batfile%"
        popd
    )
)

exit /b %exitcode%

Вы копируете copier.bat в свой код, хотя Копирование process.bat в вашей структуре каталогов. Я считаю, что позднее логически правильно.

Этот код будет называть метку :myCopier в :main цикл до %errorlevel% не равен 0.

Это будет делать Directory 1, Directory 2 и Directory 3 1-го call :myCopier. %errorlevel% возвращается 0, так что делает еще call :myCopier. На этот раз Directory 4 обработанный. %errorlevel% вернул 0, значит, другой call :myCopier. Все каталоги будут иметь process.bat внутри, так что %errorlevel% возвращается 1. Это позволяет конец :main петли.

С вашим другим сценарием. Возможно, вам следует вставить setlocal чтобы сохранить окружающую среду для себя. Также вставьте двойные кавычки вокруг путей, чтобы пробелы или специальные символы не вызывают проблем.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...