首页/系统/Windows 运维速查/函数定义与返回值
PowerShell 基础66 条

函数定义与返回值

function 封装可复用逻辑:输出流即返回值,任何未消费的输出都会混入结果,这是新手最常踩的坑。

Windows 运维速查系统更新于 2026-10-13

函数是什么

function 用来封装可复用的逻辑。PowerShell 函数的关键特点是:函数体内所有没有被消费的输出都会成为返回值,return 只是提前结束函数,并不是唯一的返回途径。这一点与多数编程语言不同,也是新手最容易踩的坑。

基本信息

适用平台Windows PowerShell 5.1 与 PowerShell 7
语法function 名称 { param($a) 函数体 }
高级函数函数体内加 [CmdletBinding()] 即获得 -Verbose、-WhatIf、-ErrorAction 等通用参数
参数写法param([string]$Path='C:\') 可带类型约束与默认值
返回规则所有输出流内容都进入返回值,return 只负责提前结束
命名建议动词-名词格式,如 Get-、Set-、Test-

典型使用场景

  • 把重复出现的检查逻辑抽成函数,在多处调用
  • 给运维脚本加参数化入口,用参数控制目标与行为开关
  • 封装会输出多个对象的逻辑,方便用管道继续处理
  • 编写带 -Verbose 日志的高级函数,排障时打开细节
  • 把常用小工具收进个人模块,长期复用

常用示例

常用示例
function Get-DiskFree {
  param([string]$Drive = 'C')
  # 只输出一个数值,避免其他内容混进返回值
  (Get-PSDrive -Name $Drive).Free / 1GB
}
Get-DiskFree
Get-DiskFree -Drive D

# 高级函数:自动获得 -Verbose 等通用参数
function Test-Port {
  [CmdletBinding()]
  param([string]$Computer, [int]$Port = 443)
  Write-Verbose "测试 $Computer 的 $Port 端口"
  [bool](Test-NetConnection $Computer -Port $Port -InformationLevel Quiet)
}
Test-Port -Computer 10.0.0.8 -Port 80 -Verbose

常见写法与作用

写法作用注意
param(...)声明函数参数单个参数时可省略括号
[CmdletBinding()]把函数升级为高级函数自动获得通用参数
Write-Verbose输出细节日志默认不显示,需加 -Verbose
Out-Null 或赋值抑制中间命令的输出防止污染返回值
$args未声明参数的自变量数组正式脚本不建议依赖它
想让函数只返回一件事,就把中间命令的输出写进变量、把日志改用 Write-Verbose、或对不需要的结果用 Out-Null 丢弃,否则调用方拿到的是混合数组。
函数名遵循动词-名词格式不只是风格问题,还能用 Get-Verb 校验动词是否合法,并降低与内置命令重名导致行为被覆盖的风险。

易错点

  • 函数体内副作用命令的默认输出会混进返回值,调用方得到的是数组而不是预期的单个值
  • return 只结束函数,无法阻止此前的输出进入结果流,抑制输出必须显式处理
  • 参数没做类型约束时传入意外类型不会立即报错,字符串与数字混用会埋下隐蔽问题
  • 函数名与内置命令重名会静默覆盖原有行为,脚本换台机器运行结果就变了
  • 函数默认可以读写外部作用域变量,赋值时可能意外影响调用者,应统一用 param 传参

数据来源与参考

  • Microsoft Learn:about_Functions
  • Microsoft Learn:about_Functions_Advanced

相关工具

​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