233

これは簡単な作業ですが、実行されたコマンドレットが配置されているディレクトリへのパスを取得する方法についていくつかの試みがあり、成功はさまざまです。たとえば、にC:\temp\myscripts\mycmdlet.ps1設定ファイルがあるを実行する場合、内の変数C:\temp\myscripts\settings.xmlに格納できるようにしたいと思います。C:\temp\myscriptsmycmdlet.ps1

これは機能する1つの解決策です(少し面倒ですが):

$invocation = (Get-Variable MyInvocation).Value
$directorypath = Split-Path $invocation.MyCommand.Path
$settingspath = $directorypath + '\settings.xml'

別の1つは、テスト環境でのみ機能するこのソリューションを提案しました。

$settingspath = '.\settings.xml'

私は後者のアプローチがとても好きで、毎回ファイルパスをパラメーターとして解析するよりも好きですが、開発環境で動作させることができません。私は何をすべきか?PowerShellの構成方法と関係がありますか?

4

19 に答える 19

178

これを行う信頼できる方法は、あなたが示したのと同じです$MyInvocation.MyCommand.Path

相対パスの使用は、PowerShell では $pwd、アプリケーションの現在のディレクトリ、または .NET API の現在の作業ディレクトリに基づいています。

PowerShell v3+ :

自動変数を使用します$PSScriptRoot

于 2011-12-06T21:15:05.573 に答える
46

以下も使用できます。

(Resolve-Path .\).Path

括弧内の部分はオブジェクトを返しPathInfoます。

(PowerShell 2.0 以降で使用できます。)

于 2015-05-27T02:23:38.833 に答える
39

試す :

(Get-Location).path

また:

($pwd).path
于 2016-01-10T08:51:02.047 に答える
12

は1行のソリューションが好きです:)

$scriptDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
于 2015-12-17T12:44:23.227 に答える
1

パスとして '.\' を使用することは、それが呼び出しパスであることを意味すると考えるでしょう。しかし、いつもではありません。たとえば、ジョブ ScriptBlock 内で使用する場合。その場合、%profile%\Documents を指している可能性があります。

于 2013-12-06T13:05:38.273 に答える
1

これが私が思いついたものです。これは、パスを見つけるための複数の方法を含む配列であり、現在の場所を使用し、null\空の結果を除外し、null 以外の最初の値を返します。

@((
  ($MyInvocation.MyCommand.Module.ModuleBase),
  ($PSScriptRoot),
  (Split-Path -Parent -Path $MyInvocation.MyCommand.Definition -ErrorAction SilentlyContinue),
  (Get-Location | Select-Object -ExpandProperty Path)
) | Where-Object { $_ })[0]
于 2021-07-16T13:18:36.693 に答える
-1

私は同様の問題を抱えており、PowerShell (完全なエンド ユーザー GUI アプリケーション) で記述されたプログラムを作成しており、ディスクからロードする必要があるファイルとリソースがたくさんあるため、多くの問題が発生しました。私の経験から、.現在のディレクトリを表すために使用することは信頼できません。現在の作業ディレクトリを表す必要がありますが、そうでないことがよくあります。PowerShell は、PowerShell が内部で呼び出された場所を保存しているよう.です。より正確には、PowerShell を最初に起動すると、デフォルトでホーム ユーザー ディレクトリ内で起動します。それは通常、ユーザーアカウントのディレクトリです。C:\USERS\YOUR USER NAME. その後、PowerShell は、PowerShell プロンプトを表示するかスクリプトを実行する前に、ディレクトリを呼び出し元のディレクトリ、または実行中のスクリプトが配置されているディレクトリに変更します。ただし、これは、PowerShell アプリ自体が最初にホーム ユーザー ディレクトリ内で起動した後に発生します。

And.は、PowerShell が開始された初期ディレクトリを表します。その.ため、必要なディレクトリから PowerShell を呼び出した場合にのみ、現在のディレクトリを表します。後で PowerShell コードでディレクトリを変更すると.、すべてのケースで変更が内部に反映されていないように見えます。場合によって.は、現在の作業ディレクトリを表し、他のディレクトリでは PowerShell (スクリプトではなくそれ自体) が呼び出され、一貫性のない結果につながる可能性があります。このため、インボーカー スクリプトを使用します。内部に単一のコマンドを含む PowerShell スクリプト: POWERSHELL. これにより、必要なディレクトリから PowerShell が呼び出されるようになるため、.現在のディレクトリを表します。ただし、後で PowerShell コードでディレクトリを変更しない場合にのみ機能します。スクリプトの場合、ファイル オプションが含まれていることを除いて、最後に述べたものと同様の呼び出しスクリプトを使用します POWERSHELL -FILE DRIVE:\PATH\SCRIPT NAME.PS1。これにより、現在の作業ディレクトリ内で PowerShell が開始されます。

スクリプトをクリックするだけで、スクリプトがどこにあるかに関係なく、ホーム ユーザー ディレクトリから PowerShell が呼び出されます。現在の作業ディレクトリはスクリプトが配置されているディレクトリですが、PowerShell 呼び出しディレクトリはC:\USERS\YOUR USER NAMEであり.、状況に応じてこれら 2 つのディレクトリのいずれかを返すという結果になり、ばかげています。

しかし、このすべての騒ぎと呼び出し元スクリプトの使用を避けるために、現在の作業ディレクトリまたはスクリプトが呼び出されたディレクトリを表したい天候に応じて、現在のディレクトリを表す代わりに$PWDorを使用することができます。また、何らかの理由で、返された 2 つのディレクトリのうち他のディレクトリを取得したい場合は、 を使用できます。$PSSCRIPTROOT..$HOME

私は個人的に、メインのアプリ スクリプトを呼び出す PowerShell で開発したアプリのルート ディレクトリ内に呼び出し元スクリプトを持っているだけで、アプリのソース コード内の現在の作業ディレクトリを決して変更しないことを忘れないでください。これについて心配する必要はありません。.現在のディレクトリを表し、アプリケーションで問題なく相対ファイルのアドレス指定をサポートするために使用できます。これは、PowerShell の新しいバージョン (バージョン 2 より新しい) で機能するはずです。

于 2019-11-03T17:26:12.163 に答える