如何通过PowerShell向MySQL传递变量并解决Unknown command '\M'报错
问题根因
Unknown command '\M'报错的核心诱因是转义符冲突:
- MySQL解析字符串时默认将反斜杠
\作为转义字符,你命令里的路径I:\M...中的\M会被MySQL识别为非法转义序列 - PowerShell双引号包裹的内容在传递给外部命令时,会提前做一次转义处理,进一步打乱了传入MySQL的命令结构
另外你当前的变量传递逻辑还有一处隐藏问题:MySQL不允许在普通查询中用会话变量直接替代表名、字段名这类标识符,所以SQL脚本直接写select * from @test也会执行失败。
修复方案
1. 基础修复(保留原有会话变量传参逻辑)
修正PowerShell代码
所有传入MySQL的Windows路径统一替换为正斜杠/,避免转义冲突:
$var="expl_inst" $Mysql="<chemin>/Uploads" $date=Get-Date -Format "yyMMddHHmm" # 所有路径用正斜杠,规避转义问题 mysql --defaults-file=<chemin>/my.ini <databases> -e "set @test:='$var'; source I:/M.../export.sql"
修正export.sql脚本
用预处理语句动态拼接表名执行查询:
-- 动态拼接SQL语句,解决变量不能直接做表名的问题 SET @sql = CONCAT('select * from ', @test, ' INTO OUTFILE ''<chemin>/test.csv'' FIELDS ENCLOSED BY '''' TERMINATED BY '';'' ESCAPED BY '''' LINES TERMINATED BY ''\r\n'''); PREPARE stmt FROM @sql; EXECUTE stmt; DEALLOCATE PREPARE stmt;
2. 备选方案(无需修改SQL原有逻辑)
如果不想调整SQL脚本,可直接在PowerShell层完成变量替换后再执行,不需要定义MySQL会话变量:
- 把原SQL脚本里的表名位置替换为占位符,比如
select * from {{table_name}} INTO OUTFILE ... - PowerShell读取SQL文件替换变量后执行:
$var="expl_inst" $Mysql="<chemin>/Uploads" $date=Get-Date -Format "yyMMddHHmm" # 读取SQL文件替换变量 $sqlContent = Get-Content "I:\M...\export.sql" -Raw $runSql = $sqlContent.Replace('{{table_name}}', $var) # 直接执行替换后的SQL mysql --defaults-file=<chemin>/my.ini <databases> -e $runSql
内容的提问来源于stack exchange,提问作者NicoSU
相关产品推荐
相关产品推荐

