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

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

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

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

Q&A

解決済

1回答

894閲覧

`Current`とは何のことでしょうか?

ShortArrow

総合スコア141

PowerShell

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

0グッド

0クリップ

投稿2020/04/10 04:38

編集2020/04/10 05:29

#コード
このコードはWindowsにインストールすることができるオプション機能のうち、
SSHクライアント機能とSSHサーバー機能をインストールするものです。

get-WindowsCapability -Onlineでインストール可能な機能の一覧を取得します。
その中からSSHだけを選別してインストールします。

powershell

1[Object[]]$input 2$input=get-WindowsCapability -Online | Where-Object -Property Name -Match "^OpenSSH.*" 3[Microsoft.Dism.Commands.BasicCapabilityObject]$serverdata 4$serverdata=$input| Where-Object -Property Name -Match ".*Server.*" 5[Microsoft.Dism.Commands.BasicCapabilityObject]$clientdata 6$clientdata=$input| Where-Object -Property Name -Match ".*Client.*" 7 8if ($server.State -ne 'Installed') { 9 # Install the OpenSSH Server 10 Add-WindowsCapability -Online -Name $serverdata.Name 11} 12if ($client.State -ne 'Installed') { 13 # Install the OpenSSH Client 14 Add-WindowsCapability -Online -Name $clientdata.Name 15}

#やりたいこと
PowerShell7でコードを書いていて、インテリセンスを利かせるために、
以下のように型を明示するようにしました。

powershell

1[Microsoft.Dism.Commands.BasicCapabilityObject]$clientdata

#問題
これを実行してみると、以下のように表示されます。

Current -------

#やったこと
要らないので、以下のように$nullを代入する操作に変えてみたら出力は消えました。

powershell

1[Microsoft.Dism.Commands.BasicCapabilityObject]$clientdata=$null

#質問
Currentとは何のことでしょうか?
------があることにより、何か続きがありそうな感じもします。

#実行環境

  • Powershell 7
  • Windows 10 Pro

#ウォッチ
プロパティを確認してみてもCurrentは見つかりません。
ウォッチ

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

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

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

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

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

Zuishin

2020/04/10 04:43

そのようなプロパティがあるのでしょう。
ShortArrow

2020/04/10 05:03

ご指摘いただいて、改めてウォッチ式を確認してみました。 ここにないということは、何か`Current`という特殊なプロパティがあったりするのでしょうか。
ShortArrow

2020/04/10 05:03

質問に追記しました。
Zuishin

2020/04/10 05:14

$clientdata に列挙子が入っているのではありませんか? それならウォッチ式では出なかったと思います。 $clientdata をどのように取得しているか示してください。
ShortArrow

2020/04/10 05:31

$clientdataの取得を行っているコードを載せました。
Zuishin

2020/04/10 05:32

Where-Object を使っているので多分列挙子ですね。$clientdata[0] を表示するとどうなりますか?
ShortArrow

2020/04/10 06:14

ウォッチ式に$clientdata[0]を追加すると"Microsoft.Dism.Commands.BasicCapabilityObject"と表示されました。 デバッグコンソールに$clientdata[0]を入力すると以下2行が出力されます。 Name : OpenSSH.Client~~~~0.0.1.0 State : Installed
Zuishin

2020/04/10 06:18

間違えました。列挙子ではなく、反復子です。今から回答を作ります。
Zuishin

2020/04/10 07:28

回答しました。これで解決した場合は解決済みにしてください。
Zuishin

2020/04/10 09:11 編集

「間違えました」と言いましたが、よく調べたところ、逆にその後の方が間違えていたようです。 C# では列挙体の要素を列挙子と言いますが、 https://docs.microsoft.com/ja-jp/dotnet/csharp/language-reference/language-specification/enums IEnumerator を実装するオブジェクトのことも列挙子と言います。 https://docs.microsoft.com/ja-jp/dotnet/api/system.collections.ienumerator.movenext?view=netframework-4.8 つまり、同じ言葉を二つの意味で使っているようです。 そして反復子は yield return の含まれたメソッドのことを言うようです。 https://docs.microsoft.com/ja-jp/dotnet/csharp/programming-guide/concepts/iterators 混乱してすみませんでした。
guest

回答1

0

ベストアンサー

IEnumerator

.NET では、IEnumerator インターフェース(および IEnumerator<T> インターフェース)を使用してオブジェクトを列挙します。

このうち PowerShell で使用するのは型の無い方の IEnumerator です。
IEnumerator インターフェイス (System.Collections) | Microsoft Docs

IEnumerable

Where-Object などで要素を列挙する際には、その要素を持つ配列などは IEnumerable インターフェースを実装していなければいけません。逆に配列やリストなどは IEnumerable インターフェースを持つから列挙できると言えます。

IEnumerable インターフェースには GetEnumerator メソッドがあり、それを呼び出すと IEnumerator インターフェースを実装するオブジェクトを返します。

Current

IEnumerator インターフェースには MoveNext メソッドと Current プロパティがあり、これらのメンバーを使用して要素の列挙を行います。(Reset メンバーは要らない子です)

つまり、質問の状態で表示されていたのは、この反復子であり、そのプロパティである Current です。

PowerShell による忖度

Current プロパティは、列挙された要素を保持するプロパティです。つまり IEnumerator である $clientdataCurrent プロパティを読み取ることによって Microsoft.Dism.Commands.BasicCapabilityObject 型のオブジェクトを取得します。

しかし、PowerShell は Current を自動的に読み取り、IEnumerator であるはずの $clientdataMicrosoft.Dism.Commands.BasicCapabilityObject 型に自動的にコンバートします。このため、Microsoft.Dism.Commands.BasicCapabilityObject 型のメソッドやプロパティをシームレスに呼び出すことができるのです。

しかし、本来は IEnumerator であるので、そのプロパティである Current が表示されていたということです。

余談

C# に反復子 yield が無かった時代には、その作成の複雑さから IEnumerable を実装するオブジェクトが IEnumerator を兼ねるよう作るのが普通でした。そのため、列挙子が IEnumerable を実装していることは多々あります。

IEnumerator しか実装していないオブジェクトを表示する場合はCurrent が表示されますが、IEnumerable を実装したオブジェクトの場合は、列挙が行われます。このため、列挙子が必ず Current を表示するわけではありません。

投稿2020/04/10 06:42

編集2020/04/10 09:14
Zuishin

総合スコア28669

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

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

ShortArrow

2020/04/10 08:57

ありがとうございます。Currentが何か大まかにわかりました。的確に用語を使っていらっしゃるので、さらに詳しく理解しようとするときにググりやすいです。助かります。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問