PowerShell函数中决定值是否会被返回的规则是什么?
PowerShell 函数输出判断规则
核心基础规则
PowerShell 中所有未被捕获的语句/表达式结果,默认都会加入函数的返回流。未被捕获指的是:没有赋值给变量、没有通过管道传递给其他命令、没有用Out-Null手动丢弃。
哪些结果会被自动丢弃
只有两类结果会直接排除在返回流之外:
- 求值结果为
$null的所有表达式,这就是你第一个示例中$null没有出现在返回值里的原因 - 返回值类型为
void的.NET 方法调用,比如你示例中的[System.Console]::WriteLine本身没有返回值,自然不会进入返回流
括号改变行为的核心原因:语句上下文 vs 表达式上下文
独立一行的代码默认处于语句上下文,部分运算符在语句上下文下会默认隐藏返回值,用括号包裹后会强制进入表达式上下文,强制返回求值结果,不同运算符的表现如下:
1. 赋值运算符=
- 语句上下文(无括号):默认隐藏返回值,仅完成变量赋值,不会产生输出,比如
$n = 1不会返回任何内容 - 表达式上下文(套括号):强制返回赋值完成后的变量值,比如
($n = 1)会返回1,对应你第三个示例中第一个返回值为1的情况
2. 后置自增$n++/后置自减$n--
- 语句上下文(无括号):默认隐藏返回值,仅完成变量的自增/自减操作,不会产生输出
- 表达式上下文(套括号):严格遵循后置运算符的语义,返回自增/自减前的旧值,然后修改变量。你第二个示例中误以为
$n++产生了输出,实际第二个返回值2是($n++)的返回结果:$n初始为1,执行$n++后变成2,($n++)返回自增前的旧值2,之后$n变为3
3. 其他运算符(比如-join、四则运算符等)
无论是否套括号,默认都会返回求值结果,不会在语句上下文隐藏返回值,所以你示例中-join @(1,2,3)和(-join @(1,2,3))都返回了123
快速判断步骤
看到函数内任意一行代码,按以下顺序判断是否产生返回值:
- 先看执行结果是不是
$null或者void方法的返回值:是就不会输出,否则走下一步 - 看运算符是不是默认在语句上下文隐藏返回值的类型(赋值、后置自增/自减):
- 不是这类运算符:一定会输出结果
- 是这类运算符:看有没有套括号,套了括号就输出,没套就不输出
内容的提问来源于stack exchange,提问作者Carcigenicate
相关产品推荐
相关产品推荐

