これは簡単な作業ですが、実行されたコマンドレットが配置されているディレクトリへのパスを取得する方法がいくつか試みられています。例えば、設定ファイルが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の$ pwd、アプリケーションの現在のディレクトリ、または.NET APIの現在の作業ディレクトリに基づきます。
PowerShell v3 +:
自動変数$PSScriptRoot
を使用してください。
はい、それでうまくいきます。しかし、絶対パスを確認する必要がある場合は、これで十分です。
(Get-Item -Path ".\").FullName
最も簡単な方法は、次の定義済み変数を使用することです。
$PSScriptRoot
about_Automatic_Variables
と about_Scripts
は両方とも状態:
PowerShell 2.0では、この変数はスクリプトモジュール(.psm1)でのみ有効です。 PowerShell 3.0以降、すべてのスクリプトで有効になりました。
私はこれをこんな風に使っています:
$MyFileName = "data.txt"
$filebase = Join-Path $PSScriptRoot $MyFileName
パスはしばしば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("\"));
}
}
試してください:
(Get-Location).path
または
($pwd).path
Get-Location
は現在の場所を返します。
$Currentlocation=Get-Location
私は一行 解決策 が好きです:)
$scriptDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
これを試して:
$WorkingDir = Convert-Path .
Powershell 3以降では単純に使うことができます
$PSScriptRoot
あなたはパスとして '。\'を使うことがそれが呼び出しパスであることを意味すると思うでしょう。しかしいつもではありません。あなたがScriptBlockジョブの中でそれを使うならば、例。その場合は、%profile%\ Documentsを指す可能性があります。
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
}
}