升级PowerShell 7与dbatools 2后出现“同名程序集已加载”错误
问题原因
你遇到的错误是因为SqlServer模块和dbatools模块都依赖Microsoft.Data.SqlClient程序集,但两者加载的版本或时机存在冲突。直接用pwsh testScript.ps1运行时,PowerShell会话可能加载了配置文件(Profile)或其他预加载内容,导致程序集提前被加载;而VS Code的运行按钮默认会启动干净会话,避开了这个冲突。另外错误信息里的dbatools路径指向WindowsPowerShell的模块目录,说明你的PowerShell 7可能在读取PS5.1的模块,这也加剧了版本冲突。
解决方案
1. 调整模块导入顺序
把dbatools的导入放在SqlServer前面,dbatools对程序集的管理更灵活,能更好地处理兼容问题:
Import-Module dbatools Import-Module sqlserver Write-Host "Done"
2. 只使用dbatools(推荐)
dbatools已经封装了绝大多数SqlServer模块的功能,且自带适配的Microsoft.Data.SqlClient版本,完全没必要重复导入SqlServer模块。修改脚本为:
Import-Module dbatools Write-Host "Done"
3. 确保dbatools安装在PowerShell 7专属模块路径
错误里的dbatools路径是C:\Program Files\WindowsPowerShell\Modules,属于PS5.1的模块目录。你需要在PowerShell 7中重新安装dbatools,确保它被放在PS7的模块路径下:
Install-Module dbatools -Scope CurrentUser -Force
安装完成后,用Get-Module dbatools -ListAvailable查看,确认路径为C:\Users\<你的用户名>\Documents\PowerShell\Modules或C:\Program Files\PowerShell\Modules。
4. 用干净会话运行脚本
如果你的PowerShell配置文件里加载了其他模块导致程序集预加载,可以用无配置文件的方式启动会话:
pwsh -NoProfile testScript.ps1
内容的提问来源于stack exchange,提问作者gjones

