如何在PowerShell中从哈希表动态创建可接收参数的函数?
问题:从哈希表动态创建可接收参数的PowerShell函数
我需要在PowerShell中通过哈希表批量创建函数,且这些函数要能接收传入的参数。目前使用的代码如下:
$functions = @{ "wu" = "winget upgrade --include-unknown"; "wui" = "winget upgrade -i -e"; "wi" = "winget install -i"; "wii" = "winget install -i -e"; "ws" = "winget search" } foreach($funcName in $functions.PSBase.Keys){ New-Item function:\ -Name $funcName -Value $([scriptblock]::Create($functions[$funcName])) | Out-Null }
但存在问题:调用这些函数时,输入在函数名后的任何内容都不会被当作参数传递。
解决方法
感谢@zett42和@mklement0的帮助,最终实现代码如下:
# Functions (separated for autocomplete) $wg_functions = @{ wu = {winget upgrade @args} wui = {winget upgrade -i -e @args} wuiu = {winget upgrade --include-unknown @args} wi = {winget install -i @args} wii = {winget install -i -e @args} ws = {winget search @args} } $other_functions = @{ dev = {Set-Location "W:/Projects/Development" @args} gtc = {git clone @args} } $functions = $wg_functions + $other_functions foreach($funcKey in $functions.PSBase.Keys) { New-Item function:$funcKey -Value $functions.$funcKey | Out-Null }
关键改动说明
- 将哈希表中存储的字符串命令替换为脚本块(
{}),而非通过[scriptblock]::Create()从字符串转换 - 在每个脚本块的命令末尾添加
@args,用于将调用函数时传入的所有参数传递给内部命令 - 拆分哈希表便于维护,并通过
+合并多个哈希表统一处理
内容的提问来源于stack exchange,提问作者Dmitrij Drandarov
相关产品推荐
相关产品推荐

