You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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会话变量:

  1. 把原SQL脚本里的表名位置替换为占位符,比如select * from {{table_name}} INTO OUTFILE ...
  2. 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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:39:02