PowerShell扩展与帮助系统全解析
立即解锁
发布时间: 2025-08-26 01:43:38 阅读量: 5 订阅数: 19 

# PowerShell 扩展与帮助系统全解析
## 一、PowerShell 类型系统扩展
### 1.1 自定义对象创建脚本库
在 PowerShell 中,我们可以借助自定义的脚本库 `Classes-SupportLib.ps1` 更便捷地创建自定义对象。以下是该脚本库的完整代码:
```powershell
function Define-Class($constructor)
{
$class = New-Object PSObject
$class | Add-Member NoteProperty Constructor $constructor
$class | Add-Member ScriptMethod Create {
$instance = New-Object PSObject
$constructorBlock = $this.Constructor
$this = $instance
& $constructorBlock
return $instance
}
return $class
}
function Add-Field($Name, $Value)
{
$this | Add-Member NoteProperty $Name $Value
}
function Add-Property($Name, $Getter, $Setter)
{
$this | Add-Member ScriptProperty $Name $Getter $Setter
}
function Add-Method($Name, $Body)
{
$this | Add-Member ScriptMethod $Name $Body
}
```
有了这个脚本库,我们能在其他脚本中引入它,进而生成自定义对象集合,这会让脚本调用者使用起来更加得心应手。
### 1.2 为类的所有实例添加成员
`Add-Member` 命令虽然强大,但它只能修改单个对象,无法为同一类型的所有对象定义通用属性。PowerShell 通过 `types.ps1xml` 文件来实现为指定类型的所有对象定义扩展方法和属性。该文件通常位于 `C:\Windows\System32\WindowsPowerShell\v1.0` 目录下。
例如,在该文件中搜索 `System.Diagnostics.Process`,可以找到如下配置:
```xml
<Type>
<Name>System.Diagnostics.Process</Name>
<Members>
...
<AliasProperty>
<Name>NPM</Name>
<ReferencedMemberName>NonpagedSystemMemorySize</ReferencedMemberName>
</AliasProperty>
<ScriptProperty>
<Name>Path</Name>
<GetScriptBlock>$this.Mainmodule.FileName</GetScriptBlock>
</ScriptProperty>
...
</Members>
</Type>
```
PowerShell 在启动时会处理这个文件并更新类型数据,新创建的 `PSObject` 实例会从这些类型数据中获取成员列表。
### 1.3 添加文件安全相关属性
在实际应用中,我们常常需要获取文件的安全相关信息,如文件所有者、所属组以及访问规则。为了避免直接修改 `types.ps1xml` 文件带来的问题(如难以维护和缺乏可移植性),我们可以将类型配置数据添加到一个单独的文件中,然后使用 `Update-TypeData` 命令更新 shell 类型配置。
以下是 `FileSecurity.ps1xml` 文件的内容:
```xml
<Types>
<Type>
<Name>System.IO.FileInfo</Name>
<Members>
<PropertySet>
<Name>FileSecurity</Name>
<ReferencedProperties>
<Name>Name</Name>
<Name>Owner</Name>
<Name>Group</Name>
<Name>AccessRules</Name>
</ReferencedProperties>
</PropertySet>
<ScriptProperty>
<Name>Owner</Name>
<GetScriptBlock>
(Get-Acl $this).Owner
</GetScriptBlock>
</ScriptProperty>
<ScriptProperty>
<Name>Group</Name>
<GetScriptBlock>
(Get-Acl $this).Group
</GetScriptBlock>
</ScriptProperty>
<ScriptProperty>
<Name>AccessRules</Name>
<GetScriptBlock>
(Get-Acl $this).AccessToString
</GetScriptBlock>
</ScriptProperty>
</Members>
</Type>
</Types>
```
其中,`PropertySet` 元素并非必需,但它可以作为一个快捷方式,方便我们一次性获取所有相关属性。
操作步骤如下:
1. 使用 `Update-TypeData` 命令更新类型配置:
```powershell
PS> Update-TypeData -PrependPath .\FileSecurity.ps1xml
```
2. 获取文件的安全属性:
```powershell
PS> (dir .\FileSecurity.ps1xml).Owner
NULL\Hristo
PS> (dir .\FileSecurity.ps1xml).Group
NULL\None
PS> (dir .\FileSecurity.ps1xml).AccessRules
BUILTIN\Administrators Allow FullControl
NT AUTHORITY\SYSTEM Allow FullControl
NT AUTHORITY\Authenticated Users Allow Modify, Synchronize
BUILTIN\Users Allow ReadAndExecute, Synchronize
```
需要注意的是,类型配置在重启 shell 会话前一直有效。如果想在所有会话中都能使用这些属性,可以将 `Update-TypeData` 命令添加到 shell 配置文件中。
### 1.4 使用属性集获取多个属性
属性集是一种方便的方式,可用于一次性引用多个属性。我们可以使用 `select` 命令并传入属性集名称来获取安全相关属性的视图:
```powershell
PS> dir person* | select FileSecurity
Name Owner Group AccessRules
---- ----- ----- -----------
Person-All.ps1 NULL\Hristo NULL\None BUILTIN\Admin...
Person-Define.ps1 NULL\Hristo NULL\None BUILTIN\Admin...
Person-NotePro... NULL\Hristo NULL\None BUILTIN\Admin...
```
### 1.5 类型系统扩展流程总结
```mermaid
graph LR
A[创建自定义脚本库] --> B[利用脚本库创建对象集合]
B --> C[了解 Add - Member 局限性]
C --> D[查找 types.ps1xml 文件]
D --> E[配置类型扩展]
E --> F[创建单独配置文件]
F --> G[使用 Update - TypeData 更新配置]
G --> H[使用属性集获取属性]
```
## 二、PowerShell 对象格式化扩展
### 2.1 对象格式化概述
PowerShell 命令处理和输出的都是对象,但在某些情况下,需要将对象转换为文本以便显示或写入文件,这就是对象格式化。PowerShell 引入了对象视图的概念,有表格、列表、宽列表和自定义等多种视图类型,并且每个类型都有默认视图。
### 2.2 不同视图类型展示
- **默认视图(表格视图)**:
```powershell
PS> dir *.ps1
Directory: Microsoft.PowerShell.Core\FileSystem::Z:\12 - Extending
the Type System
Mode LastWriteTime Length Name
---- ------------- ------ ----
-a--- 12/10/2007 7:07 PM 693 Classes-SupportLib.ps1
-a--- 12/10/2007 7:38 PM 829 Person-All.ps
```
0
0
复制全文
相关推荐










