PowerShell脚本向MySQL插入数据时意外插入两行如何排查解决
问题原因分析
- 脚本重复触发(核心原因)
你配置了多个触发脚本执行的规则(比如同时放在Windows启动文件夹+登录计划任务、计划任务配置了多上下文执行、开启了执行失败立即重试),导致同一时间脚本被启动了两次:
- 第一次运行时,
app_log.txt还在被上游程序写入,P3#X和P2#X对应的行还没写入完成,提取到的end1、end2为空/默认值0,插入第一条异常记录 - 第二次运行间隔极短(在1秒以内),此时日志已经写入完成,提取到正常的
end1、end2,插入第二条正常记录,因为MySQL的时间字段只精确到秒,所以两条记录的时间显示完全一致
- 代码逻辑错误(加剧异常表现)
你的字符串拆分逻辑存在问题:
你使用.NET的String.Split()方法时,传入的分隔符是"\;",该方法不会识别正则转义符,会把\;当成完整的匹配字符串,而你的日志里只有普通分号;,所以拆分失败,仅返回完整的原字符串,匹配99905时找不到对应项,返回空值,插入时就变成了0和空字符串。
修复方案
- 排查脚本触发规则:检查计划任务配置、启动文件夹、组策略登录脚本设置,只保留一个触发入口
- 给脚本增加单实例运行限制,避免同时多次启动,可在脚本最开头加入如下逻辑:
$mutex = New-Object System.Threading.Mutex($false, "UniqueScannerScriptMutex") if (-not $mutex.WaitOne(0, $false)) { exit # 已有实例在运行直接退出 }
- 修复拆分逻辑:把分隔符定义改成
$separator = ";"即可,或者改用PowerShell的-split运算符处理正则分隔 - 增加数据校验:确认
$end1、$end2都不为空之后再执行INSERT操作,避免插入脏数据 - 删除冗余代码:去掉定义完函数后没用的裸调用
liczba、sn两行,避免不必要的函数执行 - 捕获执行返回值:把插入逻辑改成
$null = $oMYSQLCommand.ExecuteNonQuery(),避免无关输出 - 脚本执行完成后释放互斥锁:末尾加
$mutex.ReleaseMutex()
内容的提问来源于stack exchange,提问作者fosfik
相关产品推荐
相关产品推荐

