PowerShell查询MDB异常:Access可用的查询在PowerShell无返回
针对你遇到的问题——Access里正常执行的模糊查询,在PowerShell的ADODB脚本里却无返回数据,这里给你几个实用的排查方向:
检查通配符的兼容性差异
这是最常见的坑:Access界面里的SQL默认用*作为通配符,但你使用的Microsoft.Jet.OLEDB.4.0驱动遵循ANSI SQL标准,需要用%作为模糊匹配的通配符。把查询语句里的*换成%试试,修改后的查询语句如下:$rs.open("SELECT Options.OptionName, Options.OptionData FROM Options WHERE OptionName LIKE 'Eng.SerialPortMgr.PrinterPort%'",$cn,$adOpenStatic,$adLockOptimistic)验证查询语句的实际输出
PowerShell的字符串解析偶尔会有意外,你可以把查询语句单独赋值并输出,确认实际发送给数据库的SQL是不是和你在Access里运行的完全一致:$query = "SELECT Options.OptionName, Options.OptionData FROM Options WHERE OptionName LIKE 'Eng.SerialPortMgr.PrinterPort*'" Write-Host "实际执行的SQL:$query"排查是否存在字符串被截断、转义等问题。
优化Recordset的读取逻辑
你代码里的$Ports = $rs.open(...)其实是把打开后的Recordset对象赋值给了$Ports,但后续操作的是$rs,理论上没问题,但可以优化读取逻辑避免空记录集报错:if (!$rs.EOF) { $rs.MoveFirst() do { $rs.Fields.Item("OptionName").value + " = " + $rs.Fields.Item("OptionData").value $rs.MoveNext() } until($rs.EOF -eq $True) } else { Write-Host "未匹配到任何记录" }这样能明确是确实没有匹配数据,还是读取逻辑出了问题。
测试简化版模糊查询
先把查询条件放宽,比如用LIKE 'Eng.SerialPortMgr%'这样宽泛的条件,看能不能返回结果,再逐步缩小范围,确认是不是通配符的位置或格式导致的匹配失败。排查32位/64位兼容性
如果你用的是64位PowerShell,而Microsoft.Jet.OLEDB.4.0是32位驱动,可能存在隐性兼容性问题(虽然精确查询能运行,但模糊查询可能受影响)。试试切换到32位PowerShell(路径通常是C:\Windows\SysWOW64\WindowsPowerShell\v1.0\powershell.exe)运行脚本,看是否能解决问题。
内容的提问来源于stack exchange,提问作者Drakonis

