我现在正在努力解决这个问题。尝试使用和不使用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。 这不是脚本错误,而是一些环境问题。
答案 0 :(得分:0)
在块语句(a parenthesised series of statements)
中,解析整个块并执行然后。块中的任何%var%
将在解析块时被该变量的值替换 - 在块执行之前 - 同样的事情适用于{{1 }}
因此,FOR ... DO (block)
将在遇到IF (something) else (somethingelse)
时使用%variables%
的值执行。
解决此问题的两种常见方法是:1)使用IF
**并使用setlocal enabledelayedexpansion
代替!var!
来访问已更改的%var%
**值或2)调用子程序以使用更改的值执行进一步处理。