本文目录导读:

Windows PowerShell实用脚本大全:10个提升效率的自动化利器
目录导读
为什么PowerShell脚本是Windows管理员的必备技能?
PowerShell不仅是命令行工具,更是基于.NET框架的脚本语言和配置管理框架,它允许IT专业人员自动化几乎任何Windows管理任务——从文件操作到系统配置,从Active Directory管理到云服务交互。
核心优势:
- 对象导向:输出的是对象而非文本,便于进一步处理
- 模块化:可通过安装模块扩展功能(如ActiveDirectory模块)
- 远程管理:支持通过WS-Management协议管理多台计算机
- 与.NET无缝集成:可调用几乎所有.NET类库
根据微软官方文档,PowerShell已成为Windows Server和Windows 10/11的核心管理工具,无论是系统管理员、DevOps工程师还是开发人员,掌握PowerShell脚本都能显著减少重复性工作,降低人为错误。
十大实用PowerShell脚本详解
1 批量重命名文件
场景:需要将“img_20241201_001.jpg”等无规律文件名改为“Photo_2024_12_01_001.jpg”格式。
# 批量重命名当前目录下的.jpg文件
Get-ChildItem -Path "C:\Photos" -Filter "*.jpg" |
ForEach-Object -Begin { $counter = 1 } -Process {
$newName = "Photo_" + $_.LastWriteTime.ToString("yyyy_MM_dd") + "_$counter.jpg"
Rename-Item -Path $_.FullName -NewName $newName
$counter++
}
说明:脚本遍历指定文件夹内所有jpg文件,根据最后修改日期生成新文件名并自动编号,可将$_.LastWriteTime替换为$_.CreationTime获取创建日期。
2 清理系统临时文件
场景:安全删除Windows临时文件夹、用户临时文件夹及回收站内容。
# 安全清理临时文件(谨慎使用)
$tempFolders = @(
"$env:TEMP",
"$env:WINDIR\Temp",
"$env:USERPROFILE\Recent"
)
foreach ($folder in $tempFolders) {
if (Test-Path $folder) {
Remove-Item "$folder\*" -Recurse -Force -ErrorAction SilentlyContinue
Write-Host "已清理: $folder"
}
}
# 清空回收站
Clear-RecycleBin -Force -ErrorAction SilentlyContinue
注意:脚本会删除文件且不可恢复,建议先手动验证目录内容,可添加-WhatIf参数预览操作结果。
3 获取磁盘空间报告
场景:生成所有磁盘的详细使用情况报告,并筛选出剩余空间不足10%的磁盘。
# 获取磁盘空间报告并报警
Get-CimInstance -ClassName Win32_LogicalDisk -Filter "DriveType=3" |
Select-Object DeviceID,
@{Name="总大小(GB)"; Expression={[math]::Round($_.Size/1GB,2)}},
@{Name="可用空间(GB)"; Expression={[math]::Round($_.FreeSpace/1GB,2)}},
@{Name="使用率(%)"; Expression={
$percent = ($_.Size - $_.FreeSpace) / $_.Size * 100
[math]::Round($percent,1)
}}
Where-Object { $_."使用率(%)" -gt 90 } |
Format-Table -AutoSize
变体:将结果通过Out-GridView显示或导出为HTML文件:
... | ConvertTo-Html -Head "<h1>磁盘空间报告 $(Get-Date)</h1>" | Out-File disk_report.html
4 自动化Windows系统更新
场景:在非工作时间自动下载并安装系统更新(需管理员权限)。
# 使用PSWindowsUpdate模块(需先安装) # Install-Module -Name PSWindowsUpdate -Force Import-Module PSWindowsUpdate Get-WUInstall -MicrosoftUpdate -AcceptAll -AutoReboot -ScheduleJob (Get-Date).AddHours(2)
说明:此脚本需要提前安装PSWindowsUpdate模块。-ScheduleJob参数可指定任务在2小时后执行,避免影响当前工作,也可通过Windows任务计划程序配合此脚本。
5 导出已安装软件清单
场景:将本机或远程计算机的已安装软件导出为CSV文件,便于审计或迁移。
# 导出本地已安装软件
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* |
Select-Object DisplayName, DisplayVersion, Publisher, InstallDate |
Where-Object { $_.DisplayName } |
Export-Csv -Path "C:\Reports\InstalledApps_$(Get-Date -Format yyyyMMdd).csv" -NoTypeInformation
# 远程计算机(需WinRM开启)
Invoke-Command -ComputerName "RemotePC" -ScriptBlock {
Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\*
} | Select-Object PSComputerName, DisplayName, DisplayVersion |
Export-Csv ...
提示:64位系统上32位软件位于HKLM:\Software\WOW6432Node\Microsoft\Windows\CurrentVersion\Uninstall\,可合并两个路径。
6 查找并终止占用CPU最高的进程
场景:当系统卡顿时,快速找到“元凶”。
# 查找CPU占用率最高的5个进程并终止
Get-Process | Sort-Object CPU -Descending | Select-Object -First 5 |
ForEach-Object {
Write-Warning "终止进程: $($_.Name) (PID: $($_.Id)) CPU: $($_.CPU)秒"
Stop-Process -Id $_.Id -Force
}
安全建议:在生产环境中先使用-WhatIf查看要终止的进程,或改为输出到文本文件审查后再执行。
7 批量创建本地用户账户
场景:为实验室或临时项目快速创建多个本地用户。
# 从CSV文件批量创建用户(CSV格式:Username,Password,FullName)
Import-Csv "C:\Users.csv" | ForEach-Object {
$securePass = ConvertTo-SecureString $_.Password -AsPlainText -Force
try {
New-LocalUser -Name $_.Username -Password $securePass -FullName $_.FullName -ErrorAction Stop
Write-Host "已创建用户: $($_.Username)" -ForegroundColor Green
} catch {
Write-Warning "创建失败: $($_.Username) - $($_.Exception.Message)"
}
}
注意:此脚本需要PowerShell 5.1以上版本(Windows 10/Server 2016+),对于旧系统,需使用net user命令或ADSI。
8 监控特定文件夹变化
场景:实时监控文件夹内文件的新增、修改、删除,并记录日志。
# 使用FileSystemWatcher监控文件夹
$watcher = New-Object System.IO.FileSystemWatcher
$watcher.Path = "C:\MonitoredFolder"
$watcher.IncludeSubdirectories = $true
$watcher.EnableRaisingEvents = $true
$action = {
$path = $Event.SourceEventArgs.FullPath
$changeType = $Event.SourceEventArgs.ChangeType
$logEntry = "[$(Get-Date)] $changeType : $path"
Add-Content -Path "C:\Logs\FolderChange.log" -Value $logEntry
Write-Host $logEntry
}
Register-ObjectEvent $watcher "Created" -Action $action
Register-ObjectEvent $watcher "Changed" -Action $action
Register-ObjectEvent $watcher "Deleted" -Action $action
# 保持脚本运行
while ($true) { Start-Sleep -Seconds 1 }
扩展:可将日志发送到邮件或Syslog服务器。
9 定时备份文件到网络共享
场景:每日凌晨将重要文件夹备份到NAS或网络共享目录。
# 使用Robocopy进行增量备份
$source = "C:\ImportantData"
$dest = "\\NAS\Backup\ImportantData_$(Get-Date -Format yyyyMMdd)"
$logFile = "C:\Logs\Backup_$(Get-Date -Format yyyyMMdd).log"
robocopy $source $dest /E /ZB /R:2 /W:5 /NP /LOG+:$logFile
if ($LASTEXITCODE -lt 8) {
Write-Host "备份成功完成" -ForegroundColor Green
} else {
Write-Warning "备份中出现错误,请查看日志: $logFile"
}
定时执行:将其保存为.ps1文件,通过Windows任务计划程序设置每日凌晨2点运行。
10 从CSV批量导入Active Directory用户
场景:根据HR提供的CSV名单,批量创建AD用户并设置属性。
# 需要Active Directory模块
Import-Module ActiveDirectory
Import-Csv "C:\ADUsers.csv" | ForEach-Object {
$userParams = @{
Name = $_.GivenName + " " + $_.Surname
GivenName = $_.GivenName
Surname = $_.Surname
SamAccountName = $_.SamAccountName
UserPrincipalName = $_.SamAccountName + "@example.com"
Path = "OU=Users,DC=example,DC=com"
AccountPassword = (ConvertTo-SecureString $_.Password -AsPlainText -Force)
Enabled = $true
ChangePasswordAtLogon = $true
}
try {
New-ADUser @userParams
Write-Host "已创建用户: $($_.SamAccountName)" -ForegroundColor Green
} catch {
Write-Warning "创建失败: $($_.SamAccountName) - $($_.Exception.Message)"
}
}
CSV示例(首行为列名):
GivenName,Surname,SamAccountName,Password
张三,Li,zhangsan,P@ssw0rd123
常见问题解答(Q&A)
Q1:运行PowerShell脚本时提示“无法加载文件,因为在此系统上禁止运行脚本”,如何解决? A:这是Windows默认的执行策略限制,解决方法:
- 以管理员身份运行PowerShell,执行:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser - 仅对当前脚本绕过:
powershell -ExecutionPolicy Bypass -File "脚本路径.ps1" - 注意:不要轻易设置为
Unrestricted,这存在安全风险。
Q2:如何让PowerShell脚本在系统启动时自动运行? A:两种方法:
- 通过任务计划程序:创建任务→触发器选“计算机启动时”→操作选“启动程序”,程序为
powershell.exe,参数为-File "C:\Script\auto.ps1" - 将脚本快捷方式放入启动文件夹:
%APPDATA%\Microsoft\Windows\Start Menu\Programs\Startup
Q3:脚本需要管理员权限,如何自动提示提权? A:在脚本开头添加如下代码,会自动请求管理员权限:
If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] "Administrator")) {
Start-Process powershell.exe -ArgumentList "-File `"$PSCommandPath`"" -Verb RunAs
Exit
}
Q4:远程执行脚本需要什么前提条件? A:必须满足:
- 目标计算机开启WinRM服务:
Enable-PSRemoting -Force - 设置TrustedHosts(若不在同一域):
Set-Item WSMan:\localhost\Client\TrustedHosts -Value "计算机名或IP" -Force - 网络防火墙允许5985(HTTP)或5986(HTTPS)端口
如何确保脚本安全运行?
PowerShell脚本的强大功能也意味着安全风险,请遵循以下最佳实践:
签名脚本:使用代码签名证书对脚本进行数字签名,确保完整性和来源可信。
Set-AuthenticodeSignature -FilePath "script.ps1" -Certificate (Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert)
最小权限原则:
- 脚本只请求完成任务所需的最小权限
- 不需要管理员权限的脚本不要用管理员身份运行
- 使用受限的执行策略(如
RemoteSigned)
敏感信息处理:
- 避免在脚本中硬编码密码,使用
Get-Credential或SecureString - 存储加密密钥:
ConvertFrom-SecureString配合文件存储
审计与日志:
- 启用PowerShell脚本块日志记录(组策略配置)
- 对关键操作添加详细日志输出
本文精选的10个PowerShell实用脚本覆盖了文件管理、系统维护、用户管理、监控报警等常见运维场景,通过掌握这些脚本,你可以:
- 将重复性工作缩短95%以上
- 实现无人值守的自动化运维
- 快速定位和解决系统问题
进阶建议:
- 学习PowerShell的
Pester测试框架,为脚本编写单元测试 - 尝试使用
PowerShell DSC (Desired State Configuration)实现配置即代码 - 将常用脚本封装为模块(.psm1文件),方便复用
建议将本文收藏或保存为PDF,在实际工作中按需查阅,PowerShell的学习曲线虽然陡峭,但每掌握一个脚本,都是向自动化运维迈出的坚实一步。