我正试图通过批处理文件备份我在Windows2012上的MySQL数据库。
这就是我所拥有的:

    %mysql% -u %USER% -p%PASSWORD% -B -s -e"show databases" > %backupdir%\mysqldblist.tmp

    FOR /F %%D IN (%backupdir%\mysqldblist.tmp) DO (
        set DONTBACKUP=NOTHING
        ECHO Creating backup for database ''%%D''
        if [%%D]==[information_schema] set DONTBACKUP=TRUE
        if [%%D]==[mysql] set DONTBACKUP=TRUE
        if [%%D]==[performance_schema] set DONTBACKUP=TRUE
        if [%%D]==[test] set DONTBACKUP=TRUE
        PAUSE
        IF [%DONTBACKUP%]==[TRUE] %mysqldump% -u %USER% -p%PASSWORD% --result-file="%backupdir%%%D_%mydate%.sql" "%%D"
        PAUSE
    )

我试图排除mysql、performance_schema和test等数据库,但它在第一次迭代后退出。我想我只需要设置一个变量并检查它是否是一个特定的数据库,但它只是没有发生,首先检查它退出。
有人能指出我在这里做错了什么吗?
附加信息
这是我在命令提示符窗口中看到的,如果它有帮助的话:
ECHO Creating backup for database '%D'
if [%D] == [information_schema] set DONTBACKUP=TRUE
if [%D] == [mysql] set DONTBACKUP=TRUE
if [%D] == [performance_schema] set DONTBACKUP=TRUE
if [%D] == [test] set DONTBACKUP=TRUE
PAUSE
IF [] == [TRUE] "C:\Program Files\MySQL\MySQL Server 5.5\bin\mysqldump"...

我发现有些东西不对,我正在试着调试它,但是我没有马上看到。我不知道为什么会有%d或者为什么没有填充dontbackup…
附加信息2
这就是我认为我失败的地方:
 if [information_schema] == [information_schema] set DONTBACKUP=TRUE

它没有被设置为true,所以它尝试执行备份。我不知道我忽略了什么,但为什么这个比较会失败?

最佳答案

在文件开头添加以下行:

setlocal enabledelayedexpansion

在for循环中,当查看DONTBACKUP的值时,使用!DONTBACKUP!
此外,按照逻辑,应该将DONTBACKUP的检查颠倒过来。
下面是修改后的文件:
setlocal enabledelayedexpansion
%mysql% -u %USER% -p%PASSWORD% -B -s -e"show databases" > %backupdir%\mysqldblist.tmp

FOR /F %%D IN (%backupdir%\mysqldblist.tmp) DO (
    set DONTBACKUP=NOTHING
    ECHO Creating backup for database ''%%D''
    if [%%D]==[information_schema] set DONTBACKUP=TRUE
    if [%%D]==[mysql] set DONTBACKUP=TRUE
    if [%%D]==[performance_schema] set DONTBACKUP=TRUE
    if [%%D]==[test] set DONTBACKUP=TRUE
    PAUSE
    IF not [!DONTBACKUP!]==[TRUE] %mysqldump% -u %USER% -p%PASSWORD% --result-file="%backupdir%%%D_%mydate%.sql" "%%D"
    PAUSE
)

10-08 04:57