PowerShell 5.1:能否用管道替代分号将哈希表传递给函数?
问题描述
环境:PowerShell 5.1
现有如下代码通过分号分隔「定义哈希表变量」和「调用UpdateSspAppUserPassword函数」的操作,运行正常。有人提出「可以将变量通过管道传递给函数」,现询问是否可通过管道替代分号的方式实现该调用?
原代码示例:
function Main { $dev=@{Name='DEV'; DbServer='DEV'}; UpdateSspAppUserPassword @dev $uat=@{Name='UAT'; DbServer='UAT'}; UpdateSspAppUserPassword @uat } function UpdateSspAppUserPassword ($DbServer) { "hello world: $($DbServer)" } Clear-Host Main
运行输出:
hello world: DEV hello world: UAT PS C:\WINDOWS\system32>
解决方案
可以通过管道实现,但需要调整函数定义或管道调用的方式——默认情况下PowerShell不会自动将管道传递的哈希表作为参数splatting输入。以下是两种可行方案:
方案1:修改函数支持管道输入哈希表
给函数添加管道输入参数声明,直接接收哈希表对象并处理:
function Main { # 直接将哈希表通过管道传递,无需定义变量和分号 @{Name='DEV'; DbServer='DEV'} | UpdateSspAppUserPassword @{Name='UAT'; DbServer='UAT'} | UpdateSspAppUserPassword } function UpdateSspAppUserPassword { # 声明接收管道输入的哈希表参数 [Parameter(ValueFromPipeline)] [hashtable]$InputObject # 管道处理块,遍历每个输入对象 process { "hello world: $($InputObject.DbServer)" } } Clear-Host Main
方案2:不修改原函数,用ForEach-Object中转
如果不想改动原函数,可以借助ForEach-Object(简写%)将管道传递的哈希表通过参数splatting传给函数:
function Main { @{Name='DEV'; DbServer='DEV'} | ForEach-Object { UpdateSspAppUserPassword @_ } @{Name='UAT'; DbServer='UAT'} | ForEach-Object { UpdateSspAppUserPassword @_ } } # 保留原函数不变 function UpdateSspAppUserPassword ($DbServer) { "hello world: $($DbServer)" } Clear-Host Main
两种方案的运行输出和原代码完全一致。
内容的提问来源于stack exchange,提问作者Rod
相关产品推荐
相关产品推荐

