none
変数に格納されている項目が1つの時, countプロパティで 1を返さない RRS feed

  • 質問

  • ・以下は Get-WinEventを使用して EVENT_IDでフィルターを掛けて出力しています.

    PS C:\> get-winevent -logname Security | where-object {$_.ID -eq 4717}

    TimeCreated                   ProviderName                                             Id Message
    -----------                   ------------                                             -- -------
    2012/06/14 17:11:26           Microsoft-Windows-Security...                          4717 アカウントに対してシステム...

     1件のデータが存在する事を確認できました.

    ・次に, 上の内容に .countプロパティを使用して件数を返そうとしています. 

    PS C:\> (get-winevent -logname Security | where-object {$_.ID -eq 4717}).count
    PS C:\>

      "1" が出力される事を期待しましたが, 結果は NULLでした.

     同じ事を 3件のデータに関して行なった場合は "3"が出力されます.

    2012年6月28日 8:29

回答

  • コマンドレットの出力が一つの場合は、配列ではなく単一のオブジェクトとして返却されます。

    その場合出力されるオブジェクトは配列ではないので、countプロパティが存在せず、値を返しません。

    この問題の対処方法はコマンドレットの出力に@()をつけることです。

    @(get-winevent -logname Security | where-object {$_.ID -eq 4717}).count

    のように@()をつけると、単一のオブジェクトでも1要素の配列として扱うようになります。

    なお現在開発中のPowerShell 3.0では、単一オブジェクトも一要素の配列として処理できるようになったので、@()をつけなくてもOKになりました。

    2012年6月28日 8:58
    モデレータ

すべての返信

  • コマンドレットの出力が一つの場合は、配列ではなく単一のオブジェクトとして返却されます。

    その場合出力されるオブジェクトは配列ではないので、countプロパティが存在せず、値を返しません。

    この問題の対処方法はコマンドレットの出力に@()をつけることです。

    @(get-winevent -logname Security | where-object {$_.ID -eq 4717}).count

    のように@()をつけると、単一のオブジェクトでも1要素の配列として扱うようになります。

    なお現在開発中のPowerShell 3.0では、単一オブジェクトも一要素の配列として処理できるようになったので、@()をつけなくてもOKになりました。

    2012年6月28日 8:58
    モデレータ
  •  ありがとうございました.

    2012年6月29日 0:59