批处理文件在FOR循环中丢失变量

时间:2016-11-11 00:04:03

标签: batch-file for-loop

我现在正在努力解决这个问题。尝试使用和不使用EnableDelayedExpansion,但没有快乐。简单地说,变量%MYFILENAME%在循环设置后立即为空:

getOneUser

我得到的是%MYFILENAME%imediatelly:

::echo off
setlocal enabledelayedexpansion
echo -- BACKUP DATABASES --
set MYPATH=D:\SQL_BACKUP
set MYDBASES=db1 db2 db3 db4

For /f "tokens=2-4 delims=/ " %%a in ('date /t') do (set MYDATE=%%c%%a%%b)
For /f "tokens=1-2 delims=/:" %%a in ("%TIME%") do (set MYTIME=%%a-%%b)
set MYDATE=%MYDATE:.=-%

for %%q in (%MYDBASES%) do (
    echo DB %%q processing 
    set MYFILENAME=%MYPATH%\%%q_%MYDATE%_%MYTIME%.bak
    set SERVERNAME=.
    echo %MYFILENAME%
    echo sqlcmd -B -E -S %SERVERNAME% -d master -Q "BACKUP DATABASE [%%q] TO DISK = N'%MYFILENAME%' WITH INIT , NOUNLOAD , NAME = N'%%q backup', NOSKIP , STATS = 10, NOFORMAT"
    if %ERRORLEVEL% == 0 (
        echo OK
    ) else if %ERRORLEVEL% == 1 (
        echo failed!
    )
)

echo.
set MYDATE=
set MYTIME=
set BACKUPFILENAME=
set MYPATH=
set MYDBASES=
set MYFILENAME=

有什么想法吗?

修改 将MYFILENAME和SERVERNAME变量更改为一些简单的文本后,我发现它们根本没有变化! MYFILENAME总是空的,SERVERNAME总是“。”,不管我把它们设置为什么?!而且无论我是否使用SETLOCAL EnableDelayedExpansion。 这不是脚本错误,而是一些环境问题。

1 个答案:

答案 0 :(得分:0)

在块语句(a parenthesised series of statements)中,解析整个块并执行然后。块中的任何%var%将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于{{1 }}

因此,FOR ... DO (block)将在遇到IF (something) else (somethingelse)时使用%variables%的值执行。

解决此问题的两种常见方法是:1)使用IF **并使用setlocal enabledelayedexpansion代替!var!来访问已更改的%var% **值或2)调用子程序以使用更改的值执行进一步处理。