批量转义FOR循环

时间:2016-02-10 00:05:52

标签: batch-file for-loop

我有一个批处理脚本,可以利用命令为应用程序创建一些备份。我有一个循环设置来运行并获取文件夹名称,然后使用这些文件夹名称作为文件名运行备份操作。我的循环运行良好,但我的批处理脚本在完成后才关闭。我想逃离循环,所以我可以回到我指定的选择位置。我似乎无法正确地逃避这个循环。我的代码如下:

set /p work=Folder Location:
set /p staging=Location of staging-backup file:
set /p backup=Location to save backup:
@Echo off
md %backup%
setlocal enabledelayedexpansion
set /a $count=1
cd /d %staging%
for /f "delims=" %%a in ('dir "%work%" /b/o') do (
staging-backup "%%a" "%backup%\%%a"
set /a $Count+=1
)

同样,这一切都运行得很好(虽然我不能让它正确记录,但这是后来的另一场战斗),除了我最后喜欢GOTO CHOICE。当我在循环结束后添加它时,它仍然会关闭。当我将它带入循环内部时,它会关闭。我是否需要将此循环包装在if中以正确地转义它?

我尝试将代码拉出来并将其推向自己的蝙蝠,然后用我原来的蝙蝠调用该蝙蝠,但没有任何改变。

:THREE
echo.
echo.
.\Loops.bat
echo.
echo.
GOTO CHOICE

此部分调用它,运行新的bat但在完成后仍然关闭cmd窗口。有什么想法吗?

1 个答案:

答案 0 :(得分:1)

@Echo off
setlocal enabledelayedexpansion
:AGAIN
for %%a in (work staging backup) do set "%%a="
set /p "work=Folder Location: "
if not defined work goto :eof
set /p "staging=Location of staging-backup file: "
set /p "backup=Location to save backup: "
md %backup%
set /a $count=1
PUSHD %staging%
for /f "delims=" %%a in ('dir "%work%" /b/A-D') do (
 staging-backup "%%a" "%backup%\%%a"
 set /a $Count+=1
)
POPD
GOTO AGAIN

这是一个修订版。

前两行移动到顶部以关闭命令回显,防止每次运行的变量保持设置。

然后插入标签,并清除变量。

如果只回复 Enter work提示符,批处理终止,因为work将是未定义的(set / p在这些情况下保持变量不变 - 它确实不清楚变量)

PUSHD暂时切换到其他目录的目录。

在该目录中执行staging-backup。请注意,如果staging-backup是批处理,那么您应该使用CALL staging-backup...(实际上,您可以使用任何可执行文件执行此操作 - 如果是批处理,您必须执行此操作它使cmd知道在目标批次结束时返回的位置(在这种情况下,staging-backup.bat

for循环结束时,POPD返回原始目录并循环回:AGAIN - 再次完成所有操作。

相关问题