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?

War es hilfreich?

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

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top