Loops 为什么循环的delayedexpansion中的变量不保持设置?(命令提示符/cmd.exe)

Loops 为什么循环的delayedexpansion中的变量不保持设置?(命令提示符/cmd.exe),loops,batch-file,for-loop,scripting,command-prompt,Loops,Batch File,For Loop,Scripting,Command Prompt,为什么下面delayedexpansion循环脚本中的变量不保持设置 setlocal enabledelayedexpansion set DB_LIST=(DB1 DB2) for %%i in %DB_LIST% do ( set DATABASENAME=%%i echo -- Backing Up Database %DATABASENAME% -- set DATESTAMP=%DATE:~-4%.%DATE:~3,2%.%DATE:~0,2% s

为什么下面delayedexpansion循环脚本中的变量不保持设置

setlocal enabledelayedexpansion
set DB_LIST=(DB1 DB2)
for %%i in %DB_LIST% do (

    set DATABASENAME=%%i
    echo -- Backing Up Database %DATABASENAME% -- 
    set DATESTAMP=%DATE:~-4%.%DATE:~3,2%.%DATE:~0,2%
    set BACKUPFILENAME=F:\Backups\ScheduledBackups\%DATABASENAME%-%DATESTAMP%.bak
    echo.
    sqlcmd -E -S LiveDB2 -d master -Q "BACKUP DATABASE [%DATABASENAME%] TO DISK = '%BACKUPFILENAME%' WITH DESCRIPTION = 'Full backup [%DATABASENAME%]', CHECKSUM, INIT, COMPRESSION, STATS"
)
endlocal
pause
我得到一个命令,该命令尝试使用
将数据库DB1备份到磁盘=''


谢谢

这是因为您试图使用百分号而不是感叹号展开变量。启用延迟扩展时,必须始终在循环的
中使用感叹号

试试这个:

setlocal enabledelayedexpansion
set DB_LIST=(DB1 DB2) 
for %%i in %DB_LIST% do (

set DATABASENAME=%%i
echo -- Backing Up Database !DATABASENAME! -- 
set DATESTAMP=%DATE:~-4%.%DATE:~3,2%.%DATE:~0,2%
set BACKUPFILENAME=F:\Backups\ScheduledBackups\!DATABASENAME!-!DATESTAMP!.bak
echo.
sqlcmd -E -S LiveDB2 -d master -Q "BACKUP DATABASE [!DATABASENAME!] TO     DISK = '!BACKUPFILENAME!' WITH DESCRIPTION = 'Full backup [!DATABASENAME!]', 

CHECKSUM, INIT, COMPRESSION, STATS")
endlocal
pause

仅供参考,英国日期反转(DDMMYYYY>yyyyymmdd),因此它可能不会在PCN上正确显示%DATESTAMP%,而不总是在启用时,仅当需要延迟扩展时。例如,
%CD%
仍然可以工作(除非他更改附加代码块中的目录,并且需要新值
!CD!
),当然)。非常感谢。工作起来很有魅力!