2011-01-18 7 views
102

スクリプトの現在のディレクトリを使用してPowerShellスクリプトを実行しています。したがって、そのディレクトリの内部では、.\script.ps1を実行すると正しく動作します。PowerShell:スクリプトのディレクトリからコマンドを実行します。

今、スクリプトの参照先ディレクトリを変更せずに、そのスクリプトを別のディレクトリから呼び出す必要があります。だから、私は..\..\dir\script.ps1に電話して、そのスクリプトがそのディレクトリの中から呼び出されたときに動作するようにします。

どのようにすればよいですか、またはどのディレクトリからでも実行できるようにスクリプトを変更するにはどうすればよいですか?

答えて

146

スクリプトの横のファイルを参照できるように、スクリプトの独自のパスが必要なのですか?試してみてください:

$scriptpath = $MyInvocation.MyCommand.Path 
$dir = Split-Path $scriptpath 
Write-host "My directory is $dir" 

$ MyInvocationとそのプロパティから多くの情報を得ることができます。

あなたは現在の作業ディレクトリ内のファイルを参照したい場合は、解決パスを使用するかは、Get-ChildItemコマンドレットを:(OPからのコメントに基づいて)

$filepath = Resolve-Path "somefile.txt" 

EDIT:

# temporarily change to the correct folder 
Push-Location $folder 

# do stuff, call ant, etc 

# now back to previous directory 
Pop-Location 

おそらくInvoke-Commandを使って同様のことを達成する他の方法があります。

+1

ええ、大丈夫ですか、多分私のスクリプトについてもう少し明確にすべきでした。実際には、いくつかのパラメータで 'ant'を呼び出すスクリプトです。だから私はそのフォルダから 'ant'を呼び出して、設定ファイルが正しく見つかるようにしなければなりません。理想的には、一時的にそのスクリプト内の実行ディレクトリをローカルに変更するものを探しています。 – poke

+3

ああ、その場合には 'Push-Location'と' Pop-Location'を気にするでしょう – JohnL

+4

$ MyInvocationは文脈に敏感です、私は通常$ ScriptPath =(Get-Variable MyInvocation -Scope Script).Value.MyCommand 。任意の種類のネストまたは関数から動作するパス –

27

ネイティブアプリを呼び出す場合は、[Environment]::CurrentDirectoryについて、PowerShellの$PWDの現在のディレクトリについては心配する必要があります。なんらかの理由で私が逃げ出すのはPowerShell does not set the process' current working directory when you Set-Location or Push-Locationなので、それを期待するアプリケーション(またはコマンドレット)を実行している場合は、必ず実行する必要があります。スクリプトで

、あなたがこれを行うことができます:

Push-Location $MyInvocation.MyCommand.Path 
[Environment]::CurrentDirectory = $PWD 
## Your Script Code ... 
Pop-Location 
[Environment]::CurrentDirectory = $PWD 

をこのへの確実な代替手段はありません。私たちの多くは、プロンプトに[Environment] :: CurrentDirectoryを設定する行を置いていますが、スクリプトの場所を変更するときには役に立ちません。

最終ノート:$PWDは、必ずしも正当なCurrentDirectoryではありません(たとえば、レジ​​ストリプロバイダにCDを書き込むことがあります)。これをプロンプトまたは* -Locationコマンドレットのラッパー関数に入れる場合は、

+3

パスプロバイダのためにプロセスの作業ディレクトリは変更されません。レジストリ、SQLデータベースまたはIISハイブなどにCD'ingしている可能性があります。 – piers7

+1

はい。私が知っているのは、それが最後の "最終的なメモ"のポイントでした。彼らは(私のプロンプト機能で)世界の他のすべてのシェルのように、FileSystemプロバイダの現在の場所にそれを更新することができました。 – Jaykul

+0

神聖なスクリプティングの神々、私はそれを打ち消しました。\ _ /。 ' - この死んだ半分のために!人々、真剣に?本当に?.. – ulidtko

11

実行スクリプトと同じディレクトリにあるモジュールをインポートするために、次のコードをよく使用します。それは最初のPowerShellが

$電流経路=分割経路を実行しているディレクトリを取得します((ゲット-変数 MyInvocation -Scope 0).Valueの).MyCommand.Path

インポートモジュール」 $ currentPath \ sqlps.ps1 "

+0

-Scopeをスクリプトに設定する –

16

あなたの質問を読むと、スクリプトが実行されているディレクトリではなく、スクリプトがあるディレクトリを知りたいと思ったと思います。あなたはPowerShellのの自動変数

例えば
$PSScriptRoot - the directory where the script exists, not the target directory the script is running in 
$PSCommandPath - the full path of the script 

との情報を得ることができ、私は、Visual Studioのソリューションファイルを見つけて、それを起動する$プロファイルスクリプトを持っています。ソリューションファイルを起動すると、完全なパスを保存したかったのです。しかし、元のスクリプトが存在する場所にファイルを保存したかったのです。だから私は$ PsScriptRootを使った。

1

まあ、CLIのスクリプトを一切使わずにこの解決策を探していました。これは、私はそれがXD行う方法です。

  • ナビゲートスクリプトを実行したいからフォルダへ

    ..\..\dir

  • 今すぐダブルで場所を囲む(重要なことは、あなたがタブ補完を持っているということです)それらの内部にはcdが追加されているので、powershellの別のインスタンスを呼び出すことができます。

    "cd ..\..\dir"

  • で、;で区切られたスクリプトを実行するために別のコマンドを追加します。最後のPowerShell

    start powershell "cd..\..\dir\; script.ps1"の別のインスタンスでそれを実行します

    "cd ..\..\dir\; script.ps1"

  • PowerShellのコマンドの区切りであります

これにより、新しいパワーシェルウィンドウが開き、..\..\dirに移動し、script.ps1を実行してウィンドウを閉じます。


";"最初に失敗した場合は2番目に失敗し、次の後には、次の後に...コマンドを区切ります。新しいpowershellウィンドウを開いたままにしたい場合は、渡されたコマンドに-noexitを追加します。私が最初に望むフォルダに移動するので、タブの補完を使うことができます(二重引用符で囲むことはできません)。

start powershell "-noexit cd..\..\dir\; script.ps1"

二重引用符を使用""ますので、これはうまく動作します、例えば名にスペースを

start powershell "-noexit cd '..\..\my dir'; script.ps1"

0

をディレクトリを渡すことができます。

Push-Location $PSScriptRoot 

Write-Host CurrentDirectory $CurDir 
関連する問題