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

PowerShell 7+环境Add-Type -AssemblyName参数通配符失效问题咨询

问题根因

这是PowerShell版本行为差异、官方文档未同步更新导致的,不属于操作错误:

  • Windows系统内置的Windows PowerShell(5.1及更低版本)中,Add-Type的-AssemblyName参数确实支持通配符,运行时会枚举全局程序集缓存(GAC)内的注册程序集做匹配。
  • PowerShell 7+(即PowerShell Core)重构了跨平台程序集加载逻辑,不再依赖Windows专属的GAC存储,直接移除了-AssemblyName参数的通配符匹配能力,仅支持传入完整或部分明确的程序集名称,因此传入带*的字符串时会直接抛出找不到程序集的错误。

执行报错场景参考:
PowerShell Add-Type

可行解决方法

根据使用场景选择对应方案即可:

  • 直接指定明确程序集名称加载
    如果已知本地安装的SMO程序集版本、公钥标记等信息,直接传入完整强名称加载即可,示例:
    Add-Type -AssemblyName "Microsoft.SqlServer.Smo, Version=16.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91"
    
    如果本地已安装SqlServer PowerShell模块,可先导入模块让其自动解析程序集路径,再执行加载:
    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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 00:01:04