2

このOutputType属性は、インテリセンスを通じて型情報を提供することになっています。ただし、期待どおりには機能しません。

PSReadline と PowerShell ISE の両方でこれをテストしましたが、同じように動作します。

以下は、私が使用しているサンプル関数です。

Function Get-FirstChar
{
    [OutputType([String])]
    [CmdletBinding()]

    param(
      [Parameter(Mandatory=$true, ValueFromPipeline=$true)][string[]]$Strings
    )

    process {
        foreach ($str in $Strings) {
            $str.SubString(0, 1);
        }   
    }
}

私がする時:


"John","Simon" | Get-FirstChar | % { $_.<TAB> }

私は提案を受け取ります(プラットフォームに関係なく):

Equals       GetHashCode  GetType      ToString

しかし、私がするとき:

("John","Simon" | Get-FirstChar).<TAB>

SubString次に、などのすべての文字列メソッドを取得します。

出力タイプとして文字列配列も試しましたが、String[]まだ機能しません:(

OutputTypepowershell 関数から 1 つまたは複数の文字列が返されることを示すために属性を使用する方法について、誰かが気に入ってくれますか?

ありがとうございました

4

1 に答える 1

2

明らかに、あなたの期待は正しいです。[string]他の複雑なタイプでは機能するので、機能しないことに驚いたと言わざるを得ません。

function Get-ProcessEx {
    [OutputType([System.Diagnostics.Process])]
    param ()
}

Get-ProcessEx | ForEach-Object { $_.}

私が試してみると、[string]プロパティのみが取得されます(これは文字列にはあまり役に立ちません。文字列が持つ唯一のプロパティは ですLength)。関数から返されるオブジェクトが文字列であるという情報に PowerShell ISE や PSReadline などのツールが応答する方法のバグまたは制限と考えます。たとえば、他の単純な型で同じことを試すと、結果は期待どおりになります。

function Get-Int {
    [OutputType([int])]
    param ()
}

Get-Int | ForEach-Object { $_. }

OutputTypeコマンドレットにも影響しているようです。文字列のメソッドにタブ補完を提供するために同じを定義する既存のコマンドレットを取得できません。

Get-Command | Where-Object { $_.OutputType.Type -eq [String] }
# Join-Path, not too surprisingly, returns System.String...
Join-Path -Path C:\temp -ChildPath a.txt | ForEach-Object { $_.}

どちらの場合も、 PowerShell の UserVoiceで報告する価値があると思います。

于 2016-12-27T19:49:41.270 に答える