質問

これは簡単な作業になるはずですが、実行されたcmdletが複雑な成功を収めているディレクトリへのパスを取得する方法についていくつかの試みを見てきました。たとえば、実行するとき C:\temp\myscripts\mycmdlet.ps1 に設定ファイルがあります C:\temp\myscripts\settings.xml 保管できるようになりたいです C:\temp\myscripts 内の変数 mycmdlet.ps1.

これは、機能する1つのソリューションです(少し面倒ですが):

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

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

$settingspath = '.\settings.xml'

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

役に立ちましたか?

解決

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

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

PowerShell V3+:

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

他のヒント

はい、それはうまくいくはずです。しかし、絶対的なパスを見る必要がある場合、これはあなたが必要とするすべてです:

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

最も簡単な方法は、次の事前定義された変数を使用することです。

 $PSScriptRoot

about_Automatic_Variablesabout_Scripts 両方の状態:

PowerShell 2.0では、この変数はスクリプトモジュール(.PSM1)でのみ有効です。 PowerShell 3.0から始まり、すべてのスクリプトで有効です。

私はこのようにそれを使用します:

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

使用することもできます。

(Resolve-Path .\).Path

ブラケットの部分はaを返します PathInfo 物体。

(PowerShell 2.0以来利用可能。)

パスはしばしばヌルです。この機能はより安全です。

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("\"));
    }
}

試す :

(Get-Location).path

また:

($pwd).path

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

$Currentlocation = Get-Location

好き ワンラインソリューション :)

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

これを試して:

$WorkingDir = Convert-Path .

PowerShell 3以上では、単純に使用できます

$PSScriptRoot

パスとして '。'を使用することは、それが呼び出しパスであることを意味すると思うでしょう。しかし、常にではありません。たとえば、Job ScriptBlock内で使用する場合。その場合、%プロファイル%ドキュメントを指す場合があります。

単一ラインのソリューションであることが価値があることについては、以下は私にとって有効なソリューションです。

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

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

上記の投稿を使用しています ゲットロケーション cmdlet。

@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
    }

}

現在のディレクトリの名前だけが必要な場合は、次のようなことをすることができます。

((Get-Location) | Get-Item).Name

c: temp location myworkingdirectory>で作業していると仮定します

出力

myworkingdirectory

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top