如何在PuTTY关联的bat脚本中传递数据库列表并循环执行MySQL命令?
问题分析与解决方案
一、参数传递失败的原因与解决方法
你当前使用Putty.exe -load xyz -m %file% %DB% -t的写法,PuTTY不会将%DB%作为参数传递给-m指定的bat文件。因为-m参数的作用是让PuTTY执行指定脚本的内容,而非将后续参数转发给该脚本。
要将数据库列表传递到第二个bat,可采用以下两种可行方式:
方式1:将数据库列表写入临时文件,让第二个bat读取该文件
修改第一个bat:SET file=%1 SET DB=%2 REM 将数据库列表写入临时文件 echo %DB% > "temp_db_list.txt" Putty.exe -load xyz -m %file% -t第二个bat读取临时文件内容并处理:
FOR /F "delims=" %%q IN (temp_db_list.txt) DO ( FOR %%d IN (%%q) DO mysql -h xyzdb -e "drop database %%d;" ) REM 执行完毕后删除临时文件 del "temp_db_list.txt"方式2:直接将数据库列表嵌入临时执行脚本(适用于列表较短的场景)
修改第一个bat,生成包含数据库列表的临时脚本替代原第二个bat:SET file=%1 SET DB=%2 REM 生成临时执行脚本 echo FOR %%q IN (%DB%) DO mysql -h xyzdb -e "drop database %%q;" > "temp_exec.bat" Putty.exe -load xyz -m "temp_exec.bat" -t REM 执行完毕后清理临时脚本 del "temp_exec.bat"
二、第二个bat中for循环的语法错误
原命令FOR %%q IN (%DB%) DO mysql -h xyzdb -e 'drop database %%q;'存在两个问题:
- Windows批处理中,字符串需用双引号包裹,而非单引号,mysql的
-e参数要求用双引号封装SQL语句 - 由于之前的参数传递问题,
%DB%变量根本未被第二个bat正确接收,这也是引发语法错误的间接原因
修正后的for循环写法(假设已正确获取%DB%变量):
FOR %%q IN (%DB%) DO ( mysql -h xyzdb -e "drop database `%%q`;" )
给%%q添加反引号,是为了兼容数据库名包含特殊字符的场景,避免SQL语法错误。
内容的提问来源于stack exchange,提问作者Samuel Preetham
相关产品推荐
相关产品推荐

