it-swarm.com.de

So rufen Sie das aktuelle Verzeichnis des ausgeführten Cmdlets ab

Dies sollte eine einfache Aufgabe sein, aber ich habe mehrere Versuche gesehen, wie der Pfad zu dem Verzeichnis abgerufen wird, in dem sich das ausgeführte Cmdlet befindet. Wenn ich zum Beispiel c:\temp\myscripts\mycmdlet.ps1 mit einer Einstellungsdatei unter c:\temp\myscripts\settings.xml ausführte, möchte ich c:\temp\myscripts in einer Variablen innerhalb von mycmdlet.ps1 speichern können.

Dies ist eine Lösung, die funktioniert (wenn auch 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 ziehe es vor, den Dateipfad jedes Mal als Parameter zu analysieren, aber ich kann ihn nicht dazu bringen, in meiner Entwicklungsumgebung zu arbeiten. Hat jemand einen Vorschlag, was zu tun ist? Hat dies etwas mit der Konfiguration von PowerShell zu tun?

169
Stig Perez

Der zuverlässige Weg, dies zu tun, ist so, wie Sie $MyInvocation.MyCommand.Path angezeigt haben.

Die Verwendung relativer Pfade basiert auf $ pwd, in PowerShell, dem aktuellen Verzeichnis für eine Anwendung oder dem aktuellen Arbeitsverzeichnis für eine .NET-API.

111
JasonMArcher

Ja das sollte funktionieren. Aber wenn Sie den absoluten Pfad sehen müssen, ist dies alles, was Sie brauchen:

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

Die einfachste Methode scheint die folgende vordefinierte Variable zu sein:

 $PSScriptRoot

about_Automatic_Variables und about_Scripts Beide geben an:

In PowerShell 2.0 ist diese Variable nur in Skriptmodulen (.psm1) gültig. Ab PowerShell 3.0 ist es in allen Skripts gültig.

Ich benutze es so:

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

Sie können auch verwenden:

(Resolve-Path .\).Path

Der in Klammern gesetzte Teil gibt ein PathInfo object zurück.

(Verfügbar seit PowerShell 2.0.)

41
Alex Angas

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

Versuchen :

(Get-Location).path

oder:

($pwd).path
23
Rohin Sidharth

Get-Location gibt den aktuellen Standort zurück:

$Currentlocation=Get-Location
15
veeresh i

Ich mag die eine Linie Lösung :)

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

Versuche dies:

$WorkingDir = Convert-Path .

In Powershell 3 und höher können Sie einfach verwenden

$PSScriptRoot

1
BlackSpy

Sie würden denken, dass die Verwendung von '. \' Als Pfad der Aufrufpfad ist. Aber nicht die ganze Zeit. Beispiel, wenn Sie es in einem Job ScriptBlock verwenden. In diesem Fall kann es auf% profile%\Documents zeigen. 

1
syanzy

Für das, was es wert ist, eine einzige Lösung zu sein, ist das Folgende eine funktionierende Lösung für mich. 

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

die 1 am Ende soll das/ignorieren.

dank der Beiträge oben, die das Get-Location-Cmdlet verwenden

Um die Antwort von @Cradle zu erweitern: Sie könnten auch eine Multi-Purpose-Funktion schreiben , die Ihnen das gleiche Ergebnis für die OP-Frage liefert:

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
    }

}
0
Erutan409