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

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

新規登録して質問してみよう
ただいま回答率
85.48%
PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

Q&A

2回答

5419閲覧

Powershell: PSObjectについて質問

退会済みユーザー

退会済みユーザー

総合スコア0

PowerShell

Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

0グッド

0クリップ

投稿2016/02/14 12:28

皆さま、

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

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

powershell

1$obj = New-Object PSObject 2 3$obj | Add-Member -MemberType NoteProperty -Name "ID" -Value "1" -PassThru | 4 Add-Member -MemberType NoteProperty -Name "a" -Value $null -PassThru | 5 Add-Member -MemberType NoteProperty -Name "b" -Value "1" 6 7$obj

powershell

1$obj | get-member 2 3 4 TypeName: System.Management.Automation.PSCustomObject 5 6Name MemberType Definition 7---- ---------- ---------- 8Equals Method bool Equals(System.Object obj) 9GetHashCode Method int GetHashCode() 10GetType Method type GetType() 11ToString Method string ToString() 12a NoteProperty object a=null 13b NoteProperty string b=1 14ID NoteProperty string ID=1

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

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

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

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

試してみてください。

Powershell

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

投稿2016/06/06 12:21

Zuishin

総合スコア28660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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/02 02:12

sho_cs

総合スコア3541

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2016/03/12 07:09 編集

コメントいただきまして、ありがとうございます。 結果、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
sho_cs

2016/03/13 01:42

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問