PowerShell 脚本编写


引言

PowerShell 是一门功能强大的命令行脚本语言,不仅能交互式运行命令,还能将命令组合成脚本文件,实现复杂自动化任务。

本篇文章将带你逐步掌握 PowerShell 脚本开发的基础技能,包括:

  • 如何创建和运行 .ps1 脚本
  • 如何定义和使用函数
  • 如何进行模块化开发并复用你的脚本逻辑

一、PowerShell 脚本入门

脚本文件的创建(.ps1)

PowerShell 脚本文件是以 .ps1 为扩展名的纯文本文件,其中包含一组要执行的 PowerShell 命令。

示例:hello.ps1

# hello.ps1
Write-Output "Hello from PowerShell script!"

可使用任意文本编辑器(推荐 VS Code)创建 .ps1 文件。

执行策略(Execution Policy)

Windows 出于安全考虑,默认 不允许执行脚本,你需要设置执行策略。

查看当前策略:

Get-ExecutionPolicy

临时设置为允许本地脚本运行:

Set-ExecutionPolicy -Scope CurrentUser -ExecutionPolicy RemoteSigned

RemoteSigned:运行本地脚本无需签名,但下载的脚本必须由可信发布者签名。

脚本的运行方法

命令行运行:

.\hello.ps1

指定 PowerShell 执行器运行:

powershell.exe -File .\hello.ps1
pwsh.exe -File .\hello.ps1   # PowerShell 7+

右键"使用 PowerShell 运行"(需配合策略设置)

参数传递和处理

可以在脚本中定义接收外部参数的方式:

示例:带参数的脚本 greet.ps1

param (
    [string]$name,
    [int]$age
)

Write-Output "你好,$name,你的年龄是 $age 岁。"

运行时传参:

.\greet.ps1 -name "小明" -age 18

还支持默认值和参数验证:

param (
    [Parameter(Mandatory=$true)]
    [ValidateNotNullOrEmpty()]
    [string]$City = "北京"
)

二、函数的使用

函数定义和调用

function Say-Hello {
    Write-Output "Hello from function"
}

Say-Hello

参数声明和验证

函数也可以带参数,使用 param 块定义:

function Add-Numbers {
    param (
        [int]$a,
        [int]$b
    )
    return $a + $b
}

Add-Numbers -a 3 -b 5  # 输出 8

也可以使用位置参数:

function Add {
    param ($x, $y)
    $x + $y
}
Add 10 20

返回值处理

PowerShell 函数默认返回所有输出(包括 Write-Output)。

推荐使用 return 明确返回:

function Get-Square {
    param ([int]$num)
    return $num * $num
}

$result = Get-Square -num 6
Write-Output $result

函数作用域

函数内部定义的变量默认是局部变量:

function Demo-Scope {
    $message = "Hello"
}
Demo-Scope
Write-Output $message  # 无法访问

如果要从外部访问变量,可使用作用域前缀:

$global:x = 5

三、模块化开发

什么是 PowerShell 模块

模块(Module)是多个函数、脚本、资源的集合,用于组织代码、方便复用。

常见模块类型:

  • 脚本模块(.psm1
  • 清单模块(.psd1
  • 二进制模块(.dll)

导入和使用模块

使用 Import-Module 导入模块:

Import-Module MyModule.psm1

查看已加载的模块:

Get-Module

调用模块中的函数:

Say-Hello

PowerShell Gallery 简介

PowerShell Gallery 是 PowerShell 的官方模块仓库,你可以下载并安装数千个模块。

安装模块示例:

Install-Module -Name PSReadLine

更新模块:

Update-Module PSReadLine

创建简单的自定义模块

新建 MyModule.psm1 文件,添加函数:

# MyModule.psm1
function Greet-User {
    param ([string]$name)
    Write-Output "欢迎你,$name"
}

在脚本中导入并调用:

Import-Module .\MyModule.psm1
Greet-User -name "小红"

提示:可以将模块文件放入 $env:PSModulePath 中的路径,让系统自动识别。


四、小结

内容 说明
.ps1 文件 PowerShell 脚本扩展名,存储命令
param 用于定义脚本/函数参数
Set-ExecutionPolicy 控制脚本是否允许运行
函数 封装复用代码,提高结构清晰度
模块(.psm1 组织多个函数,实现可移植性
PowerShell Gallery 官方模块仓库,可下载第三方模块