【问题标题】:Dynamically create PowerShell scriptblock from scriptblock从脚本块动态创建 PowerShell 脚本块
【发布时间】:2023-03-09 04:56:01
【问题描述】:

我想编写一个 powershell 函数,它通过基于作为输入参数传入的脚本块动态创建一个脚本块来返回一个脚本块。我似乎运气不太好。

编写一个调用脚本块两次的方法很容易。

$x = { write-host "Hello" }
function DoIt([scriptblock] $s) { $s.Invoke(); }
function DoItTwice([scriptblock] $s) { $s.Invoke(); $s.Invoke(); }

DoIt($x)
DoItTwice($x)

编写一个返回具有调用(输入)脚本块两次效果的脚本块的方法更难。以下不起作用

function TwiceAsScriptBlock([scriptblock] $s)
{
    function twice
    {
        $s.Invoke();
        $s.Invoke();
    }
    return { twice }
}

【问题讨论】:

    标签: function powershell


    【解决方案1】:

    这将为您解决问题:

    function TwiceAsScriptBlock([scriptblock] $s)
    {
    
        $ScriptBlock = [System.Management.Automation.ScriptBlock]::Create("$s ; $s")
        Return $ScriptBlock 
    }
    

    【讨论】:

    • 我尝试了这些方面的变体。如果我在返回的脚本块上调用 Invoke(),我会收到以下错误:TwiceAsScriptBlock : Cannot process argument transformation on parameter 's'.
    • 它对我有用,我会放一个截图。您运行的是哪个版本的 powersehll?
    • 检查更新后的答案,正如您所见,当我调用新的脚本块时,它会输出两次消息。
    • 好吧——我想我已经盯着这个太久了。我正在尝试TwiceAsNewScriptBlock($x).Invoke() - 这就是为什么我认为它不起作用。谢谢!
    • 不用担心。很高兴我能提供帮助。