簡體   English   中英

使用 PowerShell 中的參數從哈希表動態創建函數

[英]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。

  • 如上所示,您可以將 function 主體作為字符串傳遞給New-Item - 它會自動轉換為腳本塊

  • 以上假設所有通過 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM