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

[玩转系统] PowerShell for the People:让 shell 为您服务

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

PowerShell for the People:让 shell 为您服务


[玩转系统] PowerShell for the People:让 shell 为您服务

别名只是一个简短的命令名称替代。您可以键入 ps,而不是键入 Get-Process。即使我也不能搞砸。在命令提示符下使用别名是加快工作速度并减少拼写错误的好方法。虽然我不会在脚本中输入以下内容:

gsv | ? status -eq running

在提示下,速度很快,我得到了想要的结果。但是,您无法为命令及其参数创建别名。例如,我喜欢 Select-Object 的 -First 和 -Last 参数。但我无法创建与 Select-Object -last 10 等效的别名。但是,您可以做的是围绕命令创建自己的包装器并为其添加别名。这是我为 Select-Object -Last X 编写的函数。

#requires -version 3.0 

Function Select-Last {

<#
.Synopsis
Select last X number of objects
.Description
This command takes pipelined input and selects the last specified number of objects which are then written to the pipeline.

There is a trade off of convenience for performance. For a very large number processed objects, use Select-Object directly
.Example
PS C:\> dir c:\scripts\*.ps1  | sort lastwritetime | last 5
.Notes
Last Updated: 8/25/2014
Version     : 0.9

.Link
Select-Object
#>

[cmdletbinding()]

Param(
[Parameter(Position=0,Mandatory,HelpMessage="How many objects do you want to get?")]
[ValidateScript({$_ -gt 0})]
[int]$Last,
[Parameter(Position=1,Mandatory,ValueFromPipeline)]
[object]$InputObject
)

Begin {
    Write-Verbose -Message "Starting $($MyInvocation.Mycommand)"  
    Write-Verbose -Message "Selecting last $Last objects"

    #initialize an array to hold all incoming objects
    $data=@()
    #initialize a counter
    $total=0
    #track when the command started in order to calculate how long the command took to complete.
    $start=Get-Date
} #begin

Process {
    $total++
    if ($total -le $Last) {
        #add each piped object to temporary array
        $data+=$InputObject
    }
    else {
      #move all items in the array up one
      $data = $data[1..$Last]
      #add the new item
      $data+=$InputObject
    }
} #process

End {
    #write the results
    $data
    $end = Get-Date
    Write-Verbose -Message "Processed $total items in $($end-$start)"
    Write-Verbose -Message "Ending $($MyInvocation.Mycommand)"
} #end
}

Set-Alias -Name Last -Value Select-Last

您会注意到我的代码片段的最后一部分定义了一个名为 Last 的别名,该别名引用了该函数。但现在我可以在 PowerShell 提示符下快速轻松地使用一些东西。

dir c:\work\*.txt | sort lastwritetime | last 5

您必须找出包装 cmdlet 的最佳方法。在本例中,我将每个管道传入对象并将其添加到数组中,仅保留指定数量的项目。添加每个项目后,其他项目将在数组中“向上”移动。

请注意,便利性和性能之间可能需要权衡。该命令使用我的别名和自定义函数:

Measure-command {1..5000 | last 3}

花了 237 毫秒。而选择对象方法:

Measure-command {1..5000 | select -Last 3}

仅花费了 49 毫秒。但我敢打赌,您可能愿意接受这种权衡以节省一些打字时间。当然,如果有 Last 命令,就应该有 First 命令。

Function Select-First {
<#
.Synopsis
Select first X number of objects
.Description
This command takes pipelined input and selects the first specified number of objects which are then written to the pipeline.
.Example
PS C:\> get-process | sort WS -descending | first 5
.Notes
Last Updated: 8/25/2014
Version     : 0.9

.Link
Select-Object
#>
[cmdletbinding()]

Param(
[Parameter(Position=0,Mandatory,HelpMessage="How many objects do you want to get?")]
[ValidateScript({$_ -gt 0})]
[int]$First,
[Parameter(Position=1,Mandatory,ValueFromPipeline)]
[object]$InputObject
)

Begin {
    Write-Verbose -Message "Starting $($MyInvocation.Mycommand)"  
    Write-Verbose -Message "Selecting first $First objects"
    #track when the command started in order to calculate how long the command took to complete.
    $start=Get-Date
    #initialize a counter
    $i=0
} #begin

Process {
    #add each piped object to temporary array
    $i++
   
    if ($i -le $First) {    
        $InputObject
    }
    else {
        #we're done here
        Write-Verbose "Limit reached"
        $end = Get-Date
        Write-Verbose -Message "Processed $($data.count) items in $($end-$start)"
        Write-Verbose -Message "Ending $($MyInvocation.Mycommand)"
        #bail out
        break
    }
} #process

End {
    #not used    
} #end
}

Set-Alias -Name First -Value Select-First

从性能角度来看,这更容易,因为我所要做的就是对管道中的对象进行计数,并在达到限制后退出。

ps | sort ws -des | first 3

在此示例中,我不仅利用了别名,还利用了位置参数,并且只需键入足够多的参数名称,以便 PowerShell 知道我想要什么。

因此,有一些方法可以使 PowerShell 对键盘更加友好,尽管这可能需要您做一些工作。下次我们会考虑另一种选择。

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

取消回复欢迎 发表评论:

关灯