So erhalten Sie das aktuelle Verzeichnis des durchführenden CMDLET
-
27-10-2019 - |
Frage
Dies sollte eine einfache Aufgabe sein, aber ich habe mehrere Versuche gesehen, wie man den Weg zum Verzeichnis erreicht, in dem sich das ausgeführte CMDLet mit gemischtem Erfolg befindet. Zum Beispiel, wenn ich ausführe C:\temp\myscripts\mycmdlet.ps1
Welches hat eine Einstellungsdatei bei C:\temp\myscripts\settings.xml
Ich möchte in der Lage sein zu lagern können C:\temp\myscripts
in einer Variablen innerhalb mycmdlet.ps1
.
Dies ist eine Lösung, die funktioniert (obwohl etwas umständlich):
$invocation = (Get-Variable MyInvocation).Value
$directorypath = Split-Path $invocation.MyCommand.Path
$settingspath = $directorypath + '\settings.xml'
Ein anderer schlug diese Lösung vor, die nur in unserer Testumgebung funktioniert:
$settingspath = '.\settings.xml'
Ich mag den letzteren Ansatz sehr und bevorzuge es, den Filepath jedes Mal als Parameter analysieren zu müssen, aber ich kann es nicht dazu bringen, an meiner Entwicklungsumgebung zu arbeiten. Was soll ich tun? Hat es etwas damit zu tun, wie PowerShell konfiguriert ist?
Lösung
Der zuverlässige Weg, dies zu tun, ist genau wie Sie gezeigt haben $MyInvocation.MyCommand.Path
.
Die Verwendung von relativen Pfaden basiert auf $ PWD, in PowerShell, dem aktuellen Verzeichnis für eine Anwendung oder dem aktuellen Arbeitsverzeichnis für eine .NET -API.
Powershell v3+:
Verwenden Sie die automatische Variable $PSScriptRoot
.
Andere Tipps
Ja, das sollte funktionieren. Wenn Sie jedoch den absoluten Weg sehen müssen, ist dies alles, was Sie brauchen:
(Get-Item -Path ".\").FullName
Die einfachste Methode scheint darin bestehen, die folgende vordefinierte Variable zu verwenden:
$PSScriptRoot
about_Automatic_Variables
und about_Scripts
Beide Zustand:
In PowerShell 2.0 gilt diese Variable nur in Skriptmodulen (.psm1). Ab PowerShell 3.0 ist es in allen Skripten gültig.
Ich benutze es so:
$MyFileName = "data.txt"
$filebase = Join-Path $PSScriptRoot $MyFileName
Sie können auch verwenden:
(Resolve-Path .\).Path
Der Teil in Klammern gibt a zurück PathInfo
Objekt.
(Verfügbar seit PowerShell 2.0.)
Pfad ist oft null. Diese Funktion ist sicherer.
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("\"));
}
}
Versuchen :
(Get-Location).path
oder:
($pwd).path
Get-Location
Gibt den aktuellen Standort zurück:
$Currentlocation = Get-Location
Ich mag die Einzeilungslösung :)
$scriptDir = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
Versuche dies:
$WorkingDir = Convert-Path .
In PowerShell 3 und oben können Sie einfach verwenden
$PSScriptRoot
Sie würden denken, dass die Verwendung von '. ', Wie der Pfad bedeutet, dass es sich um den Aufrufpfad handelt. Aber nicht die ganze Zeit. Beispiel, wenn Sie es in einem Job -Skriptblock verwenden. In diesem Fall könnte es auf %Profil % Dokumente hinweisen.
Für das, was es wert ist, eine einzelne Lösung zu sein, ist das folgende für mich eine funktionierende Lösung.
$currFolderName = (Get-Location).Path.Substring((Get-Location).Path.LastIndexOf("\")+1)
Das 1 am Ende ist es, die zu ignorieren /
.
Vielen Dank an die obigen Beiträge mit dem Stammdarstellung cmdlet.
Um die Antwort von @cradle zu erweitern: Sie können auch a schreiben Mehrzweckfunktion Dadurch erhalten Sie das gleiche Ergebnis gemäß der Frage des 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
}
}
Wenn Sie nur den Namen des aktuellen Verzeichnisses benötigen, können Sie so etwas tun:
((Get-Location) | Get-Item).Name
Angenommen, Sie arbeiten von C: temp location myworkingDirectory>
Ausgabe
MyworkingDirectory