実行中のcmdletの現在のディレクトリを取得する方法
-
27-10-2019 - |
質問
これは簡単な作業になるはずですが、実行された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_Variables
と about_Scripts
両方の状態:
PowerShell 2.0では、この変数はスクリプトモジュール(.PSM1)でのみ有効です。 PowerShell 3.0から始まり、すべてのスクリプトで有効です。
私はこのようにそれを使用します:
$MyFileName = "data.txt"
$filebase = Join-Path $PSScriptRoot $MyFileName
パスはしばしばヌルです。この機能はより安全です。
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