[玩转系统] 创建您自己的 PowerShell 命令
作者:精品下载站 日期:2024-12-14 07:43:43 浏览:14 分类:玩电脑
创建您自己的 PowerShell 命令
除了节省大量输入之外,优点是通过使用代理函数,您可以利用包装的 cmdlet 的功能和参数。但也许看一个例子会有所帮助。将 Get-CommandMetadata 函数加载到 PowerShell ISE 后,我运行以下命令:
get-commandmetadata get-ciminstance -NoHelp -NewName Get-CimOS
我将不使用 CDXML 或编写自己的函数来调用 Get-Cimstance,而是创建一个旨在检索操作系统信息的 Get-Ciminstance 代理。这就是我的开始。
#requires -version 4.0
Function Get-CimOS {
[CmdletBinding(DefaultParameterSetName='ClassNameComputerSet')]
param(
[Parameter(ParameterSetName='QuerySessionSet', Mandatory=$true, ValueFromPipeline=$true)]
[Parameter(ParameterSetName='CimInstanceSessionSet', Mandatory=$true, ValueFromPipeline=$true)]
[Parameter(ParameterSetName='ClassNameSessionSet', Mandatory=$true, ValueFromPipeline=$true)]
[Parameter(ParameterSetName='ResourceUriSessionSet', Mandatory=$true, ValueFromPipeline=$true)]
[Microsoft.Management.Infrastructure.CimSession[]]
$CimSession,
[Parameter(ParameterSetName='ClassNameSessionSet', Mandatory=$true, Position=0, ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ClassNameComputerSet', Mandatory=$true, Position=0, ValueFromPipelineByPropertyName=$true)]
[string]
$ClassName,
[Parameter(ParameterSetName='CimInstanceSessionSet')]
[Parameter(ParameterSetName='CimInstanceComputerSet')]
[Parameter(ParameterSetName='QuerySessionSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='QueryComputerSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ResourceUriSessionSet', Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ResourceUriComputerSet', Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
[uri]
$ResourceUri,
[Parameter(ParameterSetName='QueryComputerSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ResourceUriComputerSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='CimInstanceComputerSet')]
[Parameter(ParameterSetName='ClassNameComputerSet', ValueFromPipelineByPropertyName=$true)]
[Alias('CN','ServerName')]
[string[]]
$ComputerName,
[Parameter(ParameterSetName='ResourceUriSessionSet')]
[Parameter(ParameterSetName='ClassNameSessionSet')]
[Parameter(ParameterSetName='ResourceUriComputerSet')]
[Parameter(ParameterSetName='ClassNameComputerSet')]
[switch]
$KeyOnly,
[Parameter(ParameterSetName='ClassNameSessionSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ResourceUriComputerSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='QuerySessionSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ClassNameComputerSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='QueryComputerSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ResourceUriSessionSet', ValueFromPipelineByPropertyName=$true)]
[string]
$Namespace,
[Alias('OT')]
[uint32]
$OperationTimeoutSec,
[Parameter(ParameterSetName='CimInstanceComputerSet', Mandatory=$true, Position=0, ValueFromPipeline=$true)]
[Parameter(ParameterSetName='CimInstanceSessionSet', Mandatory=$true, Position=0, ValueFromPipeline=$true)]
[Alias('CimInstance')]
[ciminstance]
$InputObject,
[Parameter(ParameterSetName='QueryComputerSet', Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='QuerySessionSet', Mandatory=$true, ValueFromPipelineByPropertyName=$true)]
[string]
$Query,
[Parameter(ParameterSetName='QueryComputerSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='QuerySessionSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ClassNameSessionSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ClassNameComputerSet', ValueFromPipelineByPropertyName=$true)]
[string]
$QueryDialect,
[Parameter(ParameterSetName='ResourceUriSessionSet')]
[Parameter(ParameterSetName='QueryComputerSet')]
[Parameter(ParameterSetName='QuerySessionSet')]
[Parameter(ParameterSetName='ResourceUriComputerSet')]
[Parameter(ParameterSetName='ClassNameComputerSet')]
[Parameter(ParameterSetName='ClassNameSessionSet')]
[switch]
$Shallow,
[Parameter(ParameterSetName='ClassNameSessionSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ClassNameComputerSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ResourceUriSessionSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ResourceUriComputerSet', ValueFromPipelineByPropertyName=$true)]
[string]
$Filter,
[Parameter(ParameterSetName='ClassNameComputerSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ResourceUriComputerSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ClassNameSessionSet', ValueFromPipelineByPropertyName=$true)]
[Parameter(ParameterSetName='ResourceUriSessionSet', ValueFromPipelineByPropertyName=$true)]
[Alias('SelectProperties')]
[string[]]
$Property)
begin
{
try {
$outBuffer = $null
if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
{
$PSBoundParameters['OutBuffer'] = 1
}
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Get-CimInstance', [System.Management.Automation.CommandTypes]::Cmdlet)
$scriptCmd = {& $wrappedCmd @PSBoundParameters }
$steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
$steppablePipeline.Begin($PSCmdlet)
} catch {
throw
}
}
process
{
try {
$steppablePipeline.Process($_)
} catch {
throw
}
}
end
{
try {
$steppablePipeline.End()
} catch {
throw
}
}
<#
.Synopsis
PUT SYNTAX HERE
.Description
PUT DESCRIPTION HERE
.Notes
Created: 9/8/2014
.Example
PS C:\> Get-CimOS
.Link
Get-CimInstance
#>
} #end function Get-CimOS
与任何 PowerShell 脚本项目一样,您必须考虑谁将运行您的命令以及他们可能有什么期望。在我的示例中,我只是希望能够指定计算机名称或 CIM 会话并从 Win32_Operatingsystem 类检索信息。因此,首先我可以删除除 Computername 和 CIMSession 之外的所有参数定义。我还将保留 OperationTimeOut 参数以防万一。正如您在代码示例中看到的,Get-CimInstance 还具有许多参数集。同样,我可以删除对我不打算使用的引用。
这是我修改后的参数定义。
[CmdletBinding(DefaultParameterSetName='ClassNameComputerSet')]
param(
[Parameter(Position=0,ParameterSetName='CimInstanceSessionSet', Mandatory=$true, ValueFromPipeline=$true)]
[Microsoft.Management.Infrastructure.CimSession[]]$CimSession,
[Parameter(Position=0,ParameterSetName='ClassNameComputerSet', ValueFromPipelineByPropertyName=$true)]
[Alias('CN','ServerName')]
[string[]]$ComputerName = $env:Computername,
[Alias('OT')]
[uint32]$OperationTimeoutSec
)
我所做的一项更改是为本地计算机指定计算机名的默认值。我这样做是为了让 PSComputername 属性始终有一个值。
PS C:\> get-ciminstance win32_bios | select name,pscomputername
name PSComputerName
---- --------------
76CN38WW
PS C:\> get-ciminstance win32_bios -comp $env:computername | select name,pscomputername
name PSComputerName
---- --------------
76CN38WW WIN81-ENT-01
但您可能想知道,类名怎么样?这就是乐趣的开始。我将把其他参数硬编码到函数中。
#Add hard-coded parameters
$PSBoundParameters.Add("Classname","win32_operatingsystem")
$PSBoundParameters.Add("Namespace","root\cimv2")
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Get-CimInstance', [System.Management.Automation.CommandTypes]::Cmdlet)
当执行包装的命令时,它将使用这些值,这就是我想要的。此时,我可以保存该函数并运行它。但输出与我运行 Get-Ciminstance 时的输出相同,并且我心里有一个特定的输出。就是这样。
首先,复制并粘贴新版本的 $scriptCmd 行。注释掉原来的行。
# $scriptCmd = {& $wrappedCmd @PSBoundParameters }
我需要做的是创建自己的脚本命令,它必须是单个管道表达式。
$scriptCmd = {
#select whatever Win32_OperatingSystem properties you need
& $wrappedCmd @PSBoundParameters |
Select-Object @{Name="Computername";Expression={$_.CSName}},
@{Name="OS";Expression={$_.Caption}},Version,
@{Name="64bit";Expression={
if ($_.OSArchitecture -match "64") {
$True
}
else {
$False
}}},
@{Name="SvcPack";Expression={$_.CSDVersion}},InstallDate
} #scriptcmd
我仍然希望运行封装的 Get-Ciminstance 命令,但随后我会将结果通过管道传输到 Select-Object 并指定一些自定义属性。这就是我的主要更改的范围,尽管我还将添加一些额外的 Write-Verbose 行以进行跟踪和故障排除。更新基于评论的帮助后,这是我的最终命令。
#requires -version 4.0
#this version selects the properties I want
Function Get-CIMOS {
<#
.Synopsis
Get operating system information.
.Description
This is a proxy version of Get-CimInstance designed to get operating system information from one or more computers.
.Notes
Last Updated: 9/4/2014
Learn more:
PowerShell in Depth: An Administrator's Guide (http://www.manning.com/jones6/)
PowerShell Deep Dives (http://manning.com/hicks/)
Learn PowerShell in a Month of Lunches (http://manning.com/jones3/)
Learn PowerShell Toolmaking in a Month of Lunches (http://manning.com/jones4/)
PowerShell and WMI (http://www.manning.com/siddaway2/)
****************************************************************
* DO NOT USE IN A PRODUCTION ENVIRONMENT UNTIL YOU HAVE TESTED *
* THOROUGHLY IN A LAB ENVIRONMENT. USE AT YOUR OWN RISK. IF *
* YOU DO NOT UNDERSTAND WHAT THIS SCRIPT DOES OR HOW IT WORKS, *
* DO NOT USE IT OUTSIDE OF A SECURE, TEST SETTING. *
****************************************************************
.Example
PS C:> get-cimos chi-dc04
Computername : CHI-DC04
OS : Microsoft Windows Server 2012 Datacenter
Version : 6.2.9200
SvcPack :
InstallDate : 9/10/2012 12:41:57 PM
.Example
PS C:\> get-cimsession | get-cimos | out-gridview -title "OS Report"
.Link
Get-CimInstance
#>
[CmdletBinding(DefaultParameterSetName='ClassNameComputerSet')]
param(
[Parameter(Position=0,ParameterSetName='CimInstanceSessionSet', Mandatory=$true, ValueFromPipeline=$true)]
[Microsoft.Management.Infrastructure.CimSession[]]$CimSession,
[Parameter(Position=0,ParameterSetName='ClassNameComputerSet', ValueFromPipelineByPropertyName=$true)]
[Alias('CN','ServerName')]
[string[]]$ComputerName = $env:Computername,
[Alias('OT')]
[uint32]$OperationTimeoutSec
)
begin
{
#add my own verbose output
Write-Verbose -Message "Starting $($MyInvocation.Mycommand)"
Write-verbose $PSCmdlet.ParameterSetName
try {
$outBuffer = $null
if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
{
$PSBoundParameters['OutBuffer'] = 1
}
#Add hard-coded parameters
$PSBoundParameters.Add("Classname","win32_operatingsystem")
$PSBoundParameters.Add("Namespace","root\cimv2")
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Get-CimInstance', [System.Management.Automation.CommandTypes]::Cmdlet)
#the original line
# $scriptCmd = {& $wrappedCmd @PSBoundParameters }
#my modified scriptblock. The scriptblock can only contain a single pipelined expression
$scriptCmd = {
#select whatever Win32_OperatingSystem properties you need
& $wrappedCmd @PSBoundParameters |
Select-Object @{Name="Computername";Expression={$_.CSName}},
@{Name="OS";Expression={$_.Caption}},Version,
@{Name="64bit";Expression={
if ($_.OSArchitecture -match "64") {
$True
}
else {
$False
}}},
@{Name="SvcPack";Expression={$_.CSDVersion}},InstallDate
} #scriptcmd
$steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
Write-Verbose "Begin steppable pipeline"
$steppablePipeline.Begin($PSCmdlet)
} catch {
throw
}
} #begin block
process
{
try {
Write-Verbose "Processing"
if ($PSCmdlet.ParameterSetName -eq 'ClassNameComputerSet') {
$inputs = $ComputerName
}
else {
$inputs = $cimSession.Computername
}
foreach ($computer in $inputs) {
Write-Verbose "...$computer"
}
$steppablePipeline.Process($_)
} catch {
throw
}
} #process block
end
{
Write-Verbose -Message "Ending $($MyInvocation.Mycommand)"
try {
$steppablePipeline.End()
} catch {
throw
}
} #end block
} #end function Get-CIMOS
现在来测试一下:
PS C:\> get-cimos
Computername : WIN81-ENT-01
OS : Microsoft Windows 8.1 Enterprise
Version : 6.3.9600
64bit : True
SvcPack :
InstallDate : 11/26/2013 1:08:31 PM
我可以指定一个计算机名:
PS C:\> get-cimos -ComputerName chi-dc04
Computername : CHI-DC04
OS : Microsoft Windows Server 2012 Datacenter
Version : 6.2.9200
64bit : True
SvcPack :
InstallDate : 9/10/2012 12:41:57 PM
或者使用 CIMSession。
PS C:\> get-cimsession | get-cimos |out-gridview -title "OS Report"
我无需编写任何代码即可使用 CIMSession。我让包装的 cmdlet 为我处理一切。最终的结果是我现在有了一个非常完整的 PowerShell 工具,并且不需要花费太多时间来创建。我可能花在写基于评论的帮助上的时间比任何事情都多。
希望这能让您了解如何将 PowerShell 工具制作提升到一个新的水平。
猜你还喜欢
- 03-30 [玩转系统] 如何用批处理实现关机,注销,重启和锁定计算机
- 02-14 [系统故障] Win10下报错:该文件没有与之关联的应用来执行该操作
- 01-07 [系统问题] Win10--解决锁屏后会断网的问题
- 01-02 [系统技巧] Windows系统如何关闭防火墙保姆式教程,超详细
- 12-15 [玩转系统] 如何在 Windows 10 和 11 上允许多个 RDP 会话
- 12-15 [玩转系统] 查找 Exchange/Microsoft 365 中不活动(未使用)的通讯组列表
- 12-15 [玩转系统] 如何在 Windows 上安装远程服务器管理工具 (RSAT)
- 12-15 [玩转系统] 如何在 Windows 上重置组策略设置
- 12-15 [玩转系统] 如何获取计算机上的本地管理员列表?
- 12-15 [玩转系统] 在 Visual Studio Code 中连接到 MS SQL Server 数据库
- 12-15 [玩转系统] 如何降级 Windows Server 版本或许可证
- 12-15 [玩转系统] 如何允许非管理员用户在 Windows 中启动/停止服务
取消回复欢迎 你 发表评论:
- 精品推荐!
-
- 最新文章
- 热门文章
- 热评文章
[影视] 黑道中人 Alto Knights(2025)剧情 犯罪 历史 电影
[古装剧] [七侠五义][全75集][WEB-MP4/76G][国语无字][1080P][焦恩俊经典]
[实用软件] 虚拟手机号 电话 验证码 注册
[电视剧] 安眠书店/你 第五季 You Season 5 (2025) 【全10集】
[电视剧] 棋士(2025) 4K 1080P【全22集】悬疑 犯罪 王宝强 陈明昊
[软件合集] 25年6月5日 精选软件22个
[软件合集] 25年6月4日 精选软件36个
[短剧] 2025年06月04日 精选+付费短剧推荐33部
[短剧] 2025年06月03日 精选+付费短剧推荐25部
[软件合集] 25年6月3日 精选软件44个
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电视剧] 欢乐颂.5部全 (2016-2024)
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[影视] 【稀有资源】香港老片 艺坛照妖镜之96应召名册 (1996)
[剧集] 神经风云(2023)(完结).4K
[剧集] [BT] [TVB] [黑夜彩虹(2003)] [全21集] [粤语中字] [TV-RMVB]
[实用软件] 虚拟手机号 电话 验证码 注册
[资源] B站充电视频合集,包含多位重量级up主,全是大佬真金白银买来的~【99GB】
[影视] 内地绝版高清录像带 [mpg]
[书籍] 古今奇书禁书三教九流资料大合集 猎奇必备珍藏资源PDF版 1.14G
[电视剧] [突围] [45集全] [WEB-MP4/每集1.5GB] [国语/内嵌中文字幕] [4K-2160P] [无水印]
[剧集] [央视][笑傲江湖][2001][DVD-RMVB][高清][40集全]李亚鹏、许晴、苗乙乙
[电影] 美国队长4 4K原盘REMUX 杜比视界 内封简繁英双语字幕 49G
[电影] 死神来了(1-6)大合集!
[软件合集] 25年05月13日 精选软件16个
[精品软件] 25年05月15日 精选软件18个
[绝版资源] 南与北 第1-2季 合集 North and South (1985) /美国/豆瓣: 8.8[1080P][中文字幕]
[软件] 25年05月14日 精选软件57个
[短剧] 2025年05月14日 精选+付费短剧推荐39部
[短剧] 2025年05月15日 精选+付费短剧推荐36部
- 最新评论
-
- 热门tag