web-dev-qa-db-ja.com

実行されているコマンドレットの現在のディレクトリを取得する方法

これは簡単な作業ですが、実行されたコマンドレットが配置されているディレクトリへのパスを取得する方法がいくつか試みられています。例えば、設定ファイルが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'

もう一つは私達のテスト環境でしか働かないこの解決策を提案しました:

$settingspath = '.\settings.xml'

私は後者のアプローチが大好きで、毎回パラメータとしてファイルパスを解析しなければならないことを好むのですが、私の開発環境で動作させることはできません。誰が何をすべきかについて提案がありますか? PowerShellの構成方法と関係がありますか?

177
Stig Perez

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

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

PowerShell v3 +

自動変数$PSScriptRootを使用してください。

114
JasonMArcher

はい、それでうまくいきます。しかし、絶対パスを確認する必要がある場合は、これで十分です。

(Get-Item -Path ".\").FullName
234
GuruKay

最も簡単な方法は、次の定義済み変数を使用することです。

 $PSScriptRoot

about_Automatic_Variablesabout_Scripts は両方とも状態:

PowerShell 2.0では、この変数はスクリプトモジュール(.psm1)でのみ有効です。 PowerShell 3.0以降、すべてのスクリプトで有効になりました。

私はこれをこんな風に使っています:

 $MyFileName = "data.txt"
 $filebase = Join-Path $PSScriptRoot $MyFileName
77
Tony Sheen

また使用することができます:

(Resolve-Path .\).Path

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

(PowerShell 2.0以降で利用可能です。)

42
Alex Angas

パスはしばしばnullです。この機能は安全です。

function Get-ScriptDirectory
{
    $Invocation = (Get-Variable MyInvocation -Scope 1).Value;
    if($Invocation.PSScriptRoot)
    {
        $Invocation.PSScriptRoot;
    }
    Elseif($Invocation.MyCommand.Path)
    {
        Split-Path $Invocation.MyCommand.Path
    }
    else
    {
        $Invocation.InvocationName.Substring(0,$Invocation.InvocationName.LastIndexOf("\"));
    }
}
32
Christian Flem

試してください:

(Get-Location).path

または

($pwd).path
24
Rohin Sidharth

Get-Locationは現在の場所を返します。

$Currentlocation=Get-Location
15
Veera Induvasi

私は一行 解決策 が好きです:)

$scriptDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
12
FrankyHollywood

これを試して:

$WorkingDir = Convert-Path .

Powershell 3以降では単純に使うことができます

$PSScriptRoot

3
BlackSpy

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

1
syanzy

1行のソリューションになる価値があるので、以下が私にとって実用的なソリューションです。

$currFolderName = (Get-Location).Path.Substring((Get-Location).Path.LastIndexOf("\")+1)

最後の1は/を無視することです。

上記のGet-Locationコマンドレットを使用した投稿のおかげで

@Cradleの答えを詳しく説明すると、 多目的関数 を書くこともできます。これにより、OPの質問に対して同じ結果が得られます。

Function Get-AbsolutePath {

    [CmdletBinding()]
    Param(
        [parameter(
            Mandatory=$false,
            ValueFromPipeline=$true
        )]
        [String]$relativePath=".\"
    )

    if (Test-Path -Path $relativePath) {
        return (Get-Item -Path $relativePath).FullName -replace "\\$", ""
    } else {
        Write-Error -Message "'$relativePath' is not a valid path" -ErrorId 1 -ErrorAction Stop
    }

}
0
Erutan409