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

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

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

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

Q&A

解決済

1回答

4192閲覧

PowerShellのモジュール内に書かれたFunction から 呼び出し元のスクリプトパスを確認したい。

kamikazelight

総合スコア305

PowerShell

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

0グッド

1クリップ

投稿2019/03/08 08:26

編集2019/03/08 08:28

前提・実現したいこと

タイトルのままですが
PowerShellのモジュール内に書かれたFunction から 呼び出し元のスクリプトパスを確認したいです。
もともとPs1に書いたFunctionでは

powershell

1Function Caller() 2{ 3 "InvocationName : $($Script:myInvocation.InvocationName)" 4 "Definition : $($Script:myInvocation.MyCommand.Definition)" 5 "Path : $($Script:myInvocation.MyCommand.Path)" 6}

っとするだけで確認出来ていたのですが
このFunctionをpsm1 に保存しただけで全滅しました。
ドットソースではなく & で読み込んでも同様に失敗しました。

色々調べたりしたのですが
解決策を見つけられませんでした。

方法はないのでしょうか?
お願い致します。

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

powershell_ISE v5.1
PowerSHell v5.1

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

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

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

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

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

guest

回答1

0

ベストアンサー

求めるところをいまいちつかみきれていないのですが、以下の関数の出力の中に求めるものはあるでしょうか?

powershell

1Function Caller2 2{ 3 # $MyInvocation から出力したい情報の設定(Select-Object 用の形式)。 4 [array]$properties = @( 5 @{N='Scope';E={}} # これだけは先頭に置いておくこと 6 'InvocationName' 7 'ScriptName' 8 'PSCommandPath' 9 'PSScriptRoot' 10 @{N='Name' ;E={$_.MyCommand.Name}} 11 @{N='Definition' ;E={$_.MyCommand.Definition}} 12 @{N='Source' ;E={$_.MyCommand.Source}} 13 @{N='ModuleName' ;E={$_.MyCommand.ModuleName}} 14 @{N='Path' ;E={ 15 if($_.MyCommand -is [System.Management.Automation.ExternalScriptInfo]) { 16 $_.MyCommand.Path 17 } 18 } 19 } 20 ) 21 22 # 基本の 3 スコープについて確認。 23 ([ordered]@{ 24 Local = $Local:MyInvocation 25 Script = $Script:MyInvocation 26 Global = $Global:MyInvocation 27 }).GetEnumerator() | 28 ForEach-Object -Process { 29 $properties[0].E = [scriptblock]::Create("'{0}'" -f $_.Key) 30 $_.Value | Select-Object -Property $properties 31 } 32 33 # スコープを遡って情報出力。Local -> Global 34 [int]$lv = 0 35 while ($true) { 36 try { 37 [System.Management.Automation.InvocationInfo]$inv = 38 (Get-Variable -Name MyInvocation -Scope $lv -ErrorAction Stop).Value 39 40 $properties[0].E = [scriptblock]::Create("'{0}'" -f $lv++) 41 $inv | Select-Object -Property $properties 42 } catch { 43 #$_ 44 break 45 } 46 } 47}

投稿2019/03/08 11:55

imihito

総合スコア2166

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

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

kamikazelight

2019/03/09 02:09

求めている情報が 含まれていました。 普段全く使わない書き方がたくさんあって混乱していますが 理解できるよう頑張ります。 今回もありがとうございました。
imihito

2019/03/09 03:22

色々なスコープの $MyInvocation からそれっぽい情報を抽出しています。 取得対象を使い回したい&オブジェクトにして扱いやすくしたい、の観点から Select-Object で使える形式で取得対象を定義しています。 その上で、まずは Local / Script / Global の基本的なスコープについて出力→ Get-Variable の Scope 指定で、最下位から最上位のスコープまで出力、としています。 スコープの情報も結果に含めたかったので、動的に scriptblock を定義しているのがちょっとトリッキーな感じではありますが…
kamikazelight

2019/03/09 04:16

補足説明 ありがとうございます。 気になったので教えて頂きたいのですが $properties 内の N と E は Select-Object の -Property パラメータに必要な Name と Expression だということは help Select -full で分かったのですが この N と E はエイリアスでしょうか?
imihito

2019/03/09 05:18

N と E はどこかに記事に書かれていて省略できることを知ったものです。 PowerShell の以下の挙動を考えると、個人的に納得感はあります。 1. コマンドレットなどの名前付きパラメータは、結果として一つのパラメータに特定できれば、途中までの入力でも良い 例:`Get-ChildItem -Name`の代わりに`Get-ChildItem -N`と書いても良い 2. ハッシュテーブルの Key をパラメータ名、 Value を値としてコマンドレットなどに渡すことができる(スプラッティング) この時も 1. のパラメータの推測は行われる 例: $a = @{N=$true} Get-ChildItem @a 仮に上記のような動作が行われている場合、N と E をエイリアスと言うのはちょっと変な気がします(Name の代わりに Label を使えるのはエイリアスと言っても良い気はしますが)
kamikazelight

2019/03/09 07:43

Label も使えるのですね Get-help で見て - Name (or Label) <string> って書いてあって何だろう...っと思っていました。 パラメーターが特定できれば省略できる というのがうろ覚えだったので安心しました。 すみません 追加で教えて頂きたいのですが モジュールを読み込んだ際にそのまま処理をしてしまいたいと思い 試したのですがうまくいきませんでした。 今回教えて頂いた中に モジュールを読み込むだけで モジュール内の関数を外から呼び出さない場合に 呼び出し元を取得できる方法が無いか確認するために Caller2が定義されているモジュール内に Caller2 | ConvertTo-Json | Out-File -FilePath "D:\Users\Desktop\put.txt" と書いてJsonで出力して確認したのですが全滅でした... 特にGrobal は 出力すらされませんでした。 モジュールが読み込まれたときにそのまま処理をしたい場合は 呼び出し元のパスを取得することは 出来ないのでしょうか?
kamikazelight

2019/03/09 07:51

モジュールでそんな処理をすること自体おかしいですよね。 その処理単体でスクリプトファイルにするか 関数として定義して 他ののモジュールとまとめるか します。 ps1 と psm1 の使い分けが出来てませんでした。 先程の質問は スルーしてください。 すみませんでした。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問