假设我有一个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
并没有调用新创建的函数,而是调用现有的别名。
答案 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
#>
}