哪些实用脚本适合Windows PowerShell?

wen 实用脚本 4

本文目录导读:

哪些实用脚本适合Windows PowerShell?

  1. 目录导读
  2. 为什么PowerShell脚本是Windows管理员的必备技能?
  3. 十大实用PowerShell脚本详解
  4. 常见问题解答(Q&A)
  5. 如何确保脚本安全运行?

Windows PowerShell实用脚本大全:10个提升效率的自动化利器

目录导读

  1. 为什么PowerShell脚本是Windows管理员的必备技能?
  2. 十大实用PowerShell脚本详解
  3. 常见问题解答(Q&A)
  4. 如何确保脚本安全运行?

为什么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:两种方法:

  1. 通过任务计划程序:创建任务→触发器选“计算机启动时”→操作选“启动程序”,程序为powershell.exe,参数为-File "C:\Script\auto.ps1"
  2. 将脚本快捷方式放入启动文件夹:%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:必须满足:

  1. 目标计算机开启WinRM服务:Enable-PSRemoting -Force
  2. 设置TrustedHosts(若不在同一域):Set-Item WSMan:\localhost\Client\TrustedHosts -Value "计算机名或IP" -Force
  3. 网络防火墙允许5985(HTTP)或5986(HTTPS)端口

如何确保脚本安全运行?

PowerShell脚本的强大功能也意味着安全风险,请遵循以下最佳实践:

签名脚本:使用代码签名证书对脚本进行数字签名,确保完整性和来源可信。

Set-AuthenticodeSignature -FilePath "script.ps1" -Certificate (Get-ChildItem -Path Cert:\CurrentUser\My -CodeSigningCert)

最小权限原则

  • 脚本只请求完成任务所需的最小权限
  • 不需要管理员权限的脚本不要用管理员身份运行
  • 使用受限的执行策略(如RemoteSigned

敏感信息处理

  • 避免在脚本中硬编码密码,使用Get-CredentialSecureString
  • 存储加密密钥:ConvertFrom-SecureString配合文件存储

审计与日志

  • 启用PowerShell脚本块日志记录(组策略配置)
  • 对关键操作添加详细日志输出

本文精选的10个PowerShell实用脚本覆盖了文件管理、系统维护、用户管理、监控报警等常见运维场景,通过掌握这些脚本,你可以:

  • 将重复性工作缩短95%以上
  • 实现无人值守的自动化运维
  • 快速定位和解决系统问题

进阶建议

  1. 学习PowerShell的Pester测试框架,为脚本编写单元测试
  2. 尝试使用PowerShell DSC (Desired State Configuration)实现配置即代码
  3. 将常用脚本封装为模块(.psm1文件),方便复用

建议将本文收藏或保存为PDF,在实际工作中按需查阅,PowerShell的学习曲线虽然陡峭,但每掌握一个脚本,都是向自动化运维迈出的坚实一步。

抱歉,评论功能暂时关闭!