Я нашел этот источник https://blogs.technet.microsoft.com/heyscriptingguy/2011/03/01/proxy-functions-spice-up-your-powershell-core-cmdlets/
В этом случае ярлык / псевдоним для Select-String -First 10 сводится к:
$metadata = New-Object System.Management.Automation.CommandMetaData (Get-Command Select-Object)
[System.Management.Automation.ProxyCommand]::Create($MetaData) | Out-File -FilePath prxyfunctions.psm1
Откройте файл модуля prxyfunctions.psm1 и оберните весь контент в новую функцию под названием S10
function S10 {
[CmdletBinding(DefaultParameterSetName = 'DefaultParameter', HelpUri = 'https://go.microsoft.com/fwlink/?LinkID=113387', RemotingCapability = 'None')]
param(
<abbreviated...>
.ForwardHelpTargetName Microsoft.PowerShell.Utility\Select-Object
.ForwardHelpCategory Cmdlet
#>
}
Затем в разделе Begin {} добавьте один оператор $PSBoundParameters.Add('First','10')
, как показано ниже.
begin {
try {
$outBuffer = $null
if ($PSBoundParameters.TryGetValue('OutBuffer', [ref]$outBuffer)) {
$PSBoundParameters['OutBuffer'] = 1
}
$PSBoundParameters.Add('First','10')
$wrappedCmd = $ExecutionContext.InvokeCommand.GetCommand('Microsoft.PowerShell.Utility\Select-Object', [System.Management.Automation.CommandTypes]::Cmdlet)
$scriptCmd = {& $wrappedCmd @PSBoundParameters }
$steppablePipeline = $scriptCmd.GetSteppablePipeline($myInvocation.CommandOrigin)
$steppablePipeline.Begin($PSCmdlet)
}
catch {
throw
}
}
Вот и все. Сохраните файл, импортируйте модуль, наберите короткую команду типа gci c:\|s10
и получите всего 10 результатов.
Если вы действительно хотите, чтобы все было надежно, нужно больше кодирования. Если используется S10 -First 2
, вы получите хорошую ошибку.
РЕДАКТИРОВАТЬ в ответ на полезные комментарии @PetSerAl
Некоторые командлеты, находящиеся далее в конвейере, могут не поддерживать прокси-функцию, например, Sort-Object. Сравните вывод этих двух строк
-join (20..1 | Select -First 10 | Sort)
11121314151617181920
-join (20..1 | S10 | Sort)
<nothing>
-join (20..1 | S10 -Wait | Sort)
11121314151617181920
Это можно обойти, используя параметр -Wait в командной строке. Или закодируйте параметр Wait в прокси-функции $PSBoundParameters.Add('Wait',$true)
При работе с большими коллекциями это прискорбно, поскольку отключает функцию Select-Object, которая останавливает конвейер после элементов x, что приводит к большей обработке и более длительному ожиданию.