2016-12-30 13 views
1

私が持っているものは、それぞれがそのことをしている機能のモジュールです。Powershell:プッシュロケーションディレクトリの範囲をどうにか操作できますか?

私が望むのは、すべての関数が呼び出されたディレクトリをスタックにプッシュして、元のコマンドを使用したディレクトリをトレースするだけでなく、失敗した場合に再び呼び出すことができるということです。

pushdを関数本体に追加することは、関数のスタックがそのスコープ内にあるので役に立たない。私はGet-Location -Stackの結果をグローバル変数に割り当てて、モジュール内のSet-Locationにパイプしてみましたが、それは役に立たなかったようです。

関数内のpushdのスコープをグローバルに強制変更できる方法はありますか?あるいは私がトレースバックを作ることができる他の方法?私はパスの配列として自分のグローバルスタックを書くことができますし、私は推測するカスタム関数でそれを管理することができますが、私はここで何かを見逃す可能性がありますか?

UPDATE:機能をグローバルにpushdその身体から定義されている場合は確かに世界的なスタックを変更しますが、機能が何らかの理由でモジュールから供給されている場合、それは動作しません。

+0

私の知る限り、位置スタックは、グローバルおよび関数にスコープされません。それは別の方法であるという証拠はありますか? – PetSerAl

+0

@PetSerAlそれは実際には奇妙になります。PowerShell ISEの 'pushd'を使ってスクリプトを作成して実行すると(グローバルスコープで定義された関数)、' popd'は外でうまく動作しますが、インポートされたモジュールの関数 - それはありません。スタックを定義スコープにバインドすることは、モジュールには意味をなさないが、今のところ私のように見える。 – ephemeris

+0

あなたは正しい、@エフェメリスです。私が見ているいくつかのテストの後、ロケーションスタックのスコープは 'SessionState'になります。これはモジュールごとに異なりますが、同じモジュールの2つの関数は同じロケーションスタックを使用する必要があります。 – PetSerAl

答えて

2

-StackNameのパラメータがPush-Locationの場合、グローバルスタックが作成されるかどうかはわかりませんが、おそらくそうではないと思います。テストに値するかもしれません。

独自のスタックオブジェクトを作成し、それを渡すためのすべての関数のパラメータを作成するか、グローバル変数またはスクリプトスコープ変数としてスタックを作成するのが最も簡単な場合があります。スクリプトスコープとして

$Global:PathStack = New-Object -TypeName 'System.Collections.Generic.Stack[System.Management.Automation.PathInfo]'; 

:グローバルとして

$PathStack = New-Object -TypeName 'System.Collections.Generic.Stack[System.Management.Automation.PathInfo]'; 
$PathStack.Push((Get-Location)); 
$PathStack.Push((Push-Location -Path $NewPath -PassThru)); 
Set-Location -Path ($PathStack.Pop()); 
Set-Location -Path ($PathStack.Pop()); 

$Script:PathStack = New-Object -TypeName 'System.Collections.Generic.Stack[System.Management.Automation.PathInfo]'; 
関連する問題