it-swarm.com.de

Fügen Sie relative Dateien in PowerShell ein

Ich möchte Skriptdateien mit einer solchen Pseudosyntax einfügen:

Include '.\scripA.ps1'

Aber das einzige, was ich gefunden habe, ist folgendes:

$thisScript = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
. ($thisScript + '.\scriptA.ps1')

das ist hässlich. 

Gibt es einen Nice Weg, Skripts mit relativen Pfaden einzufügen?

53
alex2k8

Leider nein, es gibt keinen guten Weg. PowerShell unterstützt diese Idee in V1 nicht wirklich gut. Wirklich ist der Ansatz, den Sie verwenden, der beste Ansatz

11
JaredPar

Sie können den Parameter $ PSScriptRoot folgendermaßen verwenden:

. "$PSScriptRoot\script.ps1"
92
chrischu

Sie können die Datei mit einem Punkt versehen (einschließen):

. .\scriptA.ps1

So erhalten Sie den vollständigen Pfad des Skripts:

Auflösungspfad.\ScriptA.ps1

28
Shay Levy

Dot-Sourcing ist die einfachste Option, wenn auch, wie bereits gesagt, nicht besonders hübsch. Dieses Format macht es jedoch nur ein bisschen sauberer:

$ScriptDirectory = Split-Path $MyInvocation.MyCommand.Path
. (Join-Path $ScriptDirectory ScriptA.ps1)

Außerdem ein Hinweis zu relativen Pfaden , der explizit gemacht werden kann: Der ursprüngliche Beitrag scheint den Pfad relativ zum aktuellen Arbeitsverzeichnis zu enthalten. In der Realität besteht die Absicht darin, relativ zum Quellverzeichnis von current zu sein (wie das eigene Codebeispiel von alex2k8 zeigt). Auf diese Weise kann das aktuelle Skript auf andere Skripts aus demselben Repository zugreifen.

20
Michael Sorens

Ab V2 (nativ ab Win7/2008R2; siehe $psversiontable.psversion) können Sie eine Datei wie folgt einfügen:

. "RelativeOrAbsolutePathToFile\include.ps1"

$result = FunctionInIncludeFile()

Referenz:
So verwenden Sie Windows-Powershell-Funktionen in Skripts wieder

5
Ralph Willgoss

Dies würde wahrscheinlich von jedem Verzeichnis aus funktionieren, aber es wird eine langsame Suche sein, wenn Ihr Startverzeichnis kein direktes Vorgängerverzeichnis der Datei ist, die Sie einbinden möchten. Wenn Ihr Ausgangspunkt für diese Suche die Wurzel von c:\oder einem anderen Laufwerksbuchstaben ist, wird dies wahrscheinlich schrecklich langsam sein.

. $ (Resolve-Path -literal $ (gci -Recurse include.ps1))

Dies funktioniert besonders gut, wenn Sie Skripts auf Ihrem PC entwickeln, diese jedoch auf einem Server bereitstellen müssen, auf dem das Skript als geplante Aufgabe ausgeführt wird.

0
Brian

Sie können $ PSScriptRoot und die Direktive "Split-Path" verwenden, damit es für relative Pfade sauber funktioniert. . (($PSScriptRoot | Split-Path | Split-Path)+'somedir\ps\script.ps1')

0
Michael