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

PowerShell脚本向MySQL插入数据时意外插入两行如何排查解决

问题原因分析
  1. 脚本重复触发(核心原因)
    你配置了多个触发脚本执行的规则(比如同时放在Windows启动文件夹+登录计划任务、计划任务配置了多上下文执行、开启了执行失败立即重试),导致同一时间脚本被启动了两次:
  • 第一次运行时,app_log.txt还在被上游程序写入,P3#X和P2#X对应的行还没写入完成,提取到的end1、end2为空/默认值0,插入第一条异常记录
  • 第二次运行间隔极短(在1秒以内),此时日志已经写入完成,提取到正常的end1、end2,插入第二条正常记录,因为MySQL的时间字段只精确到秒,所以两条记录的时间显示完全一致
  1. 代码逻辑错误(加剧异常表现)
    你的字符串拆分逻辑存在问题:
    你使用.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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 04:36:01