【问题标题】:calling program from bat file in a loop循环调用bat文件中的程序
【发布时间】:2015-04-10 14:52:58
【问题描述】:
我正在尝试在 bat 文件中循环调用 robocopy:
set basedir="C:\tmp"
set src[0]="%basedir%\src\A"
set src[1]="%basedir%\src\B"
set target[0]="%basedir%\target\A-out"
set target[1]="%basedir%\target\B-out"
set "x=0"
for %%i in (%src%) do (
robocopy /E %%src[%x%]%% %%target[%x%]%%
echo %%~i
REM cinst "%%~i"
set /a "x+=1"
)
但是 robocopy 的变量没有正确展开,我在这里遗漏了什么?
【问题讨论】:
标签:
windows
loops
batch-file
【解决方案1】:
我不相信你在这里使用的“%%src[%x%]%%”语法是有效的。
这样的事情可能会起作用:
SET BaseDir="C:\Tmp"
SET Folders=A B
SET SrcDir=\src\
SET TargetDir=\target\
FOR %%I in (%Folders%) DO (
ROBOCOPY /E %BaseDir%%SrcDir%%%I %BaseDir%%TargetDir%%%I-Out
ECHO %%~I
REM cist "%%~I"
)
如果您的实际文件夹结构与上面的示例不同,这可能无法达到预期效果。
【解决方案2】:
%%src[%x%]%% 变量语法用于当您出于某种原因不想启用延迟扩展但仍需要使用嵌套变量时。有两种方法可以正确展开它们。
您可以通过在脚本顶部包含setlocal enabledelayedexpansion 行,然后调用!src[%x%]! 和!target[%x%]! 等变量来使用延迟扩展
您也可以简单地将call 放在robocopy 命令前面,这也将正确扩展变量。 call robocopy /E %%src[%x%]%% %%target[%x%]%%
【解决方案3】:
我也尝试使用“for”循环 ROBOCOPY。我的批处理工作的唯一方法是使用“goto”。
这是一个例子:
@echo off & setlocal enableextensions
cls
set /a x=0
for /f "delims=" %%A in ('TIME/T') do set "var=%%A"
:start
cls
color 73
echo ===================================
DATE /T
echo 1st time: %var%
echo %x% times, last time:
TIME /T
set /a x+=1
echo ===================================
ROBOCOPY C:\Users\source\ C:\Users\destination\ /E /ZB /COPYALL /R:0 /W:0 /V /NP /ETA /TEE /LOG+:C:\Users\log.log
timeout /t 30
goto start
- 每 30 秒循环一次
- 增量日志
- 在终端上显示日志并保存到文件中
- 显示第一次和最后一次启动循环的时间