PowerShell的脚本文件ps1详细介绍

介绍

.ps1 是 PowerShell 脚本文件的扩展名,本质是 纯文本文件,里面编写一条或多条 PowerShell 命令,可被 PowerShell 执行引擎(powershell.exe 或 pwsh)解释运行。

  • 全称:PowerShell Script File

  • 平台:原生 Windows,PowerShell 7+ 跨 Linux/macOS

  • MIME:text/x\-powershell / application/x\-powershell

  • 同类后缀:

- **\.psm1**:模块文件(可被导入、复用函数)

- **\.psd1**:模块清单/数据文件

- **\.ps1xml**:配置/格式文件

为什么后缀叫 .ps1

  • ps = PowerShell
  • 1 = 版本 1

最早 PowerShell 刚出世时 版本号是 1.0
微软直接约定:

脚本后缀 = **ps + 主版本号**

所以就叫 .ps1


后续版本对应后缀

按这个逻辑顺延:

  • PowerShell 1.0 → .ps1
  • PowerShell 2.0 → .ps2(极少用)
  • PowerShell 3.0+ 往后,不再出新后缀,统一还用 .ps1

为什么不叫 .ps / .powershell / .script?

  1. .ps 早已被 PostScript 打印文件占用,不能抢后缀
  2. 太长后缀不好记、老旧系统兼容差
  3. 微软传统习惯:用缩写+版本号做后缀
    类似:
    • .vbs VB脚本
    • .bat 批处理
    • .cmd NT命令脚本

配套全套后缀来历

都是同一套命名规则:

  • .ps1 PowerShell 脚本文件(主脚本)
  • .psm1 PowerShell Module 模块文件
  • .psd1 Module Manifest 模块清单
  • .ps1xml 配置/格式定义文件

前面 ps 固定,后面字母是用途缩写。

PS1 文件特点

1、纯文本、无编译

用记事本、VS Code、PowerShell ISE 直接编辑,无需编译,修改即可运行。

2、面向对象(区别于 .bat/.cmd)

传递的是 .NET 对象,不是纯文本;管道 \| 直接传对象属性,文本处理、系统操作更简单高效。

3、默认禁止执行(安全机制)

双击不直接运行,防止恶意脚本自动执行,必须通过执行策略(Execution Policy)手动放行。

PS1 编码格式(坑)

很多新手误区:误认为PS1必须用GBK编码,不能用UTF-8,该说法错误,以下是通俗易懂的官方编码规则,专治中文乱码。

1、不同版本PowerShell编码硬性规则

(1)Windows 自带老版本:PowerShell 5.1(最常用)

  • UTF-8 不带BOM → 中文100%乱码(最大坑)

  • UTF-8 带BOM → 完美兼容,无乱码

  • GBK(ANSI) → 可以正常运行,无乱码

(2)新版跨平台:PowerShell 7+

  • 标准编码:UTF-8 无BOM

  • 不推荐、不兼容GBK编码,使用GBK会乱码

2、结论

  • ❌ 错误认知:PS1编码必须是GBK,不能用UTF-8

  • ✅ 正确规则:现代PS1标准编码为UTF-8,GBK仅为老旧兼容格式

  • 🏆 通用最优编码:UTF-8 with BOM(UTF-8带签名),新老版本PowerShell全部兼容

3、常用编辑器编码设置方法

  • VS Code:右下角编码处,手动选择 UTF-8 with BOM

  • 系统记事本:另存为 → 编码选择UTF-8(记事本的UTF-8默认带BOM)

  • PowerShell ISE:默认保存为UTF-8带BOM,无需手动修改

4、编码优劣对比

  • ✅ UTF-8带BOM:通用性强、支持跨平台、代码可上传Git、无中文乱码(主推)

  • ❌ GBK:仅适配老旧Windows、跨系统必乱码、现代编辑器不推荐使用

PS1 文件基本结构

<#
.SYNOPSIS
示例 PS1 脚本:输出系统信息
#>

# 单行注释用 #
Write-Host "=== 系统信息 ===" -ForegroundColor Cyan

# 变量用 $
$os=Get-ComputerInfo -Property OsName, OsVersion
Write-Output "系统:$($os.OsName)"

# 函数
function Get-FreeSpace {
    param([string]$drive="C")
    Get-Volume -DriveLetter $drive | Select-Object DriveLetter, SizeRemaining
}

# 调用函数
Get-FreeSpace
  • 注释:\# 单行、\&lt;\# \.\.\. \#\&gt; 多行

  • 变量:$变量名

  • 函数:function 名 \{ \.\.\. \}

  • 流程:if/else、foreach、switch 等

1、零基础入门脚本示例(通俗易懂)

下面为极简入门案例,无复杂语法,适合新手抄写测试,覆盖最常用基础语法,可直接保存为ps1运行测试。

示例1:基础输出 + 变量使用

# 最简单的控制台输出
Write-Host "Hello PowerShell!" -ForegroundColor Green

