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

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

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

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

Q&A

1回答

2821閲覧

powershell クラス関数 括弧 構文エラー

ShortArrow

総合スコア141

PowerShell

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

0グッド

0クリップ

投稿2020/06/04 03:25

前提・実現したいこと

クラスの機能を勉強しています

functionを実装中に以下のエラーメッセージが発生しました。

このエラーをなくす方法を知りたいです。

発生している問題・エラーメッセージ

Missing '(' in class method parameter list Missing function body in function declaration

該当のソースコード

powershell

1class pstest { 2 [bool] $KeyAddress 3 function pstest{ 4 Param ( 5 #Target Registry Address 6 [Parameter(Mandatory)] 7 [string] 8 $KeyAddress, 9 # Target Property List 10 [Parameter(Mandatory)] 11 [List] 12 $KeyName 13 ) 14 $this.$KeyAddress 15 16 } 17 function test { 18 param ( 19 ) 20 return "a" 21 } 22} 23 24$testcase001 = New-Object pstest("Registry::HKCR\","Name") 25$testcase001.test 26

試したこと

paramの書き方や、エラーメッセージを検索しましたが、解決の糸口がつかめません。

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

######Vscode

  • バージョン: 1.45.1 (system setup)
  • コミット: 5763d909d5f12fe19f215cbfdd29a91c0fa9208a
  • 日付: 2020-05-14T08:27:35.169Z
  • Electron: 7.2.4
  • Chrome: 78.0.3904.130
  • Node.js: 12.8.1
  • V8: 7.8.279.23-electron.0
  • OS: Windows_NT x64 10.0.18363

######拡張機能

  • ms-vscode.powershellを使用

######powershell

  • PSVersion 7.0.1
  • PSEdition Core
  • GitCommitId 7.0.1
  • OS Microsoft Windows 10.0.18363
  • Platform Win32NT
  • PSCompatibleVersions {1.0, 2.0, 3.0, 4.0…}
  • PSRemotingProtocolVersion 2.3
  • SerializationVersion 1.1.0.1
  • WSManStackVersion 3.0

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

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

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

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

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

Zuishin

2020/06/04 03:59

クラスの書き方を知らないのに関係ない Param をググって侍や Qiita を見ているから解決の糸口がつかめないのであって、クラスの書き方を知らなければクラスの書き方を公式ヘルプで調べればいいんです。 わからないことがあったらまず Get-Help about_ を実行します。すると、何かについて説明したドキュメント一覧が並ぶので、そこから見ていきます。 この場合は about_Classes を見ると解決できます。
ShortArrow

2020/06/04 04:56

公式ドキュメントのリンクありがとうございます。 about_functionsとabout_Classを読み返しました。 ドキュメントに項目が無いということは、クラス関数ではparam書式が使用できないんですね。 powershell好きだったんですが、初めて嫌いなところが出来ました。 Powershell拡張機能にて、`function`スニペットを使用すると、 ```powershell function FunctionName { param ( OptionalParameters ) } ``` と出てくるので、勘違いして思い込みをしていました。先入観が怖いです。 function って先頭につきっぱなしですけど、これは関数宣言の書式ではなくて、戻り値の型なんですね。 Pythonの拡張機能では`function`スニペットで、`class function`か`nomal`かなど、選択できます。そこから類推して、Powershellではどちらも同じ書式だから区別する必要が無いから、スニペットもこうなっていると思ってしまいました。 今考えると、Powershellの`function`スニペットは`normal`と`advance`、`inline`の3種ありますが、 ふつうはどれでも書けるけど、クラス関数だけは`inline`しか使えないということなのかなと推理できます。 いつも`https://docs.microsoft.com/`のブックマークから階層を降りていくか、「Microsoft Docs」を検索ワードに含めて検索していたので、`Get-Help about_ `という使い方があるのは知らなかったです。ありがとうございます。
ShortArrow

2020/06/04 05:00

いまさらに精読していまして、気が付いたのですが、 ひょっとして、Powershellではmethodとfunctionって別次元の存在なのですか?
Zuishin

2020/06/04 05:34 編集

クラスに書くのは PowerShell の function(コマンドレット)でなく、.NET のメソッドなので、別物と思っておけばいいと思います。 例えばパラメーターセットは PowerShell 独自のシステムなので、.NET メソッドでは使えません。 呼び出す時も、function は引数を空白区切りで与えますが、.NET メソッドはカッコで包んでカンマ区切りで与えます。
ShortArrow

2020/06/04 05:44

ありがとうございます。 ほかの言語と同じ考え方で、なんとなくでコーディングできるだろうと、甘く見ていました。Powershellは、ひと味違いました。 ただ構文を知らないだけではなく、概念が存在しないものを作ろうとしていたとは。改めて、先入観が怖いです。
Zuishin

2020/06/04 06:01 編集

本来の PowerShell のオブジェクト指向は、継承を持たないインスタンスベースなんですが、.NET のクラスベースのオブジェクトも使うことができるため、二種類のオブジェクト指向システムがあることになります。COM も入れれば三種類ですね。PowerShell を使って .NET クラスの作成まで行いたいという要望から生まれたのが class 構文です。三種類のシステムはそれぞれ設計思想が違うため、これらが違うものだという意識を持っておいた方が良いと思います。 継承が必要ないのであれば、Add-Member で NoteProperty や ScriptMethod を追加することでオブジェクトを扱うことができます。作られた当初はこれで十分と思われていたんでしょうね。
guest

回答1

0

そもそもPoweShellには、classの中にfunctionを書く構文が存在しないのではないでしょうか?

https://docs.microsoft.com/ja-jp/powershell/scripting/dsc/resources/authoringresourceclass?view=powershell-7
https://www.vwnet.jp/Windows/PowerShell/2017082001/PSv5Class01.htm

質問に書いてあるコードには問題が多すぎて何をやりたいのか理解できませんが、以下コードのようにすればエラーが発生せずに動きます。

powershell

1class pstest { 2 [string] $KeyAddress 3 pstest([string] $KeyAddress, [string] $KeyName) { 4 $this.KeyAddress = $KeyAddress 5 } 6 [string] test() { 7 return $this.KeyAddress 8 } 9} 10 11$testcase001 = New-Object pstest("Registry::HKCR\","Name") 12$testcase001.test()

投稿2020/06/04 05:50

ku__ra__ge

総合スコア4524

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

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

ShortArrow

2020/06/04 07:55

ありがとうございます。書きかけで、そのまま投げた回答側のことを考えていないコードでした。それにもかかわらず的確な回答をいただきありがとうございます。 最終的に以下の内容で理解できました。 https://www.vwnet.jp/Windows/PowerShell/MakePSCredential.htm >>Class は拡張された function で内部に値(プロパティ)を持ち、メソッドで操作が出来ます。
Zuishin

2020/06/04 08:02

> Class は拡張された function で内部に値(プロパティ)を持ち、メソッドで操作が出来ます。 ちょっとこの表現は酷すぎるので、これで理解できたと思ったなら調べ直した方がいいと思います。そしてそのページを参考にするのはやめましょう。 高評価を取り消し、低評価します。 クラスでできなくて function でできることはありますし、function もプロパティを持ちます。
Zuishin

2020/06/04 08:04

またこのページでは、クラスとオブジェクトを混同しています。 分かりやすく見える嘘は本当を覆い隠し、本当のことをわかりにくくします。
ShortArrow

2020/06/04 08:21

ありがとうございます。最後まで学習を進める前に気が付かせていただいて助かりました。 ちゃんと公式ドキュメントを読むようにします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問