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

Batch file 批处理文件在FOR循环中丢失变量,batch-file,for-loop,Batch File,For Loop,我已经为这件事挣扎了一段时间了。试过有无使能延迟扩展,但没有乐趣。简单地说,变量%MYFILENAME%在循环中设置后立即为空: ::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 MY

我已经为这件事挣扎了一段时间了。试过有无使能延迟扩展,但没有乐趣。简单地说,变量%MYFILENAME%在循环中设置后立即为空:

::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%I即时:

echo DB db1 processing
 set MYFILENAME=db1_11-11-2016_0-54.bak
 set SERVERNAME=.
 echo <<<----------HERE MISSING MYFILENAME ----------<<<
 echo sqlcmd -B -E -S . -d master -Q "BACKUP DATABASE [zdvrhnika] TO DISK = N''
WITH INIT , NOUNLOAD , NAME = N'zdvrhnika backup', NOSKIP , STATS = 10, NOFORMAT
"
echo DB db1处理
设置MYFILENAME=db1_11-11-2016_0-54.bak
设置服务器名=。

echo在块语句
(一系列括号内的语句)
,解析整个块,然后执行。在解析块时,块内的任何
%var%
都将替换为该变量的值——在执行块之前——这同样适用于。。。DO(块)

因此,在遇到
IF
时,将使用
%variables%
的值执行
IF(somethingelse)


克服此问题的两种常见方法是:1)使用
setlocal enabledelayedexpansion
**和使用
!瓦尔
代替
%var%
来访问
var
**的更改值,或2)调用子例程来使用更改的值执行进一步的处理。

在块语句
(括号内的一系列语句)
中,解析整个块,然后执行。在解析块时,块内的任何
%var%
都将替换为该变量的值——在执行块之前——这同样适用于。。。DO(块)

因此,在遇到
IF
时,将使用
%variables%
的值执行
IF(somethingelse)


克服此问题的两种常见方法是:1)使用
setlocal enabledelayedexpansion
**和使用
!瓦尔
代替
%var%
访问
var的更改值
**或2)调用子例程以使用更改的值执行进一步处理。

第三种方法是使用伪调用并将百分比符号加倍
调用echo%%var%%
调用集var=%%OtherVar%%
Magoo,太棒了!像一个符咒一样工作(将%variable%替换为!variable!inside block语句)!非常感谢你!第三种方法是使用伪调用并将百分比符号加倍
call echo%%var%%
call set var=%%OtherVar%%
Magoo,太棒了!像一个符咒一样工作(将%variable%替换为!variable!inside block语句)!非常感谢你!也相关的可能重复:。也相关的可能重复:。