当前位置: 首页 > news >正文

[Powershell入门教程]第4天:模块、脚本编写、错误处理与 .NET 集成

第4天:模块、脚本编写、错误处理与 .NET 集成

🎯 学习目标

  • 掌握 PowerShell 脚本(.ps1)的结构与最佳实践
  • 理解模块(Module)的作用,并能创建和导入自定义模块
  • 熟练使用 try/catch/finally 进行结构化错误处理
  • 直接调用 .NET 类库(如 System.IOSystem.Net 等)完成高级任务

一、PowerShell 脚本编写(.ps1 文件)

1. 脚本基本结构

一个良好的脚本应包含:

  • 注释说明(用途、作者、参数)
  • 参数声明(param 块)
  • 错误处理($ErrorActionPreference 或 try/catch
  • 主逻辑
  • 清理或输出
# Get-DiskUsage.ps1
<#
.SYNOPSIS获取指定目录的磁盘使用情况。
.DESCRIPTION计算目录下所有文件总大小,支持递归。
.PARAMETER Path目标路径,默认为当前目录。
.EXAMPLE.\Get-DiskUsage.ps1 -Path C:\Temp
#>param([string]$Path = "."
)if (-not (Test-Path $Path)) {throw "路径不存在: $Path"
}$totalBytes = (Get-ChildItem -Path $Path -Recurse -File | Measure-Object -Property Length -Sum).Sum
"{0:N2} MB" -f ($totalBytes / 1MB)

💡 使用方式:

.\Get-DiskUsage.ps1 -Path C:\Windows

2. 脚本执行方式回顾

方式命令说明
当前作用域运行. .\script.ps1变量/函数留在当前会话(点源执行)
子作用域运行.\script.ps1执行完后环境不保留
绕过策略运行PowerShell -ExecutionPolicy Bypass -File script.ps1适合自动化

二、模块(Modules)——组织可重用代码

1. 什么是模块?

模块是 PowerShell 中用于封装函数、变量、别名等的单元,便于分发和复用。

内置模块示例:

Get-Module -ListAvailable  # 查看所有可用模块
Import-Module ActiveDirectory  # 导入 AD 模块(需安装)

2. 创建自定义模块

步骤1:创建模块目录
C:\Users\<username>\Documents\Documents\WindowsPowerShell\PowerShell\Modules\MyTools\
└── MyTools.psm1   ← 模块主文件

⚠️ 路径必须在 $env:PSModulePath 中(用户模块默认在此)

⚠️ 可能次路径不存在,需手动建立

步骤2:编写 MyTools.psm1
# MyTools.psm1
function Get-Uptime {$os = Get-CimInstance Win32_OperatingSystem(Get-Date) - $os.LastBootUpTime
}function Test-Port {param([string]$ComputerName, [int]$Port)try {$tcp = New-Object System.Net.Sockets.TcpClient$tcp.Connect($ComputerName, $Port)$tcp.Connected$tcp.Close()} catch {$false}
}Export-ModuleMember -Function Get-Uptime, Test-Port
步骤3:导入并使用
Import-Module MyTools
Get-Uptime
Test-Port -ComputerName "baidu.com" -Port 80

✅ 优势:函数自动加载,命名空间清晰,易于共享。


三、错误处理:try / catch / finally