# 定义变量、赋值、调用
$UserName = "运维测试"
$Num = 666
Write-Host "用户名:$UserName,数字:$Num"

示例2:条件判断(If 判断)

# 判断系统是否为Windows
$IsWin = $IsWindows
if ($IsWin -eq $true) {
    Write-Host "当前运行环境:Windows 系统" -ForegroundColor Cyan
}
else {
    Write-Host "当前运行环境:非Windows系统"
}

示例3:循环遍历(ForEach)

# 遍历数组,循环输出内容
$List = ["张三","李四","王五"]
foreach ($item in $List) {
    Write-Host "遍历人员:$item"
}

示例4:简单文件操作(创建/写入/读取)

# 在桌面创建测试文本
$txtPath = "$env:Desktop\测试文件.txt"
# 写入内容
"PS1入门测试文本" | Out-File -Path $txtPath -Encoding UTF8
# 读取内容
Get-Content -Path $txtPath -Encoding UTF8

示例5:简易实用工具(查看本机IP)

# 获取本机IPv4地址
Get-NetIPAddress | Where-Object {$_.AddressFamily -eq "IPv4"} | Select-Object InterfaceAlias,IPAddress

2、入门脚本使用说明

  • 运行方式:全部代码可直接复制,新建ps1文件保存后运行,无需额外环境依赖。

  • 编码要求:入门脚本统一保存为UTF-8 with BOM,避免中文乱码。

  • 语法特点:PowerShell 语法不区分大小写,代码缩进不强制,可读性优先即可。

  • 颜色参数:\-ForegroundColor 为字体颜色,常用:Green、Red、Cyan、Yellow。

执行策略(必懂,否则无法运行)

默认策略:Restricted(受限)→ 禁止运行任何 ps1

1、查看当前策略

Get-ExecutionPolicy

2、常用策略级别(从严到宽)

  • Restricted:默认,不能运行任何脚本

  • AllSigned:所有脚本必须数字签名(含本地)

  • RemoteSigned(推荐):本地脚本可直接运行,网络下载脚本必须签名

  • Unrestricted:无限制(不推荐,不安全)

3、修改执行策略(管理员权限)

# 本地机器生效(常用)
Set-ExecutionPolicy RemoteSigned -Scope LocalMachine

# 当前用户生效(不影响他人)
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser

如何运行 PS1 脚本

假设脚本路径:D:\\scripts\\test\.ps1

1、PowerShell 中运行(推荐)

# 绝对路径
D:\scripts\test.ps1

# 相对路径(当前目录)
.\test.ps1

2、从 CMD 运行

powershell -ExecutionPolicy Bypass -File D:\scripts\test.ps1

3、右键运行

右键 \.ps1 → 使用 PowerShell 运行(不阻塞当前窗口)

必须加 & 符号才能运行的情况

& 的意思: 把后面的 字符串 当作 可执行程序运行

为什么要加 &?

  • PowerShell 规定:如果路径包含空格、或者你想用变量运行脚本,前面必须加 &(调用运算符)
  • 不加 &,PowerShell 会把路径当成字符串,而不是要执行的文件

必须加 & 的 3 种场景

  1. 路径里有空格
  2. 脚本路径存在变量里
  3. 你明确要把它当命令执行

示例 1:路径带空格(必须加 &)

& "D:\my scripts\test.ps1"

示例 2:路径存在变量里(必须加 &)

$file = "D:\scripts\test.ps1"
& $file

示例 3:当前目录带空格(必须加 &)

& ".\my test script.ps1"

PS1 与 .bat、.cmd 对比

特性 .ps1(PowerShell) .bat/.cmd(CMD)
内核 .NET 对象模型 文本流
功能 系统管理、WMI、.NET 调用 简单文件/命令调用
编码 UTF-8优先,兼容GBK 优先 GBK
执行策略 有安全策略控制 无限制(默认)
跨平台 PowerShell 7+ 支持 仅 Windows

常见问题与最佳实践

1、禁止运行脚本报错

原因:执行策略为 Restricted;解决:Set\-ExecutionPolicy RemoteSigned \-Scope CurrentUser

2、中文乱码问题

通用解决方案:脚本统一保存为 UTF-8 with BOM,彻底规避乱码;坚决不刻意保存为GBK。

3、最佳实践

  • 脚本开头加 \&lt;\# \.SYNOPSIS \.\.\. \#\&gt; 注释说明

  • 函数、参数化编写,避免硬编码路径

  • 敏感脚本用 数字签名(Set\-AuthenticodeSignature)

  • 统一编码:优先UTF-8带BOM,舍弃GBK

总结

.ps1 是 Windows 自动化的核心脚本格式,比传统 .bat 强大得多,能直接管理系统、调用 .NET、操作 WMI。核心重点:理解执行策略、分清新旧版本编码规则、优先使用UTF-8带BOM编码、规范脚本编写。熟练掌握可大幅提升Windows运维、批量自动化处理的工作效率。


原文出处:/show_1GW3JAErskPH.html