HoRain 云小助手个人主页⛺️生活的理想就是为了理想的生活!⛳️ 推荐前些天发现了一个超棒的服务器购买网站性价比超高大内存超划算忍不住分享一下给大家。点击跳转到网站。目录⛳️ 推荐 PowerShell 面向对象命令行完全指南1. PowerShell 对象基础1.1 一切都是对象1.2 基本对象操作1.3 .NET 对象集成2. 对象管道2.1 管道基础2.2 管道参数绑定2.3 高级管道技术3. 对象属性和方法3.1 访问属性和方法3.2 动态属性3.3 对象序列化4. 创建自定义对象4.1 各种创建方式4.2 带方法的对象4.3 类定义PowerShell 5.05. 对象筛选和排序5.1 Where-Object 筛选5.2 Sort-Object 排序5.3 Select-Object 选择6. 对象分组和统计6.1 Group-Object 分组6.2 Measure-Object 统计6.3 聚合操作7. 对象格式化和导出7.1 格式化视图7.2 导出到文件7.3 高级格式化8. 高级对象技术8.1 对象序列化和反序列化8.2 动态对象8.3 对象缓存和池9. 实用脚本和函数9.1 高级对象处理函数9.2 对象转换函数9.3 对象验证函数10. 最佳实践10.1 性能优化10.2 内存管理10.3 错误处理10.4 代码组织10.5 调试技巧 总结 PowerShell 面向对象命令行完全指南PowerShell 是建立在 .NET 框架上的强大命令行工具它的核心特性是面向对象的管道。让我们深入了解如何利用这一特性。# # 目录 # 1. PowerShell 对象基础 # 2. 对象管道 # 3. 对象属性和方法 # 4. 创建自定义对象 # 5. 对象筛选和排序 # 6. 对象分组和统计 # 7. 对象格式化和导出 # 8. 高级对象技术 # 9. 实用脚本和函数 # 10. 最佳实践 # 1. PowerShell 对象基础1.1 一切都是对象# 基本概念PowerShell 中所有东西都是对象 # 获取对象类型 $num 42 $num.GetType() $str Hello $str.GetType() $date Get-Date $date.GetType() # 查看对象的属性和方法 Get-Member -InputObject $date # 或使用别名 gm $date | Get-Member # 获取特定类型的成员 $date | Get-Member -MemberType Property $date | Get-Member -MemberType Method $date | Get-Member -MemberType PropertySet1.2 基本对象操作# 创建简单对象 $person [PSCustomObject]{ Name 张三 Age 30 City 北京 } # 访问属性 $person.Name $person.Age $person.City # 修改属性 $person.Age 31 $person.City 上海 # 添加新属性 Add-Member -InputObject $person -NotePropertyName Email -NotePropertyValue zhangsanexample.com $person | Add-Member -NotePropertyName Phone -NotePropertyValue 13800138000 # 查看所有属性 $person | Format-List * # 比较对象 $person1 [PSCustomObject]{Name张三; Age30} $person2 [PSCustomObject]{Name张三; Age30} $person3 [PSCustomObject]{Name李四; Age30} $person1 -eq $person2 # False - 不同对象实例 Compare-Object $person1 $person2 Compare-Object $person1 $person31.3 .NET 对象集成# 使用 .NET 类创建对象 # 创建 System.IO.DirectoryInfo 对象 $dir [System.IO.DirectoryInfo]::new(C:\Windows) $dir.FullName $dir.Exists $dir.CreationTime $dir.GetFiles() # 创建 DateTime 对象 $date [DateTime]::new(2024, 1, 1) $date.AddDays(30) $date.ToString(yyyy-MM-dd) # 使用 System.Collections $list [System.Collections.ArrayList]::new() $list.Add(Item1) $list.Add(Item2) $list.Remove(Item1) $list # 哈希表 $hash [System.Collections.Hashtable]::new() $hash[Name] 张三 $hash[Age] 30 $hash.Keys $hash.Values2. 对象管道2.1 管道基础# 管道传递对象而不是文本 Get-Process | Where-Object { $_.CPU -gt 100 } | Sort-Object CPU -Descending # 查看管道中的对象类型 Get-Process | Get-Member | Select-Object -First 5 # 管道中的对象转换 Get-ChildItem | ForEach-Object { [PSCustomObject]{ Name $_.Name Size $_.Length Type if ($_.PSIsContainer) { Folder } else { File } } }2.2 管道参数绑定# 通过管道传入参数 # 位置绑定 1..5 | ForEach-Object { $_ * 2 } # 属性名绑定 Get-Process | Select-Object Name, Id | Get-Member # 值绑定 Get-Service | Where-Object Status -eq Running # 脚本块绑定 Get-ChildItem | Where-Object { $_.Length -gt 1MB }2.3 高级管道技术# 管道输入处理 function Process-Files { [CmdletBinding()] param( [Parameter(ValueFromPipeline$true)] [System.IO.FileInfo[]]$InputObject ) begin { Write-Host 开始处理文件... -ForegroundColor Green $count 0 } process { foreach ($file in $InputObject) { $count Write-Progress -Activity 处理文件 -Status $($file.Name) -PercentComplete ($count / 10 * 100) [PSCustomObject]{ FileName $file.Name SizeKB [math]::Round($file.Length / 1KB, 2) LastModified $file.LastWriteTime } } } end { Write-Host 处理完成共 $count 个文件 -ForegroundColor Green } } # 使用 Get-ChildItem -File | Select-Object -First 10 | Process-Files3. 对象属性和方法3.1 访问属性和方法# 获取进程对象 $process Get-Process -Name powershell | Select-Object -First 1 # 访问属性 $process.Name $process.Id $process.CPU $process.WorkingSet # 调用方法 $process.Refresh() # 刷新进程信息 $process.Kill() # 终止进程危险 # 计算属性 $process | Select-Object Name, {NameMemoryMB; Expression{[math]::Round($_.WorkingSet / 1MB, 2)}} # 扩展属性 $process | Add-Member -MemberType ScriptProperty -Name MemoryGB -Value { [math]::Round($this.WorkingSet / 1GB, 2) } $process.MemoryGB3.2 动态属性# 创建带计算属性的对象 $services Get-Service | Select-Object -First 5 | ForEach-Object { [PSCustomObject]{ Name $_.Name Status $_.Status DisplayName $_.DisplayName CanStop $_.CanStop MemoryUsed (Get-Process -Name $_.Name -ErrorAction SilentlyContinue | Measure-Object WorkingSet -Sum).Sum MemoryMB if ($_.Name) { [math]::Round((Get-Process -Name $_.Name -ErrorAction SilentlyContinue | Measure-Object WorkingSet -Sum).Sum / 1MB, 2) } else { 0 } } } $services | Format-Table -AutoSize3.3 对象序列化# JSON 序列化 $person [PSCustomObject]{ Name 张三 Age 30 Skills (PowerShell, .NET, Python) Address [PSCustomObject]{ City 北京 Street 中关村大街 } } # 转换为 JSON $json $person | ConvertTo-Json -Depth 3 $json # 从 JSON 还原 $person2 $json | ConvertFrom-Json $person2.Name $person2.Address.City # XML 序列化 $xml $person | ConvertTo-Xml -NoTypeInformation $xml.OuterXml # CSV 序列化 $people ( [PSCustomObject]{Name张三; Age30; City北京} [PSCustomObject]{Name李四; Age25; City上海} [PSCustomObject]{Name王五; Age35; City广州} ) $csv $people | ConvertTo-Csv -NoTypeInformation $csv $people2 $csv | ConvertFrom-Csv4. 创建自定义对象4.1 各种创建方式# 方法1: PSObject $obj1 New-Object PSObject -Property { Name 张三 Age 30 City 北京 } # 方法2: PSCustomObject推荐 $obj2 [PSCustomObject]{ Name 李四 Age 25 City 上海 } # 方法3: 通过 Add-Member $obj3 New-Object PSObject $obj3 | Add-Member -MemberType NoteProperty -Name Name -Value 王五 $obj3 | Add-Member -MemberType NoteProperty -Name Age -Value 35 $obj3 | Add-Member -MemberType NoteProperty -Name City -Value 广州 # 方法4: 通过 Select-Object $obj4 | Select-Object Name, Age, City $obj4.Name 赵六 $obj4.Age 28 $obj4.City 深圳 # 比较性能 Measure-Command { 1..1000 | ForEach-Object { [PSCustomObject]{ID$_} } } Measure-Command { 1..1000 | ForEach-Object { New-Object PSObject -Property {ID$_} } }4.2 带方法的对象# 创建有方法的自定义对象 function New-Person { param( [string]$Name, [int]$Age, [string]$City ) $person [PSCustomObject]{ Name $Name Age $Age City $City } # 添加方法 $person | Add-Member -MemberType ScriptMethod -Name GetInfo -Value { return $($this.Name), $($this.Age)岁, 来自$($this.City) } $person | Add-Member -MemberType ScriptMethod -Name HaveBirthday -Value { $this.Age return 生日快乐现在$($this.Age)岁了 } $person | Add-Member -MemberType ScriptMethod -Name MoveTo -Value { param([string]$NewCity) $oldCity $this.City $this.City $NewCity return 从$oldCity 搬到了 $NewCity } return $person } # 使用 $person New-Person -Name 张三 -Age 30 -City 北京 $person.GetInfo() $person.HaveBirthday() $person.MoveTo(上海) $person.GetInfo()4.3 类定义PowerShell 5.0# 定义类 class Person { # 属性 [string]$Name [int]$Age [string]$City hidden [datetime]$Created (Get-Date) # 构造函数 Person([string]$Name, [int]$Age, [string]$City) { $this.Name $Name $this.Age $Age $this.City $City } # 默认构造函数 Person() { $this.Name 未命名 $this.Age 0 $this.City 未知 } # 方法 [string]GetInfo() { return $($this.Name), $($this.Age)岁, 来自$($this.City) } [void]HaveBirthday() { $this.Age } [string]MoveTo([string]$NewCity) { $oldCity $this.City $this.City $NewCity return 从$oldCity 搬到了 $NewCity } # 静态方法 static [Person]CreateDefault() { return [Person]::new(默认用户, 18, 默认城市) } # 重写 ToString() [string]ToString() { return $this.GetInfo() } } # 使用类 $person1 [Person]::new(张三, 30, 北京) $person1.GetInfo() $person1.HaveBirthday() $person1.MoveTo(上海) $person2 [Person]::CreateDefault() $person2.GetInfo() # 类型检查 $person1 -is [Person] $person1.GetType()5. 对象筛选和排序5.1 Where-Object 筛选# 基本筛选 Get-Process | Where-Object {$_.CPU -gt 100} Get-Service | Where-Object Status -eq Running Get-ChildItem | Where-Object Length -gt 1MB # 复杂条件 Get-Process | Where-Object { $_.CPU -gt 100 -and $_.WorkingSet -gt 100MB -and $_.Name -notmatch ^(svchost|dwm)$ } # 使用比较运算符 # -eq, -ne, -gt, -ge, -lt, -le, -like, -notlike, -match, -notmatch, -contains, -in Get-Service | Where-Object Name -like *sql* Get-Process | Where-Object Name -match ^power Get-ChildItem | Where-Object Extension -in (.txt, .log, .csv)5.2 Sort-Object 排序# 基本排序 Get-Process | Sort-Object CPU -Descending Get-ChildItem | Sort-Object Length -Descending Get-Service | Sort-Object Status, Name # 多重排序 Get-Process | Sort-Object {Expression{$_.CPU}; Descending$true}, {Expression{$_.WorkingSet}; Descending$true} # 自定义排序 Get-ChildItem | Sort-Object { Expression { switch ($_.Extension) { .exe { 1 } .dll { 2 } .txt { 3 } default { 4 } } } }5.3 Select-Object 选择# 选择特定属性 Get-Process | Select-Object Name, CPU, WorkingSet Get-ChildItem | Select-Object Name, Length, LastWriteTime # 计算属性 Get-Process | Select-Object Name, {NameCPUPercent; Expression{[math]::Round($_.CPU / 100, 2)}}, {NameMemoryMB; Expression{[math]::Round($_.WorkingSet / 1MB, 2)}} # 扩展属性 Get-Service | Select-Object Name, Status, {NameCanStopDisplay; Expression{if ($_.CanStop) {是} else {否}}} # 排除属性 Get-Process | Select-Object * -ExcludeProperty Modules, Threads # 唯一值 1,2,2,3,3,3,4,4,4,4 | Select-Object -Unique # 前N个/后N个 Get-Process | Sort-Object CPU -Descending | Select-Object -First 10 Get-ChildItem | Sort-Object Length | Select-Object -Last 5 # 跳过 Get-Process | Select-Object -Skip 5 -First 106. 对象分组和统计6.1 Group-Object 分组# 基本分组 Get-Process | Group-Object Company Get-Service | Group-Object Status Get-ChildItem | Group-Object Extension # 多重分组 Get-Process | Group-Object Company, {Expression{$_.CPU -gt 100}} # 计数 Get-Process | Group-Object Name | Select-Object Name, Count | Sort-Object Count -Descending # 复杂分组 Get-ChildItem | Group-Object { Expression { if ($_.Length -gt 1MB) { 大文件 } elseif ($_.Length -gt 100KB) { 中文件 } else { 小文件 } } } | Select-Object Name, Count, {Name总大小MB; Expression{[math]::Round(($_.Group | Measure-Object Length -Sum).Sum / 1MB, 2)}}6.2 Measure-Object 统计# 基本统计 Get-Process | Measure-Object WorkingSet -Sum -Average -Minimum -Maximum # 多个属性 Get-ChildItem | Measure-Object Length -Sum -Average -Minimum -Maximum # 分组统计 Get-Process | Group-Object Company | ForEach-Object { [PSCustomObject]{ 公司 $_.Name 进程数 $_.Count 总内存MB [math]::Round(($_.Group | Measure-Object WorkingSet -Sum).Sum / 1MB, 2) 平均内存MB [math]::Round(($_.Group | Measure-Object WorkingSet -Average).Average / 1MB, 2) 最大内存MB [math]::Round(($_.Group | Measure-Object WorkingSet -Maximum).Maximum / 1MB, 2) } } | Sort-Object 总内存MB -Descending6.3 聚合操作# 自定义聚合 function Get-ProcessSummary { $processes Get-Process [PSCustomObject]{ 总进程数 $processes.Count 运行中进程数 ($processes | Where-Object {$_.Responding}).Count 总内存MB [math]::Round(($processes | Measure-Object WorkingSet -Sum).Sum / 1MB, 2) 平均内存MB [math]::Round(($processes | Measure-Object WorkingSet -Average).Average / 1MB, 2) 最高CPU进程 $processes | Sort-Object CPU -Descending | Select-Object -First 1 | ForEach-Object { $($_.Name) ($($_.Id)): $($_.CPU)% } 最高内存进程 $processes | Sort-Object WorkingSet -Descending | Select-Object -First 1 | ForEach-Object { $($_.Name) ($($_.Id)): $([math]::Round($_.WorkingSet / 1MB, 2))MB } } } Get-ProcessSummary7. 对象格式化和导出7.1 格式化视图# Format-Table Get-Process | Select-Object -First 5 | Format-Table -AutoSize Get-Process | Select-Object -First 5 | Format-Table Name, CPU, {Label内存(MB); Expression{[math]::Round($_.WorkingSet/1MB,2)}; AlignRight} # 自定义列 $format { Expression Name Width 20 } $format2 { Expression {[math]::Round($_.WorkingSet/1MB,2)} Label 内存(MB) Width 10 Alignment Right } Get-Process | Select-Object -First 5 | Format-Table $format, $format2 # Format-List Get-Process | Select-Object -First 1 | Format-List * Get-Process | Select-Object -First 1 | Format-List Name, Id, {Label内存使用; Expression{ $([math]::Round($_.WorkingSet/1MB,2)) MB }} # Format-Wide Get-Process | Select-Object -First 20 | Format-Wide Name -Column 4 # Format-Custom Get-Process | Select-Object -First 1 | Format-Custom7.2 导出到文件# 导出为 CSV Get-Process | Select-Object Name, CPU, WorkingSet, StartTime | Export-Csv -Path processes.csv -NoTypeInformation -Encoding UTF8 # 导入 CSV $processes Import-Csv -Path processes.csv $processes | ForEach-Object { [PSCustomObject]{ Name $_.Name CPU [int]$_.CPU MemoryMB [math]::Round([int]$_.WorkingSet / 1MB, 2) StartTime [datetime]$_.StartTime } } # 导出为 JSON Get-Process | Select-Object -First 5 | ConvertTo-Json -Depth 2 | Out-File processes.json -Encoding UTF8 # 导入 JSON $data Get-Content processes.json | ConvertFrom-Json # 导出为 HTML Get-Process | Select-Object -First 10 | ConvertTo-Html -Title 进程列表 | Out-File processes.html7.3 高级格式化# 自定义格式文件 $format {{ Name 进程信息 Expression {{ \$($_.Name) (PID: $($_.Id))n CPU: {0:P2}n 内存: {1:N2} MBn 启动时间: {2} -f ($_.CPU/100), ($_.WorkingSet/1MB), $_.StartTime.ToString(yyyy-MM-dd HH:mm:ss) }} }} Get-Process | Select-Object -First 3 | Format-List ([scriptblock]::Create($format)) # 使用 here-string 创建复杂格式 $htmlTemplate style table { border-collapse: collapse; width: 100%; } th, td { border: 1px solid #ddd; padding: 8px; text-align: left; } th { background-color: #4CAF50; color: white; } tr:nth-child(even) { background-color: #f2f2f2; } tr:hover { background-color: #ddd; } /style h2进程列表/h2 table tr th名称/th thID/th thCPU(%)/th th内存(MB)/th th启动时间/th /tr $rows Get-Process | Select-Object -First 10 | ForEach-Object { $memoryMB [math]::Round($_.WorkingSet / 1MB, 2) $startTime if ($_.StartTime) { $_.StartTime.ToString(yyyy-MM-dd HH:mm:ss) } else { N/A } trtd$($_.Name)/tdtd$($_.Id)/tdtd$($_.CPU)/tdtd$memoryMB/tdtd$startTime/td/tr } $htmlTemplate ($rows -join n) /table | Out-File processes_custom.html8. 高级对象技术8.1 对象序列化和反序列化# 深度克隆对象 function DeepClone-Object { param($InputObject) $serialized [System.Management.Automation.PSSerializer]::Serialize($InputObject) return [System.Management.Automation.PSSerializer]::Deserialize($serialized) } # 使用 $original [PSCustomObject]{ Name 张三 Skills (PowerShell, .NET) Details [PSCustomObject]{ Age 30 City 北京 } } $clone DeepClone-Object $original $clone.Details.City 上海 Write-Host Original: $($original.Details.City) # 北京 Write-Host Clone: $($clone.Details.City) # 上海8.2 动态对象# 创建动态对象 $dynamicObject New-Object PSObject # 动态添加属性 1..5 | ForEach-Object { $dynamicObject | Add-Member -MemberType NoteProperty -Name Property$_ -Value Value$_ } # 动态添加方法 $dynamicObject | Add-Member -MemberType ScriptMethod -Name GetAllProperties -Value { $props {} $this.PSObject.Properties | ForEach-Object { $props[$_.Name] $_.Value } return $props } $dynamicObject.GetAllProperties() # ExpandoObject需要 .NET 4.0 Add-Type -TypeDefinition using System; using System.Dynamic; public static class ExpandoHelper { public static dynamic CreateExpando() { return new ExpandoObject(); } } $expando [ExpandoHelper]::CreateExpando() $expando.Name 动态对象 $expando.Count 42 $expando.GetInfo [Func[string]]{ return $($this.Name): $($this.Count) } $expando.GetInfo()8.3 对象缓存和池# 对象池模式 class ObjectPool { [System.Collections.Generic.Queue[object]]$Available [System.Collections.Generic.List[object]]$InUse [scriptblock]$CreateObject ObjectPool([scriptblock]$CreateObject, [int]$InitialSize) { $this.Available [System.Collections.Generic.Queue[object]]::new() $this.InUse [System.Collections.Generic.List[object]]::new() $this.CreateObject $CreateObject 1..$InitialSize | ForEach-Object { $this.Available.Enqueue( $CreateObject) } } [object]Acquire() { if ($this.Available.Count -eq 0) { $this.Available.Enqueue( $this.CreateObject) } $obj $this.Available.Dequeue() $this.InUse.Add($obj) return $obj } [void]Release([object]$obj) { $this.InUse.Remove($obj) $this.Available.Enqueue($obj) } [int]GetAvailableCount() { return $this.Available.Count } [int]GetInUseCount() { return $this.InUse.Count } } # 使用对象池 $pool [ObjectPool]::new({ [PSCustomObject]{ Id [Guid]::NewGuid() Created Get-Date Data $null } }, 5) # 获取对象 $obj1 $pool.Acquire() $obj1.Data 数据1 $obj2 $pool.Acquire() $obj2.Data 数据2 Write-Host 使用中: $($pool.GetInUseCount()) Write-Host 可用: $($pool.GetAvailableCount()) # 释放对象 $pool.Release($obj1) $pool.Release($obj2)9. 实用脚本和函数9.1 高级对象处理函数# 对象合并函数 function Merge-Objects { [CmdletBinding()] param( [Parameter(Mandatory$true, ValueFromPipeline$true)] [object[]]$InputObject, [Parameter(Mandatory$true)] [string]$Property, [Parameter(Mandatory$false)] [string[]]$MergeProperties ) begin { $hash {} } process { foreach ($item in $InputObject) { $key $item.$Property if (-not $hash.ContainsKey($key)) { $hash[$key] $item } else { foreach ($mergeProp in $MergeProperties) { if ($item.$mergeProp -is [array]) { $hash[$key].$mergeProp $item.$mergeProp } else { $hash[$key].$mergeProp $item.$mergeProp } } } } } end { $hash.Values } } # 使用 $data1 ( [PSCustomObject]{ID1; Name张三; Projects(A)} [PSCustomObject]{ID2; Name李四; Projects(B)} ) $data2 ( [PSCustomObject]{ID1; Name张三; Projects(C)} [PSCustomObject]{ID3; Name王五; Projects(D)} ) $data1 $data2 | Merge-Objects -Property ID -MergeProperties Projects9.2 对象转换函数function ConvertTo-Hashtable { [CmdletBinding()] param( [Parameter(Mandatory$true, ValueFromPipeline$true)] [object]$InputObject ) process { $hash {} $InputObject.PSObject.Properties | ForEach-Object { $hash[$_.Name] $_.Value } return $hash } } function ConvertFrom-Hashtable { [CmdletBinding()] param( [Parameter(Mandatory$true)] [hashtable]$Hashtable ) $obj [PSCustomObject]{} $Hashtable.GetEnumerator() | ForEach-Object { $obj | Add-Member -MemberType NoteProperty -Name $_.Key -Value $_.Value } return $obj } # 使用 $person [PSCustomObject]{Name张三; City北京} $hash $person | ConvertTo-Hashtable $hash[Age] 30 $person2 ConvertFrom-Hashtable -Hashtable $hash9.3 对象验证函数function Test-ObjectProperty { [CmdletBinding()] param( [Parameter(Mandatory$true, ValueFromPipeline$true)] [object]$InputObject, [Parameter(Mandatory$true)] [string]$Property, [Parameter(Mandatory$false)] [ValidateSet(String, Int, DateTime, Array, Hashtable)] [string]$Type, [Parameter(Mandatory$false)] [scriptblock]$ValidationScript ) process { $result [PSCustomObject]{ Object $InputObject Property $Property Exists $false HasValue $false TypeMatch $false Valid $false Value $null } # 检查属性是否存在 if ($InputObject.PSObject.Properties[$Property]) { $result.Exists $true $result.Value $InputObject.$Property # 检查是否有值 if ($null -ne $result.Value) { $result.HasValue $true # 检查类型 if ($Type) { $expectedType switch ($Type) { String { [string] } Int { [int] } DateTime { [datetime] } Array { [array] } Hashtable{ [hashtable] } default { $null } } if ($expectedType -and $result.Value -is $expectedType) { $result.TypeMatch $true } } else { $result.TypeMatch $true } # 运行验证脚本 if ($ValidationScript) { $result.Valid $ValidationScript $result.Value } else { $result.Valid $true } } } return $result } } # 使用 $testObject [PSCustomObject]{ Name 张三 Age 30 Email zhangsanexample.com BirthDate (Get-Date).AddYears(-30) Tags (员工, 开发) } $testObject | Test-ObjectProperty -Property Name -Type String $testObject | Test-ObjectProperty -Property Age -Type Int -ValidationScript { param($v) $v -ge 0 -and $v -le 150 } $testObject | Test-ObjectProperty -Property Email -ValidationScript { param($v) $v -match }10. 最佳实践10.1 性能优化# 1. 使用 .Where() 和 .ForEach() 方法PowerShell 4.0 # 比 Where-Object 和 ForEach-Object 更快 $processes Get-Process $highCpu $processes.Where({$_.CPU -gt 100}) $highCpu.ForEach({$_.Name}) # 2. 避免重复获取对象 # 不好 Get-Process | Where-Object {$_.CPU -gt 100} | ForEach-Object { $_.Name } Get-Process | Where-Object {$_.CPU -gt 100} | ForEach-Object { $_.Id } # 好 $highCpu Get-Process | Where-Object {$_.CPU -gt 100} $highCpu | ForEach-Object { $_.Name } $highCpu | ForEach-Object { $_.Id } # 3. 使用哈希表进行快速查找 $processHash {} Get-Process | ForEach-Object { $processHash[$_.Id] $_ } # 快速访问 $processHash[1234] # 通过ID获取进程 # 4. 批量操作 # 不好 1..1000 | ForEach-Object { [PSCustomObject]{Number $_} } # 好 $numbers foreach ($i in 1..1000) { [PSCustomObject]{Number $i} }10.2 内存管理# 1. 及时释放大对象 $largeData Get-Content largefile.txt # 处理数据... $largeData $null [System.GC]::Collect() # 2. 使用流式处理大文件 # 不好一次性加载到内存 $content Get-Content largefile.txt # 好逐行处理 Get-Content largefile.txt | ForEach-Object { # 处理每一行 } # 更好使用 .NET StreamReader $reader [System.IO.StreamReader]::new(largefile.txt) try { while (-not $reader.EndOfStream) { $line $reader.ReadLine() # 处理每一行 } } finally { $reader.Close() $reader.Dispose() } # 3. 避免管道中的中间变量 # 不好 $processes Get-Process $filtered $processes | Where-Object {$_.CPU -gt 100} $sorted $filtered | Sort-Object CPU -Descending $result $sorted | Select-Object -First 10 # 好 $result Get-Process | Where-Object {$_.CPU -gt 100} | Sort-Object CPU -Descending | Select-Object -First 1010.3 错误处理# 1. 对象属性访问错误处理 try { $result $object.SomeProperty } catch [System.Management.Automation.PropertyNotFoundException] { Write-Warning 属性不存在 $result $null } catch { Write-Error 未知错误: $_ } # 2. 安全的方法调用 if ($object.SomeMethod) { $result $object.SomeMethod() } else { Write-Warning 方法不存在 } # 3. 使用默认值 $value $object.PropertyWithDefault -replace $null, 默认值 # 4. 验证对象结构 function Test-ObjectStructure { param( [Parameter(Mandatory$true)] [object]$Object, [Parameter(Mandatory$true)] [string[]]$RequiredProperties ) foreach ($prop in $RequiredProperties) { if (-not $Object.PSObject.Properties[$prop]) { throw 缺少必需属性: $prop } if ($null -eq $Object.$prop) { Write-Warning 属性 $prop 的值为 null } } return $true }10.4 代码组织# 1. 使用模块组织对象相关功能 # Person.psm1 class Person { [string]$Name [int]$Age Person([string]$Name, [int]$Age) { $this.Name $Name $this.Age $Age } [string]ToString() { return $($this.Name) ($($this.Age)岁) } } function Get-PersonInfo { [CmdletBinding()] param( [Parameter(Mandatory$true)] [Person]$Person ) [PSCustomObject]{ Name $Person.Name Age $Person.Age Info $Person.ToString() } } # 导出 Export-ModuleMember -Function Get-PersonInfo # 2. 使用配置文件 $config [PSCustomObject]{ Database [PSCustomObject]{ Server localhost Database TestDB Credential Get-Credential } Logging [PSCustomObject]{ Level Info Path C:\Logs } } # 保存配置 $config | Export-Clixml config.xml # 加载配置 $loadedConfig Import-Clixml config.xml10.5 调试技巧# 1. 查看对象详细信息 Get-Process | Select-Object -First 1 | Format-List * Get-Process | Select-Object -First 1 | Get-Member Get-Process | Select-Object -First 1 | ConvertTo-Json -Depth 3 # 2. 调试对象管道 # 使用 Tee-Object 检查中间结果 Get-Process | Where-Object {$_.CPU -gt 100} | Tee-Object -Variable highCpu | Sort-Object CPU -Descending # 查看中间结果 $highCpu | Format-Table # 3. 测量对象处理性能 Measure-Command { Get-Process | Where-Object {$_.CPU -gt 100} | Sort-Object CPU -Descending | Select-Object -First 10 } # 4. 使用 PSCustomObject 调试 function Debug-Object { param( [Parameter(ValueFromPipeline$true)] [object]$InputObject, [string]$Label ) process { Write-Host $Label -ForegroundColor Yellow Write-Host 类型: $($InputObject.GetType().FullName) -ForegroundColor Cyan Write-Host 值: -NoNewline $InputObject Write-Host return $InputObject } } # 使用 Get-Process | Select-Object -First 1 | Debug-Object -Label 原始对象 | Select-Object Name, CPU | Debug-Object -Label 选择后 总结PowerShell 的面向对象特性使其成为一个极其强大的工具。记住这些关键点一切都是对象​ - PowerShell 处理的是 .NET 对象而不是文本管道传递对象​ - 命令之间传递完整的对象保留所有属性和方法丰富的对象操作​ - Select-Object、Where-Object、Sort-Object 等强大的格式化​ - Format-* 命令控制显示Export-* 命令控制输出.NET 集成​ - 可以直接使用 .NET 框架中的所有类类型系统​ - 强类型和动态类型的完美结合通过掌握这些面向对象技术你可以编写更强大、更灵活、更可维护的 PowerShell 脚本。❤️❤️❤️本人水平有限如有纰漏欢迎各位大佬评论批评指正如果觉得这篇文对你有帮助的话也请给个点赞、收藏下吧非常感谢! Stay Hungry Stay Foolish 道阻且长,行则将至,让我们一起加油吧