PowerShell 支持结构化异常处理,但需注意:

  • 仅对“终止性错误”(Terminating Errors)生效
  • 默认很多命令产生的是“非终止错误”(如 Get-Item NoSuchFile

1. 强制将错误转为终止错误

使用 -ErrorAction Stop

try {Get-Item "C:\NonExistentFile.txt" -ErrorAction Stop
} catch {Write-Host "捕获到错误: $($_.Exception.Message)" -ForegroundColor Red
} finally {Write-Host "清理操作(无论成功与否都会执行)"
}

2. 捕获特定异常类型(.NET 集成)

你可以根据 .NET 异常类型进行精细处理:

try {[System.IO.File]::ReadAllText("C:\Protected\file.txt")
} catch [System.UnauthorizedAccessException] {Write-Host "权限不足!" -ForegroundColor Yellow
} catch [System.IO.FileNotFoundException] {Write-Host "文件未找到!" -ForegroundColor Cyan
} catch {Write-Host "未知错误: $($_.Exception.GetType().FullName)"
}

🔍 提示:通过 $_.Exception.GetType().FullName 查看具体异常类型。


四、PowerShell 与 .NET 深度集成(核心优势!)

PowerShell 基于 .NET(Windows 上是 .NET Framework/.NET,跨平台是 .NET Core),可直接调用任何 .NET 类。

1. 调用静态方法

# 获取当前时间(等价于 Get-Date)
[System.DateTime]::Now# 生成 GUID
[System.Guid]::NewGuid()# 环境信息
[System.Environment]::OSVersion
[System.Environment]::GetFolderPath("Desktop")

2. 创建 .NET 对象实例

# 创建 WebClient(已过时,推荐使用 Invoke-WebRequest)
$client = New-Object System.Net.WebClient
$content = $client.DownloadString("https://httpbin.org/ip")
$client.Dispose()  # 释放资源

✅ 更现代的方式(PowerShell 5+):

Invoke-RestMethod https://httpbin.org/ip

3. 使用 .NET 枚举

# 文件属性
$file = Get-Item .\test.txt
$file.Attributes -band [System.IO.FileAttributes]::Hidden

4. 调用 .NET 方法处理字符串/数学

# 字符串操作(比 PowerShell 内置更强大)
[System.String]::IsNullOrWhiteSpace("   ")  # True# 数学计算
[Math]::Round(3.14159, 2)  # 3.14
[Math]::Pow(2, 10)         # 1024

5. 实战:用 .NET 发送邮件(无需 Outlook)

$smtp = New-Object Net.Mail.SmtpClient("smtp.example.com", 587)
$smtp.EnableSsl = $true
$smtp.Credentials = [Net.NetworkCredential]::new("user@example.com", "password")$mail = [Net.Mail.MailMessage]::new("from@example.com", "to@example.com", "主题", "正文")
$smtp.Send($mail)
$smtp.Dispose()

⚠️ 注意:生产环境建议使用安全凭据(如 $PSCredential)。


五、动手实践:综合项目

项目:编写一个带错误处理的“网站健康检查”脚本

# HealthCheck.ps1
param([string[]]$Urls = @("https://baidu.com", "https://github.com")
)foreach ($url in $Urls) {try {Write-Host "正在检查: $url" -ForegroundColor Green$response = Invoke-WebRequest -Uri $url -UseBasicParsing -TimeoutSec 10if ($response.StatusCode -eq 200) {Write-Host "✅ 正常 (状态码: $($response.StatusCode))"} else {Write-Host "⚠️ 异常状态码: $($response.StatusCode)" -ForegroundColor Yellow}} catch {$ex = $_.Exceptionif ($ex -is [System.Net.WebException]) {Write-Host "❌ 网络错误: $($ex.Message)" -ForegroundColor Red} else {Write-Host "💥 未知错误: $($ex.Message)" -ForegroundColor Magenta}}
}

运行:

.\HealthCheck.ps1 -Urls "https://baidu.com", "https://nonexistent.fake"

六、今日重点总结

  • ✅ 脚本应结构清晰,包含参数、注释和错误处理
  • ✅ 模块(.psm1)是组织可重用函数的最佳方式
  • ✅ try/catch 需配合 -ErrorAction Stop 或 .NET 异常使用
  • ✅ PowerShell 是 .NET 的“脚本前端”,可直接调用任何 .NET 类库
  • ✅ 利用 [System.xxx] 和 New-Object 解锁高级功能(网络、文件、加密等)

📚 参考资料(Microsoft Learn)

  • About Modules
  • About Try Catch Finally
  • Calling .NET Methods
  • .NET API Browser

🏁 课后作业

  1. 创建一个名为 MathUtils 的模块,包含两个函数:Convert-Temperature(℃↔℉)和 Get-Factorial(阶乘,用递归或 .NET BigInteger)。
  2. 编写脚本:尝试读取一个受保护的系统文件(如 C:\Windows\System32\config\SAM),使用 try/catch 捕获 UnauthorizedAccessException 并友好提示。
  3. 使用 .NET 的 System.IO.Compression.ZipFile 类,编写一个函数 Compress-Folder,将指定文件夹压缩为 ZIP。
http://www.dtcms.com/a/602215.html

相关文章:

  • 哈尔滨模板建站软件asp flash网站模板
  • 江阴公司网站建设河北网络营销推广seo
  • C#9、默认访问修饰符
  • [AI tradingOS] 前端.ts | config.ts转发到后端
  • 凡客网上购物西安百度seo代理
  • MATLAB实现图像PCA降噪
  • 辽阳专业建设网站公司服务公司理念
  • 安卓进阶——RxJava
  • mobilenet v4 导出onnx onnx推理
  • 网站服务器如何维护网络广告案例
  • 奢侈品网站建设中车网站建设的优缺点
  • C/C++ Linux网络编程2 - Socket编程与简单UDP服务器客户端
  • 工业场景漏油硬件检测方法及原理
  • 工业设计就业网站在线优化工具
  • 瑞美吉泮Rimegepant说明书深度解析:用法用量,真实世界疗效
  • 做电影网站主机放哪比较好网站页面设计服务
  • 每日两题day41
  • 网站设计与开发期末考试题建筑模拟器2022下载
  • 访问日志查询功能
  • vite创建vue2项目
  • 【MATLAB例程】二维平面的TOA定位,几何精度因子GDOP和克拉美罗下界CRLB计算与输出
  • 怎么创一个网站赚钱免费入驻的外贸平台
  • 云边云科技SD-WAN解决方案 — 构建安全、高效、智能的云网基石
  • 20251112给荣品RD-RK3588开发板跑Rockchip的原厂Android13系统时适配AP6275P模块的BT蓝牙部分【使用原厂的DTS】
  • MyBatis 专题深度细化解析
  • a做爰视频免费观费网站asp网站如何迁移
  • 网站推广平台wordpress怎么加属性
  • 文创做的好的网站推荐微信公众号属于网站建设
  • 1. Cockpit 管理服务器;2. Linux 软件包管理
  • 【剑斩OFFER】算法的暴力美学——山脉数组的蜂顶索引