使用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 } }
关键修复点
- 参数Splatting:将
Invoke-Sqlcmd $using:DatabaseDetails改为Invoke-Sqlcmd @using:DatabaseDetails,@符号会告诉PowerShell把哈希表中的键值对解析为对应的命令参数(比如-ServerInstance、-Database等),而不是把整个哈希表当作单个参数传递。 - 语法修正:给
Get-Content的调用补上缺失的右括号,避免语法解析错误。
额外优化建议
可以省略$ViewDetailsArray的赋值,直接将元素传入格式化字符串,让代码更简洁:
$Query = Get-Content -Raw ('{0}/Views/{1}.sql' -f $ViewDetails.Schema, $ViewDetails.View)
内容的提问来源于stack exchange,提问作者justsander
相关产品推荐
相关产品推荐

