将批处理文件移动到批处理文件运行时添加的目录中

时间:2019-03-28 19:22:12

标签: windows batch-file

说我有一个像这样的文件系统:

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来识别在process.bat运行时添加了目录4,因此它将继续复制到目录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 个答案:

答案 0 :(得分:1)

@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 1Directory 2Directory 3 1日call :myCopier。返回的%errorlevel%为0,因此 再做一次call :myCopier。这次Directory 4是 处理。返回的%errorlevel%为0,因此它执行了另一个 call :myCopier。所有目录将具有process.bat 内,因此返回的%errorlevel%为1。这允许 :main循环的结尾。

使用其他脚本。也许您应该插入一个 setlocal来保持本地环境不变。 还要在路径周围插入双引号,以便空格 或特殊字符不会引起问题。