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

第22章笔记|把“可传参脚本”打磨成“高级好用的工具”

第22章笔记|把“可传参脚本”打磨成“高级好用的工具”

这章的核心:把一个能跑的脚本,升级成“可传参、可校验、可提示、可静默/可啰嗦、可二次加工输出”的高级脚本。关键只需几步:用对象做输出、用 param 声明参数、用 [CmdletBinding()] 开启高级特性,再加上参数校验与 Write-Verbose 友好提示。


一、为什么先用 Select-Object 而不是 Format-Table

  • Format-Table 只为“眼睛”服务,输出是文本,难以再加工。

  • Select-Object 输出对象,后续能随手:

    • … | Format-Table 随看随排版
    • … | Export-Csv 直接导出报表
    • … | ConvertTo-Json 进系统对接

结论:脚本本体输出对象,把“长相”(格式化)留给调用者。


二、起点脚本(对象化输出)

<#
.SYNOPSIS
Get-DiskInventory:获取一台或多台计算机的逻辑磁盘信息。
.DESCRIPTION
使用 WMI 的 Win32_LogicalDisk,返回盘符、可用空间、总大小、可用率等对象属性。
.PARAMETER ComputerName
要查询的计算机名(可多个)。默认 localhost。
.PARAMETER DriveType
驱动器类型。参见 Win32_LogicalDisk 文档;3=本地磁盘(默认)。
.EXAMPLE
.\Get-DiskInventory.ps1 -ComputerName SERVER-R2 -DriveType 3
#>
param($ComputerName = 'localhost',$DriveType    = 3
)Get-WmiObject -Class Win32_LogicalDisk -ComputerName $ComputerName -Filter "DriveType=$DriveType" |Sort-Object DeviceID |Select-Object DeviceID,@{Name='FreeSpace(MB)'; Expression = { [int]($_.FreeSpace/1MB) }},@{Name='Size(GB)';     Expression = { [int]($_.Size/1GB) }},@{Name='%Free';        Expression = { [int](($_.FreeSpace/$_.Size)*100) }}

三、加一行,变“高级脚本”

在脚本最前面加上:

[CmdletBinding()]

效果立显:

  • 获得通用参数:-Verbose-ErrorAction-WhatIf 等(视脚本逻辑而定)
  • Write-Verbose 等流被正确管理
  • 更接近 Cmdlet 的体验

四、把参数做“对”:强制输入 + 类型约束 + 别名 + 校验

  1. 强制输入(用户不提供就提示)
[CmdletBinding()]
param([Parameter(Mandatory=$true)][string] $ComputerName,[int]    $DriveType = 3
)
  1. 友好提示(某些宿主会显示)
[Parameter(Mandatory=$true, HelpMessage='请输入要查询的计算机名')]
[string] $ComputerName
  1. 参数别名(照顾使用习惯)
[Alias('HostName')]
[string] $ComputerName
  1. 限定可选值(防错最有效)
[ValidateSet(2,3)]  # 2=可移动盘, 3=本地盘
[int] $DriveType = 3
  1. 更多常用校验(按需选用)
  • [ValidateRange(1,100)]
  • [ValidatePattern('^\w+$')]
  • [ValidateNotNullOrEmpty()]
  • [ValidateScript({ Test-Connection $_ -Count 1 -Quiet })]

五、让脚本“会说话”:Write-Verbose

Write-Verbose "正在查询 $ComputerName 的磁盘清单(DriveType=$DriveType)"
# …执行查询…
Write-Verbose "查询完成"

调用时:

  • 静默:.\Get-DiskInventory.ps1 -ComputerName SRV1
  • 啰嗦:.\Get-DiskInventory.ps1 -ComputerName SRV1 -Verbose

六、整合后的“高质量可传参脚本”

<#
.SYNOPSIS
获取逻辑磁盘清单(对象输出)。
.DESCRIPTION
查询 Win32_LogicalDisk,返回盘符、可用空间、总大小与可用率;输出为对象,便于二次处理。
.PARAMETER ComputerName
目标计算机名(可单值/数组)。必填。
.PARAMETER DriveType
驱动器类型,仅支持 2(可移动)、3(本地)。默认 3。
.EXAMPLE
.\Get-DiskInventory.ps1 -ComputerName SERVER-R2 -DriveType 3 | Format-Table
.EXAMPLE
.\Get-DiskInventory.ps1 -ComputerName web1,web2 -Verbose | Export-Csv disks.csv -NoTypeInformation
#>
[CmdletBinding()]
param([Parameter(Mandatory=$true, HelpMessage='请输入要查询的计算机名')][Alias('HostName')][string[]] $ComputerName,[ValidateSet(2,3)][int] $DriveType = 3
)foreach ($comp in $ComputerName) {Write-Verbose "[$comp] 开始查询(DriveType=$DriveType)"Get-WmiObject -Class Win32_LogicalDisk -ComputerName $comp -Filter "DriveType=$DriveType" |Sort-Object DeviceID |Select-Object @{Name='ComputerName'; Expression={ $comp }},DeviceID,@{Name='FreeSpace(MB)'; Expression = { [int]($_.FreeSpace/1MB) }},@{Name='Size(GB)';     Expression = { [int]($_.Size/1GB) }},@{Name='%Free';        Expression = { [int]([math]::Round(($_.FreeSpace/$_.Size)*100,0)) }}Write-Verbose "[$comp] 查询完成"
}

