当前位置:网站首页 > 更多 > 玩电脑 > 正文

[玩转系统] 重新审视让 Shell 为您服务

作者:精品下载站 日期:2024-12-14 07:43:37 浏览:15 分类:玩电脑

重新审视让 Shell 为您服务


[玩转系统] 重新审视让 Shell 为您服务

使用代理功能,您可以在给定命令中添加或删除参数。这就是我对 Select-Object 所做的事情。首先,您需要获取命令元数据,其中包括参数等内容。获得元数据后,您可以创建代理命令并从那里获取它。

$metadata = New-Object System.Management.Automation.CommandMetaData (Get-Command Select-Object)
[System.Management.Automation.ProxyCommand]::Create($metadata) | clip

我运行此命令,在 PowerShell ISE 中打开一个新选项卡,然后粘贴到新的代理命令中,如下所示。

[CmdletBinding(DefaultParameterSetName='DefaultParameter', HelpUri='http://go.microsoft.com/fwlink/?LinkID=113387', RemotingCapability='None')]
param(
    [Parameter(ValueFromPipeline=$true)]
    [psobject]
    ${InputObject},

    [Parameter(ParameterSetName='DefaultParameter', Position=0)]
    [System.Object[]]
    ${Property},

    [Parameter(ParameterSetName='DefaultParameter')]
    [string[]]
    ${ExcludeProperty},

    [Parameter(ParameterSetName='DefaultParameter')]
    [string]
    ${ExpandProperty},

    [switch]
    ${Unique},

    [Parameter(ParameterSetName='DefaultParameter')]
    [ValidateRange(0, 2147483647)]
    [int]
    ${Last},

    [Parameter(ParameterSetName='DefaultParameter')]
    [ValidateRange(0, 2147483647)]
    [int]
    ${First},

    [Parameter(ParameterSetName='DefaultParameter')]
    [ValidateRange(0, 2147483647)]
    [int]
    ${Skip},

    [switch]
    ${Wait},

    [Parameter(ParameterSetName='IndexParameter')]
    [ValidateRange(0, 2147483647)]
    [int[]]
    ${Index})

begin
{
    try {
        $outBuffer = $null
        if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
        {
            $PSBoundParameters['OutBuffer'] = 1
        }
        $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Select-Object', [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
    }
}
<#

.ForwardHelpTargetName Select-Object
.ForwardHelpCategory Cmdlet

#>

因为我知道我想在自己的帮助下创建自己的命令,所以我删除了对帮助的引用并将命令包装在函数中。在这种情况下,我想删除除 InputObject 和 Last 之外的所有参数。其他一切都保持不变。将会发生的情况是,当我运行该函数时,它将在可步进管道中调用原始命令。不用太担心这一点。这是我完成的代理功能。

#requires -version 3.0

#this is a proxy function version of Select-Object

Function Select-Last {

<#
.Synopsis
Select the last X number of objects.
.Description
This is a proxy version of Select-Object designed to select the last X number of objects. 
.Example
PS C:\> 1..1000 | select-last 5
996
997
998
999
1000
.Notes
Last Updated: 8/26/2014
Version     : 0.9

.Link
Select-Object

#>

[CmdletBinding(DefaultParameterSetName='DefaultParameter', RemotingCapability='None')]
param(
    [Parameter(ValueFromPipeline=$true)]
    [psobject]$InputObject,

    [Parameter(ParameterSetName='DefaultParameter',
    Position=0,Mandatory=$True,
    HelpMessage="How many items do you want to select?")]
    [ValidateRange(0, 2147483647)]
    [int]$Last

   )

begin
{
    try {
        $outBuffer = $null
        if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
        {
            $PSBoundParameters['OutBuffer'] = 1
        }
        $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Select-Object', [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
    }
}

} #end function

我将 Last 参数设置为强制参数和位置参数。现在我可以运行这样的命令:

get-eventlog system | select-last 3

如果我将 Last 别名定义为 Select-Last 那就更好了。从性能角度来看,它的执行介于我的包装函数和原始命令之间。当然,我需要一个 Select-First,所以这是它的代理版本:

#requires -version 3.0

#this is a proxy function version of Select-Object

Function Select-First {

<#
.Synopsis
Select the first X number of objects.
.Description
This is a proxy version of Select-Object designed to select the first X number of objects. 
.Example
PS C:\> 1..1000 | select-first 5
1
2
3
4
5
.Notes
Last Updated: 8/26/2014
Version     : 0.9

.Link
Select-Object

#>

[CmdletBinding(DefaultParameterSetName='DefaultParameter', RemotingCapability='None')]
param(
    [Parameter(ValueFromPipeline=$true)]
    [psobject]$InputObject,

    [Parameter(ParameterSetName='DefaultParameter',
    Position=0,Mandatory=$True,
    HelpMessage="How many items do you want to select?")]
    [ValidateRange(0, 2147483647)]
    [int]$First

   )

begin
{
    try {
        $outBuffer = $null
        if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer))
        {
            $PSBoundParameters['OutBuffer'] = 1
        }
        $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Select-Object', [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
    }
}

} #end function

代理命令的概念是为用户提供已知 PowerShell 命令的精简版本,但在本例中,我主要使用代理命令作为替代方案,这样我就可以偷懒并创建别名。只需做一点工作,您就可以在 PowerShell 提示符下创建一个自定义工具集来满足您的需求,并且可以像您想要的那样懒惰(我的意思是高效)。

您需要 登录账户 后才能发表评论

取消回复欢迎 发表评论:

关灯