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

使用ForEach-Object -Parallel处理哈希表时出现参数错误

解决ForEach-Object -Parallel下Invoke-Sqlcmd的参数错误问题

错误原因分析

你遇到的a positional parameter cannot be found that accepts argument 'system.collections.hashtable'错误,核心问题有两个:

  • 并行块中传递哈希表参数的方式错误:当$using:DatabaseDetails是存储数据库连接参数的哈希表时,直接将其作为位置参数传给Invoke-Sqlcmd,PowerShell会把整个哈希表当作单个位置参数,但Invoke-Sqlcmd没有接受该类型的位置参数。
  • Get-Content代码存在语法错误,缺失了闭合的右括号。

修复后的代码

$DefinedViews |
ForEach-Object -Parallel -Throttlelimit 2 {
    $ViewDetails = $_
    $ViewDetailsArray = $ViewDetails.Schema, $ViewDetails.View        
    try {
        # 修复Get-Content的括号缺失问题
        $Query = Get-Content -Raw ('{0}/Views/{1}.sql' -f $ViewDetailsArray)
        # 使用@进行参数splatting,传递哈希表类型的连接参数
        Invoke-Sqlcmd @using:DatabaseDetails -Query $Query 
    }
    catch {
        throw $_.Exception
    }
}

关键修复点

  1. 参数Splatting:将Invoke-Sqlcmd $using:DatabaseDetails改为Invoke-Sqlcmd @using:DatabaseDetails,@符号会告诉PowerShell把哈希表中的键值对解析为对应的命令参数(比如-ServerInstance、-Database等),而不是把整个哈希表当作单个参数传递。
  2. 语法修正:给Get-Content的调用补上缺失的右括号,避免语法解析错误。

额外优化建议

可以省略$ViewDetailsArray的赋值,直接将元素传入格式化字符串,让代码更简洁:

$Query = Get-Content -Raw ('{0}/Views/{1}.sql' -f $ViewDetails.Schema, $ViewDetails.View)

内容的提问来源于stack exchange,提问作者justsander

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 23:20:44