web-dev-qa-db-ja.com

PowerShellに相対ファイルを含める

このような擬似構文を持つスクリプトファイルを含めたいと思います。

Include '.\scripA.ps1'

しかし、私が見つけた唯一のものは次のようなものです。

$thisScript = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. ($thisScript + '.\scriptA.ps1')

それはいです。

Nice相対パスでスクリプトを含める方法はありますか?

53
alex2k8

残念ながらいいえ、良い方法はありません。 PowerShellは、V1ではこのアイデアをまったくサポートしていません。本当にあなたが取っているアプローチは最高のアプローチです

11
JaredPar

次のように$ PSScriptRootパラメーターを利用できます。

. "$PSScriptRoot\script.ps1"
99
chrischu

ファイルをドットソース(インクルード)できます:

。 。\ scriptA.ps1

スクリプトの完全なパスを取得するには:

Resolve-Path。\ scriptA.ps1

29
Shay Levy

すでに述べたように、ドットソーシングは特にきれいではありませんが、最も簡単なオプションです。ただし、この形式はほんの少しきれいになります:

$ScriptDirectory = Split-Path $MyInvocation.MyCommand.Path
. (Join-Path $ScriptDirectory ScriptA.ps1)

また、明示的にするのに便利な相対パスに関するメモ:元の投稿は、現在の作業ディレクトリ;実際には、意図は現在のスクリプトのソースディレクトリに関連することです(alex2k8の独自のコードサンプルが示すように)。したがって、これにより、現在のスクリプトは同じリポジトリの他のスクリプトにアクセスできます。

20
Michael Sorens

V2(Win7/2008R2以降のネイティブ。$psversiontable.psversion)次のようなファイルを簡単に含めることができます。

. "RelativeOrAbsolutePathToFile\include.ps1"

$result = FunctionInIncludeFile()

参照:
スクリプトでWindows PowerShell関数を再利用する方法

6
Ralph Willgoss

これはおそらくどのディレクトリからでも動作しますが、開始ディレクトリがインクルードしようとしているファイルの直接の先行ディレクトリではない場合は、sloooooowwwwwが見つかります。 IOW、この検索の開始点がc:\または他のドライブ文字のルートである場合、恐らく恐ろしく遅いでしょう。

。 $(Resolve-Path -literal $(gci -Recurse include.ps1))

これは、PC上でスクリプトを開発しているが、スクリプトをスケジュールされたタスクとして実行するサーバーに展開する必要がある場合に特にうまく機能します。

0
Brian

$ PSScriptRootおよび "Split-Path"ディレクティブを使用して、相対パスに対して正常に機能させることができます。 . (($PSScriptRoot | Split-Path | Split-Path)+'somedir\ps\script.ps1')

0
Michael