727 Stimmen

Wie lässt sich der Speicherort des aktuellen PowerShell-Skripts am besten ermitteln?

Wenn ich auf ein gemeinsames Modul oder Skript verweisen muss, verwende ich gerne Pfade relativ zur aktuellen Skriptdatei. Auf diese Weise kann mein Skript immer andere Skripte in der Bibliothek finden.

Was ist also die beste Standardmethode, um das Verzeichnis des aktuellen Skripts zu bestimmen? Derzeit mache ich das:

$MyDir = [System.IO.Path]::GetDirectoryName($myInvocation.MyCommand.Definition)

Ich weiß, dass Sie in Modulen (.psm1) Folgendes verwenden können $PSScriptRoot um diese Informationen zu erhalten, aber das wird in normalen Skripten (d.h. .ps1-Dateien) nicht gesetzt.

Wie kann ich den Speicherort der aktuellen PowerShell-Skriptdatei abrufen?

1180voto

JaredPar Punkte 699699

PowerShell 3+

# This is an automatic variable set to the current file's/module's directory
$PSScriptRoot

PowerShell 2

Vor PowerShell 3 gab es keine bessere Möglichkeit als das Abfragen der MyInvocation.MyCommand.Definition Eigenschaft für allgemeine Skripte. Ich hatte die folgende Zeile am Anfang von praktisch jedem PowerShell-Skript, das ich hatte:

$scriptPath = split-path -parent $MyInvocation.MyCommand.Definition

75voto

Andy Schneider Punkte 8314

Wenn Sie ein V2-Modul erstellen, können Sie eine automatische Variable namens $PSScriptRoot .

Von PS > Hilfe automatic_variable

$PSScriptRoot
       Contains the directory from which the script module is being executed.
       This variable allows scripts to use the module path to access other
       resources.

44voto

CodeMonkeyKing Punkte 4352

Für PowerShell 3.0

$PSCommandPath
    Contains the full path and file name of the script that is being run. 
    This variable is valid in all scripts.

Die Funktion ist dann:

function Get-ScriptDirectory {
    Split-Path -Parent $PSCommandPath
}

23voto

nickkzl Punkte 330

Für PowerShell 3+

function Get-ScriptDirectory {
    if ($psise) {
        Split-Path $psise.CurrentFile.FullPath
    }
    else {
        $global:PSScriptRoot
    }
}

Ich habe diese Funktion in mein Profil aufgenommen. Sie funktioniert in ISE mit F8 /Laufauswahl zu.

19voto

Sean C. Punkte 412

Vielleicht übersehe ich hier etwas... aber wenn Sie das aktuelle Arbeitsverzeichnis haben wollen, können Sie einfach dies verwenden: (Get-Location).Path für eine Zeichenkette, oder Get-Location für ein Objekt.

Es sei denn, Sie meinen so etwas wie das hier, was ich verstehe, nachdem ich die Frage noch einmal gelesen habe.

function Get-Script-Directory
{
    $scriptInvocation = (Get-Variable MyInvocation -Scope 1).Value
    return Split-Path $scriptInvocation.MyCommand.Path
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X