七、使用示例(对象先行,随取随用)

  • 只看表格:
    .\Get-DiskInventory.ps1 -ComputerName SRV1 -Verbose | Format-Table
  • 导成 CSV 报表:
    .\Get-DiskInventory.ps1 -ComputerName SRV1,SRV2 | Export-Csv disks.csv -NoTypeInformation
  • 过滤出可用率低于 15% 的盘:
    .\Get-DiskInventory.ps1 -ComputerName SRV1 | Where-Object { $_.'%Free' -lt 15 }

八、最佳实践清单

  • 输出对象而非文本;格式化交给调用者

  • 参数都放在 param(),并尽量:

    • 强制必须的参数(Mandatory)
    • 明确类型
    • 加别名(Alias)与验证(Validate*)
  • 在脚本头写好基于注释的帮助(SYNOPSIS/DESCRIPTION/PARAMETER/EXAMPLE)

  • 加上 [CmdletBinding()],无成本获得 -Verbose/-ErrorAction

  • 复杂表达式用 @{Name=;Expression= { … }} 计算属性

  • 批量目标时返回带 ComputerName 字段的对象,便于后续筛选/聚合


九、课堂练习参考:Get-PhysicalAdapters.ps1

把第 12 章命令参数化、做成高级脚本,并加上 Verbose:

<#
.SYNOPSIS
获取物理网卡清单。
.DESCRIPTION
列出 Win32_NetworkAdapter 中 PhysicalAdapter 为 True 的适配器,输出对象便于导出。
.PARAMETER ComputerName
必填,计算机名或数组。别名 HostName。
.EXAMPLE
.\Get-PhysicalAdapters.ps1 -ComputerName SERVER01 -Verbose
#>
[CmdletBinding()]
param([Parameter(Mandatory=$true, HelpMessage='请输入要查询的计算机名')][Alias('HostName')][string[]] $ComputerName
)foreach ($comp in $ComputerName) {Write-Verbose "[$comp] 开始获取物理网卡"Get-WmiObject -Class Win32_NetworkAdapter -ComputerName $comp |Where-Object { $_.PhysicalAdapter } |Select-Object @{Name='ComputerName';Expression={$comp}},MACAddress, AdapterType, DeviceID, Name, SpeedWrite-Verbose "[$comp] 获取完成"
}

十、一页速查:把命令升级为“高级可传参脚本”的 8 步

  1. 把命令跑通,先写在 ISE/VS Code 里
  2. 改为对象输出Select-Object 计算属性)
  3. 补上注释式帮助
  4. 顶部加 [CmdletBinding()]
  5. param() 声明参数(类型、默认值)
  6. 必要参数加 Mandatory,易错参数加 Validate*,顺手加 Alias
  7. 关键阶段写 Write-Verbose
  8. -VerboseExport-CsvFormat-Table 验收调用体验
http://www.dtcms.com/a/357776.html

相关文章:

  • 博客系统测试实战:功能和性能的全面解析
  • selenium自动下载更新浏览器对应的webdriver
  • 关于shell命令的扩展
  • log4jshell CVE-2021-44228 复现
  • R1 快开门式压力容器操作证考试大纲解读:重点模块与考核标准
  • Linux Shell 编程
  • 淘宝商品评论接口技术实现:从评论获取到情感分析全流程方案
  • SQL知识
  • 序列容器(vector,deque,list)
  • 4x12G-SDI(四链接12G-SDI)
  • PCIe 6.0 TLP结构解析:深入理解事务层数据包的设计与实现
  • Windows Command Line Windows 命令行
  • 【RAG Agent实战】告别“单线程”RAG:用查询理解与LangGraph构建能处理复杂意图的高级代理
  • ros2--action/动作--接口
  • 2024年12月 Python(四级)真题解析#中国电子学会#全国青少年软件编程等级考试
  • 中科米堆CASAIM五金配件三维扫描测量尺寸形位公差
  • MySQL 中如果发生死锁应该如何解决?
  • OpenAI宣布正式推出Realtime API
  • ADC模数转换
  • Set和Map
  • AI的“科学革命”:Karpathy吹响号角,从“经院哲学”走向“实验科学”
  • 【.net core】【NPOI】读取表格信息(处理合并行表格数据)
  • vscode里面可以批量放弃更改
  • Linux驱动异步通知机制详解
  • Labview邪修01:贪吃蛇
  • 【完整源码+数据集+部署教程】控制台缺陷检测系统源码和数据集:改进yolo11-repvit
  • IDEA编译报错:Error:(3, 28) java: 程序包com.alibaba.fastjson不存在
  • GPFS性能优化
  • zyplayer-doc:AI 驱动的智能知识库
  • LeetCode力扣-hot100系列(2)