[英]Dynamically create functions from hashtable with parameters in 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
}
問題是,我在 function 后面輸入的任何內容都不被視為參數:
你能幫我嗎?
Append @args
到您的 CLI 調用,以便 PowerShell 將所有 arguments 傳遞給 ZC1C425268E687A41 本身:
foreach($funcName in $functions.PSBase.Keys){
$null = New-Item function:$funcName -Value "$($functions[$funcName]) @args"
}
筆記:
@arg
是自動$args
變量的噴濺形式。 鑒於您正在調用外部程序,在這種情況下$args
就足夠了(任何一種形式都會導致(字符串化)數組元素作為單獨的 arguments傳遞),但是如果您要調用PowerShell 命令,則需要按順序使用@args
正確通過命名arguments。
以上假設所有通過 arguments go在構成您的函數的每個 CLI 命令行的末尾。 如果您需要更細粒度的控制,請使用zett42 的有用答案中顯示的技術,它允許您控制@args
/ $args
所在的每個 CLI 調用,或者允許您使用param(...)
顯式聲明參數堵塞。
這是一個可能的解決方案:
$functions = @{
ws = { winget search $args }
# ... and so on
}
foreach($funcName in $functions.PSBase.Keys){
New-Item function:\ -Name $funcName -Value $functions.$funcName | Out-Null
}
{…}
,因此您無需為New-Item
arguments 轉換任何內容。$args
將腳本塊的 arguments 轉發到命令。 請注意,對於本機命令, $args
數組會自動展開。 對於 PowerShell 命令,您必須使用splatting ( @args
)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.