2

Format-Table次のようなPowershell文字列があるとします。

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

これから得られる出力には満足していますが、使用するたびに入力したくありません。次のような簡単な 1 語のコマンドで呼び出すことができるようにしたいと思います。

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は新しく作成された関数ではなく、既存のエイリアスを呼び出していたことを意味していました。

4

3 に答える 3

2

以下は、動作中の Filter バージョンです。

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

または:

filter kilobytes {[PSCustomObject]@{Name=$_.name;KB=$_.length/1024}}
于 2013-11-15T11:32:34.813 に答える
0

プロキシ関数は、元のコマンドを自然な方法でサポートしながら、1 つまたは複数のパラメーターをバインドするための優れた方法を提供します。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
#>
}
于 2013-11-15T15:52:19.197 に答える