質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

87.80%

Powershell: PSObjectについて質問

受付中

回答 2

投稿

  • 評価
  • クリップ 0
  • VIEW 3,790
退会済みユーザー

退会済みユーザー

皆さま、

PSObjectの取り扱い方法について、2点ほどご教示願います。

1.Nullデータや特定データを置換する方法

$obj = New-Object PSObject

$obj | Add-Member -MemberType NoteProperty -Name "ID" -Value "1"  -PassThru |
    Add-Member -MemberType NoteProperty -Name "a" -Value $null -PassThru |
    Add-Member -MemberType NoteProperty -Name "b" -Value "1"

$obj
$obj | get-member


   TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition                    
----        ----------   ----------                    
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()             
GetType     Method       type GetType()                
ToString    Method       string ToString()             
a           NoteProperty object a=null                 
b           NoteProperty string b=1                    
ID          NoteProperty string ID=1

$objを展開すると、aがNullになります。
これを、ほかの文字列に置き換えたいのですが、その方法は?
Nameが事前にわかっていれば、ValueはForceで上書きできると
思いますが。。。。
※上記コードでは3x1のデータ量ですが、実際は不定です。

2.個別に作成されたPSObjectをマージする方法

2.については、方法自体が思いつきません。
いったん新しい配列に取り込んで、マージする??とかでしょうか??

 以上、宜しくお願い致します。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 2

0

1.Nullデータや特定データを置換する方法

psobject.Propertiesでプロパティを動的に列挙し、NULLの場合に書き換えを行う。

$obj.psobject.Properties | %{if(-not $_.value){$_.value= "他の文字列"} }

$obj | get-member

2.個別に作成されたPSObjectをマージする方法
同じようにpsobject.Propertiesを使いメンバを追加します。

$ab = [PsCustomObject]@{A="a";B=2}
$cd = [PsCustomObject]@{C="c";D=4}
$tmp = [Pscustomobject]@{}
$ab.psobject.Properties | %{Add-Member -InputObject $tmp -MemberType NoteProperty -Name $_.name -Value $_.value  }
$cd.psobject.Properties | %{Add-Member -InputObject $tmp -MemberType NoteProperty -Name $_.name -Value $_.value  }
TypeName: System.Management.Automation.PSCustomObject

Name        MemberType   Definition                    
----        ----------   ----------                    
Equals      Method       bool Equals(System.Object obj)
GetHashCode Method       int GetHashCode()             
GetType     Method       type GetType()                
ToString    Method       string ToString()             
A           NoteProperty System.String A=a             
B           NoteProperty System.Int32 B=2              
C           NoteProperty System.String C=c             
D           NoteProperty System.Int32 D=4

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/03/12 15:54 編集

    コメントいただきまして、ありがとうございます。

    結果、1番は、うまく動きませんでした。
    Isxxxのものは、ReadOnlyとでましたので、
    条件式のNotを省いてみたところ、すべて?でReadOnlyと
    出ました。
    何か、解決策はありますか?

    2番は、Nameさえかぶらなければ、期待通りの動きでした。

    全体的な動き方として期待しているのは、
    RDBやExcelの表で、それをマージ(2番)したり、
    Nullを埋める(1番)事を、実装できればと考えています。
    たとえば同じ勤務表書式で、1000人分の表データがあり、
    都道府県単位でマージする。とか、未入力部分に、何かしらの
    テキストを埋め込む様なイメージです。


    ーーー1番のエラー内容ーーー

    "Length" は ReadOnly のプロパティです。
    発生場所 ***.ps1:700 文字:29
    + %{ if( ( $_.value ) ){$_.value = "-"} }
    + ~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [], SetValueException
    + FullyQualifiedErrorId : ReadOnlyProperty

    "Length" は ReadOnly のプロパティです。
    発生場所 ***.ps1:700 文字:29
    + %{ if( ( $_.value ) ){$_.value = "-"} }
    + ~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [], SetValueException
    + FullyQualifiedErrorId : ReadOnlyProperty

    "LongLength" は ReadOnly のプロパティです。
    発生場所 ***.ps1:700 文字:29
    + %{ if( ( $_.value ) ){$_.value = "-"} }
    + ~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [], SetValueException
    + FullyQualifiedErrorId : ReadOnlyProperty

    "Rank" は ReadOnly のプロパティです。
    発生場所 ***.ps1:700 文字:29
    + %{ if( ( $_.value ) ){$_.value = "-"} }
    + ~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [], SetValueException
    + FullyQualifiedErrorId : ReadOnlyProperty

    "SyncRoot" は ReadOnly のプロパティです。
    発生場所 ***.ps1:700 文字:29
    + %{ if( ( $_.value ) ){$_.value = "-"} }
    + ~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [], SetValueException
    + FullyQualifiedErrorId : ReadOnlyProperty

    "IsFixedSize" は ReadOnly のプロパティです。
    発生場所 ***.ps1:700 文字:29
    + %{ if( ( $_.value ) ){$_.value = "-"} }
    + ~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [], SetValueException
    + FullyQualifiedErrorId : ReadOnlyProperty

    キャンセル

  • 2016/03/13 10:42

    1番目でエラーになったのはコレクションに対して直接プロパティをいじりったからではないでしょうか。
    以下のようにしたらどうでしょう?
    $obj | %{$_.psobject.Properties} | %{if(-not $_.value){$_.value= "他の文字列"} }

    キャンセル

0

試してみてください。

$obj | Get-Member -MemberType NoteProperty |? { $obj.($_.Name) -eq $null } |% { $obj.($_.Name) = '置換後の値' }

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 87.80%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る