PowerShell的脚本文件ps1详细介绍 作者:马育民 • 2026-05-14 08:28 • 阅读:10000 # 介绍 `.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** = **P**ower**S**hell - **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 文件基本结构 ```powershell <# .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 ``` - 注释:`\#` 单行、`\<\# \.\.\. \#\>` 多行 - 变量:`$变量名` - 函数:`function 名 \{ \.\.\. \}` - 流程:`if/else`、`foreach`、`switch` 等 ## 1、零基础入门脚本示例(通俗易懂) 下面为**极简入门案例**,无复杂语法,适合新手抄写测试,覆盖最常用基础语法,可直接保存为ps1运行测试。 ### 示例1:基础输出 \+ 变量使用 ```powershell # 最简单的控制台输出 Write-Host "Hello PowerShell!" -ForegroundColor Green # 定义变量、赋值、调用 $UserName = "运维测试" $Num = 666 Write-Host "用户名:$UserName,数字:$Num" ``` ### 示例2:条件判断(If 判断) ```powershell # 判断系统是否为Windows $IsWin = $IsWindows if ($IsWin -eq $true) { Write-Host "当前运行环境:Windows 系统" -ForegroundColor Cyan } else { Write-Host "当前运行环境:非Windows系统" } ``` ### 示例3:循环遍历(ForEach) ```powershell # 遍历数组,循环输出内容 $List = ["张三","李四","王五"] foreach ($item in $List) { Write-Host "遍历人员:$item" } ``` ### 示例4:简单文件操作(创建/写入/读取) ```powershell # 在桌面创建测试文本 $txtPath = "$env:Desktop\测试文件.txt" # 写入内容 "PS1入门测试文本" | Out-File -Path $txtPath -Encoding UTF8 # 读取内容 Get-Content -Path $txtPath -Encoding UTF8 ``` ### 示例5:简易实用工具(查看本机IP) ```powershell # 获取本机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、查看当前策略 ```powershell Get-ExecutionPolicy ``` ### 2、常用策略级别(从严到宽) - **Restricted**:默认,不能运行任何脚本 - **AllSigned**:所有脚本必须**数字签名**(含本地) - **RemoteSigned(推荐)**:本地脚本可直接运行,网络下载脚本必须签名 - **Unrestricted**:无限制(不推荐,不安全) ### 3、修改执行策略(管理员权限) ```powershell # 本地机器生效(常用) Set-ExecutionPolicy RemoteSigned -Scope LocalMachine # 当前用户生效(不影响他人) Set-ExecutionPolicy RemoteSigned -Scope CurrentUser ``` # 如何运行 PS1 脚本 假设脚本路径:`D:\\scripts\\test\.ps1` ### 1、PowerShell 中运行(推荐) ```powershell # 绝对路径 D:\scripts\test.ps1 # 相对路径(当前目录) .\test.ps1 ``` ### 2、从 CMD 运行 ```cmd powershell -ExecutionPolicy Bypass -File D:\scripts\test.ps1 ``` ### 3、右键运行 右键 `\.ps1` → **使用 PowerShell 运行**(不阻塞当前窗口) # 必须加 & 符号才能运行的情况 **`&` 的意思:** 把后面的 **字符串** 当作 **可执行程序运行** ### 为什么要加 &? - **PowerShell 规定:如果路径包含空格、或者你想用变量运行脚本,前面必须加 &(调用运算符)** - 不加 &,PowerShell 会把路径当成**字符串**,而不是**要执行的文件** ### 必须加 & 的 3 种场景 1. **路径里有空格** 2. **脚本路径存在变量里** 3. **你明确要把它当命令执行** ### 示例 1:路径带空格(必须加 &) ```powershell & "D:\my scripts\test.ps1" ``` ### 示例 2:路径存在变量里(必须加 &) ```powershell $file = "D:\scripts\test.ps1" & $file ``` ### 示例 3:当前目录带空格(必须加 &) ```powershell & ".\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、最佳实践 - 脚本开头加 `\<\# \.SYNOPSIS \.\.\. \#\>` 注释说明 - 函数、参数化编写,避免硬编码路径 - 敏感脚本用 **数字签名**(`Set\-AuthenticodeSignature`) - 统一编码:优先UTF\-8带BOM,舍弃GBK # 总结 **`.ps1` 是 Windows 自动化的核心脚本格式**,比传统 \.bat 强大得多,能直接管理系统、调用 \.NET、操作 WMI。核心重点:理解执行策略、分清新旧版本编码规则、优先使用UTF\-8带BOM编码、规范脚本编写。熟练掌握可大幅提升Windows运维、批量自动化处理的工作效率。 原文出处:http://malaoshi.top/show_1GW3JAErskPH.html