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

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

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

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

Q&A

解決済

1回答

5231閲覧

オブジェクト要素として値を追加すると、場合によってエラーになる('op_Addition' という名前のメソッドが含まれないため、メソッド の呼び出しに失敗しました。)

beginner_Jiro

総合スコア10

PowerShell

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

0グッド

0クリップ

投稿2020/04/02 02:06

いつも大変お世話になっております。
power shellのオブジェクトについてご教授ください。

困っていること

オブジェクトをインスタンス化しそのオブジェクトを、用意していた別のオブジェクトに追加しようと
している部分で、('op_Addition' という名前のメソッドが含まれないため、メソッド の呼び出しに失敗しました。)というエラーが発生してしまいます。'op_Addition'というメソッドを利用してはいないのですが、なぜこのようなエラーが発生しているのか原因がわからず困っております。

###不明点
このエラーが発生する条件としてはpowershellをf5で実行した際に頻繁に発生いたします。
たとえばコードの最初の行にデバッグポイントを配置し、そこから明示的に実行した場合
上記のようなエラーは発生いたしませんでした。

###コード(一部抜粋)

function

1{ 2 #//引数受取(カウント数、プロジェクト名、当日八桁日付) 3 param($_objLinecnt,$_PJname,$_Day8dgt) 4 5 #//xmlファイルの存在確認(後続でxmlを吐き出している。2回目PJカウント以降の処理) 6 IF(Test-Path $_Repxmlpth) 7 { 8 #///前回のループで吐き出したxmlファイルをオブジェクトの要素値としてInport取込し、オブジェクト変数に格納 9 $Repdate = import-clixml $_Repxmlpth 10 $_RepObj += $Repdate 11 } 12 13 #///新規オブジェクト要素を作成し渡された引数のカウント数を要素の値にそれぞれ追加する 14 $Repdate = New-Object PSObject | Select-Object "日付", "プロジェクト名", "カウント数" 15 $Repdate.プロジェクト名 = $_PJname 16 $Repdate.カウント数 = $_objLinecnt 17 $Repdate.日付 = $_Day8dgt 18 #///今回の要素値を前回までの蓄積したxmlから取り込んでいたオブジェクトに追加する 19 $_RepObj += $Repdate#◆◆◆この行でエラーが発生しているようです【teratail】◆◆◆ 20 #///蓄積分として最後にxmlファイルに一旦排出し次のプロジェクトカウントに備える 21 $_RepObj | Export-Clixml $_Repxmlpth -Encoding UTF8 22 #///$_RepObj | ft -AutoSize 23} 24コード

上記コードはループ文内に存在しますので、何度も繰り返し実行される想定になります。

どなたか、ご回答いただけます方いらっしゃましたら何卒よろしくお願い申し上げます。

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

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

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

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

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

ku__ra__ge

2020/04/02 02:42

以下コードを実行してもエラーは再現しませんでした。エラーが再現できる短いコードを教えて下さい。 ```powershell $_RepObj = @() $Repdate = New-Object PSObject | Select-Object "日付", "プロジェクト名", "カウント数" $Repdate.プロジェクト名 = "プロジェクト名" $Repdate.カウント数 = 99 $Repdate.日付 = Get-Date $_RepObj += $Repdate ```
beginner_Jiro

2020/04/02 03:02

ku__ra__ge様 お世話になっております。修正依頼ありがとうございます。 質問本文に記載してあるコードを実行した際もループ処理に入り初回はうまく動作し、二回目以降に エラーが発生するといったようなことが起こりえます。 再現するための明確な処理もわからず困っています。 現在、確実にエラーが起きるような状況を作りだそうとしておりますので少々お待ちいただけますでしょうか。
guest

回答1

0

自己解決

当件についてですが、エラーの原因はおろかエラーが発生する条件についても不明なため
適切な状況を説明できず、回答者様にご迷惑をおかけすると判断したためにクローズとさせていただきます。

当処理に関してですが、ファンクションのみの実装となっておりクラスの使用を一切しておりませんでした。
ファンクションを使用していたがために、xmlファイルを外出しし、再度取込・・・を繰り返すことで
データの追加を行っていたために、このような予期せぬエラーが発生していたのかもしれません。

現在、クラスの仕様を勉強しコードを書き直しています。別のアプローチでの解決となってしまい
申し訳ございません。

投稿2020/04/02 05:50

beginner_Jiro

総合スコア10

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

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

Zuishin

2020/04/02 06:09

op_Addition は加算に使われるメソッドです。「+」を使えないオブジェクトで使っていませんか?
Zuishin

2020/04/02 06:12 編集

例えば $_RepObj が配列でなかった場合、「@($_RepObj) += ...」 のように @() でくくって配列化すると使えるようになります。
beginner_Jiro

2020/04/02 06:49

Zuishin様 いつもお世話になっております。ご回答いただきありがとうございます。 $_RepObj が配列でなかった場合・・・。なるほど。 その説はかなり濃厚になります。現在も依然、エラーが起きる条件がわからない状態ですが模索してみます。 その説が正だとした場合今後、クラスを使用したプログラムに書き直しても同じ問題に直面するはずですのでもう少し調べてみます。進捗があり次第、記載いたします。 ご教授いただきありがとうございます。
beginner_Jiro

2020/04/02 08:51

いつもお世話になっております。 当件に関してですが、ISEから実行するとエラーは出ませんが、右クリックで[PowerShellで実行]を 行うと必ずエラーで出ることが発覚いたしました。 ご報告になります。
Zuishin

2020/04/02 09:05

ISE と PowerShell ではプロファイルやカレントディレクトリが変わるので、そこに原因がある可能性がありますね。この抜粋のコードでは何とも言えません。どのみち op_Addition はプラス演算子を使った時に呼ばれるメソッドなので、何と何が加算されようとしているのかを表示して確かめてみると何かわかるかもしれません。
beginner_Jiro

2020/04/02 09:56

Zuishin様 いつもお世話になっております。 今調べたところ、ご提示いただいた解決策であります、@()でくくる方法を試したところ powershell上でも問題なく処理が完了いたしました。本当にありがとうございます。 以下実際の修正コードです。 ------------------------------ $_RepObj += @($Repdate) ------------------------------ ご教授いただきましたように$Repdateの方が配列ではなくオブジェクトとなっておりました。 申し訳ありません。知識不足でして配列はオブジェクトとして扱われる認識だったのですが 加算を意味する[+]はオブジェクトに対して使用できないのでしょうか・・・? ここでいうオブジェクトとは.Gettype()で型を調べた際にsystem.object[]と表示されるものを示します。
Zuishin

2020/04/02 10:04

@(1, 2, 3) + 4 を実行すると 1, 2, 3, 4 になります。 左辺が配列であれば加算で要素を増やせるので、右辺は配列である必要はありません。 なにか別の理由でうまくいったんだと思います。
Zuishin

2020/04/02 10:09

関係あるかどうかわかりませんが、PowerShell の配列は癖があります。 たとえば次のコードを実行します。 $a = (1, 2, 3) $a.Length $a.GetType() $a は要素数 3 の配列です。 $b = ,(1, 2, 3) $b.Length $b.GetType() $b は要素数 1 の配列です。
beginner_Jiro

2020/04/03 01:43

Zuishin様 いつもお世話になっております。 いつも詳細なご説明ありがとうございます。 加算で要素を増やす・・・。 コードの全文をすべて記載しておらず(あまりにも可読性が無く恥ずかしくて載せれませんでしたすいません。)お伝えできなかった部分があります。 修正前の下記コード $_RepObj += $Repdateの右辺に入っている値は文字列になります。 もしも、power shell側がZuishin様のご記載の通り右辺の値で要素を追加しようとしていたら 中身が文字列の為、原因のエラーが出てしまうのもうなずけます。 左辺が配列(要素数1)に対し、右辺も配列(要素数1)として(今回の@()処理)場合加算を行ったら、暗黙的に 配列の要素1の値が加算されていき問題なく通った・・・ということだと思うのですがいかがでしょう・・・。
Zuishin

2020/04/03 02:01

さあ。実際何が入っているかわからないので何とも言えません。ただ、別の問題の気がします。
beginner_Jiro

2020/04/03 04:52

Zuishin様 ご回答ありがとうございます。 わかりました。しかしエラー解消は行えましたのでありがとうございます。 またご機会ございましたらご回答いただければ幸いです。 助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問