如何在 Powershell 中调用 Scriptblock 作为函数参数

How to call a Scriptblock as a function parameter in Powershell

我想要一个函数来 运行 不同的 ScriptBlocks。所以,我需要使用我的 Scriptblock 作为函数的参数。没用。

例如。此函数 returns 将 ScriptBlock 作为字符串。

function Run_Scriptblock($SB) {
    return $SB
}

这些是我尝试的结果:

# 1st try
Run_Scriptblock {systeminfo}

>> systeminfo


# 2nd try
Run_Scriptblock systeminfo

>> systeminfo


# 3rd try
Run_Scriptblock [scriptblock]systeminfo

>> [scriptblock]systeminfo


# 4th try
$Command = [scriptblock]{systeminfo}
Run_Scriptblock $Command

>> [scriptblock]systeminfo


# 5th try
[scriptblock]$Command = {systeminfo}
Run_Scriptblock $Command

>> systeminfo

如果你想要一个函数运行一个脚本块,你需要实际调用调用那个脚本块,即

function Run_Scriptblock($SB) {
    $SB.Invoke()
}

function Run_Scriptblock($SB) {
    & $SB
}

否则该函数将return 字符串形式的脚本块定义。不需要 return 关键字,因为 PowerShell 默认运行 return all non-captured output

函数会这样调用:

Run_Scriptblock {systeminfo}

作为旁注,我建议您考虑按照 PowerShell 约定命名您的函数(<Verb>-<Noun>approved verb),例如

function Invoke-Scriptblock($SB) {
    ...
}