PowerShell 7+环境Add-Type -AssemblyName参数通配符失效问题咨询
问题根因
这是PowerShell版本行为差异、官方文档未同步更新导致的,不属于操作错误:
- Windows系统内置的Windows PowerShell(5.1及更低版本)中,
Add-Type的-AssemblyName参数确实支持通配符,运行时会枚举全局程序集缓存(GAC)内的注册程序集做匹配。 - PowerShell 7+(即PowerShell Core)重构了跨平台程序集加载逻辑,不再依赖Windows专属的GAC存储,直接移除了
-AssemblyName参数的通配符匹配能力,仅支持传入完整或部分明确的程序集名称,因此传入带*的字符串时会直接抛出找不到程序集的错误。
执行报错场景参考:
可行解决方法
根据使用场景选择对应方案即可:
- 直接指定明确程序集名称加载
如果已知本地安装的SMO程序集版本、公钥标记等信息,直接传入完整强名称加载即可,示例:
如果本地已安装SqlServer PowerShell模块,可先导入模块让其自动解析程序集路径,再执行加载:Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=16.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"Import-Module SqlServer Add-Type -AssemblyName Microsoft.SqlServer.Smo - 自行实现通配符匹配逻辑
如果确实需要模糊匹配程序集,可手动枚举SMO的常见安装路径,匹配到目标dll文件后通过-Path参数加载,示例代码:# 配置程序集搜索路径 $searchPaths = @( "${env:ProgramFiles}\Microsoft SQL Server", "${env:ProgramFiles(x86)}\Microsoft SQL Server", (Get-Module SqlServer -ListAvailable | Sort-Object Version -Descending | Select-Object -First 1).ModuleBase ) # 递归搜索匹配的程序集 $targetAssembly = Get-ChildItem -Path $searchPaths -Filter "*SqlServer.Smo.dll" -Recurse -ErrorAction SilentlyContinue | Where-Object FullName -notmatch "language|resources|zh-[a-z]{2}|en-[a-z]{2}" | Sort-Object { $_.VersionInfo.FileVersion } -Descending | Select-Object -First 1 if ($targetAssembly) { Add-Type -Path $targetAssembly.FullName } else { throw "未找到匹配*SqlServer.Smo的程序集,请先安装SQL Server SMO组件或SqlServer模块" } - 跨版本兼容处理
如果编写的脚本需要同时兼容Windows PowerShell和PowerShell 7+,可增加PS版本判断:版本低于6时直接用通配符写法,版本高于等于6时走上述手动匹配逻辑即可。
内容的提问来源于stack exchange,提问作者AxD
相关产品推荐
相关产品推荐

