PowerShell 脚本入门:从写第一行 .ps1 到自动处理日常任务
在「终端」里一条条敲命令,做一次两次可以;要重复做的事(每天的备份、清理临时文件、批量改名),就该交给脚本。PowerShell 就是 Windows 自带的这个「自动化车间」,它既能当命令行用,也能把多条命令写进一个 .ps1 脚本文件一次跑完。这篇带你从零开始。
先搞清楚:PowerShell 和 CMD / 批处理什么关系
- CMD(命令提示符):老一代命令行,输入的是 DOS 风格命令;
- 批处理(.bat / .cmd):把 CMD 命令写成脚本,适合简单顺序任务;
- PowerShell:微软新一代命令行与脚本环境,命令输出的是结构化对象(不只是文本),还能调用 .NET 和系统接口,能力远强于 CMD。
日常「跑一条命令」用哪个都行;凡是需要条件判断、批量遍历、与系统功能深度打交道的自动化,优先选 PowerShell 脚本。它的命令(叫 cmdlet,读作 command-let)统一是「动词-名词」形式,比如 Get-Process、Set-ExecutionPolicy,记起来有规律。
执行策略:第一次运行脚本常见报错的解法
双击或运行 .ps1 脚本时提示「无法加载文件,因为在此系统上禁止运行脚本」,这是 Windows 的安全机制——执行策略(Execution Policy)默认不放行。它不是出错了,是需要你按需放开。
先看当前策略(推荐第一步):
Get-ExecutionPolicy -List
会列出各作用域(MachinePolicy / UserPolicy / Process / CurrentUser / LocalMachine)的值。想允许运行「自己写的本地脚本」,最稳妥的是只对当前用户放开:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser
RemoteSigned 的含义是:本地创建的脚本可运行,从互联网下载的脚本需要数字签名——既方便又保留了防线。按提示输入 Y 确认即可。
其他可选策略:
| 策略 | 含义 | 适用场景 | |------|------|----------| | Restricted | 禁止运行任何脚本(默认) | 只看不能跑 | | RemoteSigned | 本地脚本可运行,远程脚本需签名 | 个人日常(推荐) | | AllSigned | 所有脚本都需可信签名 | 高安全环境 | | Bypass | 全部放行 | 临时测试,不建议持久设置 |
临时跑一次不想改策略,也可以用:
powershell -ExecutionPolicy Bypass -File "C:\路径\脚本.ps1"
只对本次会话生效,不改系统设置。
创建你的第一个脚本
用记事本(或 VS Code)新建文件,写三行:
$name = Read-Host "请输入你的名字"
Write-Host "你好,$name!今天是 $(Get-Date -Format 'yyyy-MM-dd')"
保存为 hello.ps1(注意扩展名要选「所有文件」,编码建议 UTF-8)。然后在 PowerShell 里进入该目录并运行:
.\hello.ps1
脚本可执行了。脚本里出现的几个基础概念:
$变量名:定义变量,$name存用户输入;Read-Host:等待用户输入一行文字;Write-Host:打印文字到屏幕;$( ):在字符串里内嵌命令结果。
最常用的命令与组合套路
| 场景 | 命令 | |------|------| | 列出正在运行的进程 | Get-Process | | 按名称结束进程 | Stop-Process -Name notepad | | 查看服务状态 | Get-Service | | 重启某服务 | Restart-Service -Name wuauserv | | 列出磁盘占用 | Get-PSDrive -PSProvider FileSystem | | 筛选结果 | Get-Process | Where-Object { $_.WS -gt 300MB } | | 排序并取前 10 | Get-Process | Sort-Object WS -Descending | Select-Object -First 10 |
组合的核心是管道符 |:把左边命令输出的对象流给右边处理。上面几行已经能覆盖「查什么、筛什么、排什么」三类最常见需求。
写一个实用的自动清理脚本
下面这个脚本删除临时文件夹里超过 7 天未访问的文件,适合加到任务计划里定期执行(配合站内「任务计划程序」一文可以做到无人值守):
$cutoff = (Get-Date).AddDays(-7)
Get-ChildItem "$env:TEMP" -Recurse -File |
Where-Object { $_.LastAccessTime -lt $cutoff } |
Remove-Item -Force
Write-Host "已清理临时文件中超过 7 天的部分。"
第一次运行建议先不加最后一行删除命令,改成只 Select-Object 输出预览,确认结果正确再真正执行删除——脚本操作文件时,「先预览后执行」是避免误删的通用纪律。
脚本安全:四条边界要守住
- 不要随便运行网上下载的脚本:先打开文件通读一遍,确认没有可疑操作(改注册表、下载执行远程内容等)再运行;
- 执行策略只放开到够用:个人电脑
RemoteSigned -Scope CurrentUser通常是合理的上限,不必为了省事设 Bypass; - 重要操作加确认或日志:涉及删除、覆盖的脚本,可加入参数
-WhatIf(PowerShell 内置的「演练模式」)先看会做什么; - 涉及管理员权限的脚本:右键「以管理员身份运行」PowerShell 再执行;普通脚本不要随意用管理员权限跑。
想进一步学什么
- 条件与循环:
if / foreach / while,让脚本学会「判断后执行」; - 函数与模块:把常用逻辑封装成函数,脚本更整洁;
- 远程管理(进阶):
Invoke-Command可对多台电脑批量执行命令,适合机房和办公网场景。
PowerShell 的官方文档在微软 Learn 网站可免费查阅,按「基础概念 → 常用 cmdlet → 脚本语言」的顺序学,两三周就能应付日常自动化。
保存与运行脚本的三个实用细节
- 双击 .ps1 默认不会直接执行:它可能用记事本打开,这是安全设计。正确运行方式是右键脚本选「使用 PowerShell 运行」,或在 PowerShell 里输入
.\脚本名.ps1; - 路径带空格时要加引号:
.\我的 脚本.ps1会解析错,应写成.\"我的 脚本.ps1"或用无空格文件名; - 编码建议存成 UTF-8 with BOM:记事本默认保存 UTF-8 时,若脚本里包含中文字符,旧版 Windows PowerShell 可能显示乱码或报错,可另存为「UTF-8 with BOM」编码后再运行。
另外补充一点取舍:单纯几行顺序命令、只需要 CMD 语法的简单自动化,用批处理(.bat)也很顺手(站内「批处理脚本入门」一文有系统介绍);一旦涉及对象筛选、系统服务、网络、深度文件操作,PowerShell 的表达能力明显更强。两者不是竞争关系,按任务复杂度选择即可。
做完这几件再收工
- 运行
Get-ExecutionPolicy -List,看懂当前各作用域的策略值。 - 按需执行
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser放开本地脚本。 - 用记事本写一个
hello.ps1,在 PowerShell 中执行通过。 - 把「清理 7 天前临时文件」脚本先以预览模式跑一遍,确认无误。
- 记住「不运行来历不明的脚本、重要操作先 -WhatIf 预览」两条安全底线。