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

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

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

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

Q&A

解決済

1回答

2485閲覧

代入をしたときに コピー されるのか 参照が 渡されるのか 簡単に区別したい

kamikazelight

総合スコア305

PowerShell

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

0グッド

0クリップ

投稿2018/11/10 02:05

前提・実現したいこと

$a = $b等としたときに コピーされるのか 参照が渡されるのか
簡単に区別したいです...

コピーしたつもりが 参照が渡されていて
大惨事になるところでした...

現在は代入してみて他に影響が出ていないか 毎回実行して
確認しています。

何かいい方法はないでしょうか?

該当のソースコード

powershell

1 # 共通情報の定義 2 $PsCommon = New-Object psobject | select -Property Frame,List 3 $PsCommon.List = New-Object psobject | select -Property Range,Rows,Columns 4 $PsCommon.list.Rows = New-Object psobject | select -Property Count,Interval 5 6 $BkInfo = New-Object psobject | select -Property PartTable,PurchaseOrder 7 8 # コピーしたつもりだった.... 9 $BkInfo.PartTable = $PsCommon 10 $BkInfo.PurchaseOrder = $PsCommon 11 12 Remove-Variable PsCommon 13 14 $BkInfo.PartTable.List.Range = 'M10:CU44' 15 $BkInfo.PartTable.List.Rows.Count = 35 16 $BkInfo.PartTable.List.Rows.Interval = 1 17 18 $BkInfo.PartTable.List.Columns = New-Object psobject | select -Property 頁,CharacterSymbol,No,EquipmentName,Type,Quantity,Maker 19 $Propertys = @($BkInfo.PartTable.List.Columns.psobject.Properties) 20 for ($i = 0; $i -le 6; $i++) 21 { 22    # このステートメントを記述した段階で 問題に気付いた... 23 $Propertys[$i].Value = @(4,7,3,15,18,4,6)[$i] 24 } 25 26 $BkInfo.PartTable.Frame = New-Object psobject | select -Property 担当,製図初年月日,製図年月日,盤名称,管理番号,件名,件名1 27 $Propertys = @($BkInfo.PartTable.Frame.psobject.Properties) 28 for ($i = 0; $i -le 6; $i++) 29 { 30 $Propertys[$i].Value = @('AN49','AW53','BD53','BN47','CJ47','CJ49','CJ52')[$i] 31 } 32 33 #最後に確認してみると巻き込まれてる 34 @($BkInfo.PurchaseOrder.Frame.psobject.Properties)[0] 35# Value : AN49 となっている 元は $null のはず...

試したこと

該当のソースコードに記載のコード

補足情報(FW/ツールのバージョンなど)

Win10

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

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

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

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

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

guest

回答1

0

ベストアンサー

PSObject は参照型のオブジェクトなので参照が代入されます。
構造体や int などの値型オブジェクトはコピーが代入されます。

ps1

1function CreatePsCommon 2{ 3 $PsCommon = New-Object psobject | select -Property Frame,List 4 $PsCommon.List = New-Object psobject | select -Property Range,Rows,Columns 5 $PsCommon.list.Rows = New-Object psobject | select -Property Count,Interval 6 $PSCommon 7} 8 9$BkInfo.PartTable = CreatePsCommon 10$BkInfo.PurchaseOrder = CreatePsCommon

このような関数を作って毎回インスタンスを作ってください。

投稿2018/11/10 02:36

Zuishin

総合スコア28660

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

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

kamikazelight

2018/11/10 02:43

回答ありがとうございます。 現在は コピーでは 困っていません。 とりあえず $BkInfo.PartTable = $PsCommon | select * という感じで 問題は起きていません。 PSObject は参照型...等はネットで調べるしかないのでしょうか? get-help 等 powershellだけで確認が出来るとうれしいのですが 自分では見つけられませんでした....
Zuishin

2018/11/10 02:46

$a が参照型か値型かは次のようにして調べることができます。 $a.GetType().IsValueType これが True なら値型で False なら参照型です。 ただし PowerShell の場合は何かの処理で値型が PSObject でラップされて参照型になることがあります。
Zuishin

2018/11/10 02:47

たとえばプロパティを後から追加できるのは PSObject でラップされた結果なので、プロパティを後から追加したものは必ず参照型になります。
kamikazelight

2018/11/10 02:54

いつもありがとうございます! 本当に 助かりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問