如何在Powershell中为Format-Table创建别名?

时间:2013-11-15 10:38:43

标签: powershell

假设我有一个Powershell Format-Table字符串,例如:

ls | Format-Table Name, @{expression={$_.Length / 1024}; label='KB'}

我对我从中获得的输出感到满意,但我不想每次使用它时都输入它。我希望能够通过简单的单字命令来调用它,例如:

ls | Format-KiloBytes

我收集我应该为此定义一个函数,因为别名不能指定参数。但是,如果我定义类似:

function kilobytes {format-table Name, @{expression={$_.Length / 1024}; label='KB'}}

那么它没有任何影响:

PS> ls | format-table Name, @{expression={$_.Length / 1024}; label='KB'}
   ... Produces the formatted output

PS> ls | kilobytes
   ... Produces output with unchanged formatting, the same as 'ls'

编辑:看来我很困惑。在进行实验时,我已经创建了别名为kilobytes的别名Format-Table。我忘了这一点,但这意味着创建一个函数kilobytes没有任何警告成功,但随后调用kilobytes并没有调用新创建的函数,而是调用现有的别名。

3 个答案:

答案 0 :(得分:4)

首先你可以尝试:

function kilobytes {$input | format-table Name, @{expression={$_.Length / 1024}; label='KB'}}

您可以在about_Functions中找到$input的说明。在管道中使用函数时,通过管道传递给函数的对象将分配给$ input自动变量。

答案 1 :(得分:2)

这是一个有效的过滤器版本:

filter kilobytes {$_ | select Name,@{expression={$_.Length / 1024}; label='KB'}}

或者:

filter kilobytes {[PSCustomObject]@{Name=$_.name;KB=$_.length/1024}}

答案 2 :(得分:0)

代理函数提供了一种绑定一个或多个参数的好方法,同时仍然以自然的方式支持原始命令。在Bing上搜索“powershell代理函数”会给出很多很好的细节。

下面是一个完全符合您要求的代理功能。你可以看到你仍然有像-AutoSize那样的Format-Table参数,但是没有-Property参数,因为它已被硬编码。

此代理的更智能版本实际上可能支持向硬编码的属性添加其他属性。

function Format-Kilobytes
{
    [CmdletBinding(HelpUri='http://go.microsoft.com/fwlink/?LinkID=113303')]
    param(
        [switch]${AutoSize},
        [switch]${HideTableHeaders},
        [switch]${Wrap},
        [System.Object]${GroupBy},
        [string]${View},
        [switch]${ShowError},
        [switch]${DisplayError},
        [switch]${Force},
        [ValidateSet('CoreOnly','EnumOnly','Both')]
        [string]${Expand},
        [Parameter(ValueFromPipeline=$true)]
        [psobject]${InputObject})

begin
{
    try {
        $wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Format-Table',
            [System.Management.Automation.CommandTypes]::Cmdlet)
        $properties = "Name",@{expression={$_.Length / 1024}; label='KB'}
        $scriptCmd = {& $wrappedCmd @PSBoundParameters -Property $properties }
        $steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
        $steppablePipeline.Begin($PSCmdlet)
    } catch {
        throw
    }
}
process { try { $steppablePipeline.Process($_) } catch { throw } }
end { try { $steppablePipeline.End() } catch { throw } }
<#
.ForwardHelpTargetName Format-Table
.ForwardHelpCategory Cmdlet
#>
}