Dies sollte eine einfache Aufgabe sein, aber ich habe mehrere Versuche gesehen, wie der Pfad zu dem Verzeichnis, in dem sich das ausgeführte Cmdlet befindet, mit gemischtem Erfolg abgerufen werden kann. Wenn ich zum Beispiel C:\temp\myscripts\mycmdlet.ps1
eine Einstellungsdatei bei ausführe , C:\temp\myscripts\settings.xml
möchte ich in der Lage sein, C:\temp\myscripts
in einer Variablen darin zu speichern 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 ziehe es vor, den Dateipfad jedes Mal als Parameter analysieren zu müssen, aber ich kann ihn nicht in meiner Entwicklungsumgebung zum Laufen bringen. Was soll ich tun? Hat dies etwas mit der Konfiguration von PowerShell zu tun?
quelle
Antworten:
Der zuverlässige Weg, dies zu tun, ist genau so, wie Sie es gezeigt haben
$MyInvocation.MyCommand.Path
.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.
PowerShell v3 + :
Verwenden Sie die automatische Variable
$PSScriptRoot
.quelle
$PSScriptRoot
und erklären$MyInvocation.MyCommand.Path
?Ja, das sollte funktionieren. Aber wenn Sie den absoluten Pfad sehen müssen, ist dies alles, was Sie brauchen:
quelle
C:\mydir
und ich den Befehl aufrufeC:\dir1\dir2\dir3\mycmdlet.ps1
, wird dies inC:\mydir
nicht aufgelöstC:\dir1\dir2\dir3
. Das Aufrufen einer neuen ausführbaren Datei hat das gleiche Problem, da das aktuelle Verzeichnis vom übergeordneten Prozess geerbt wird.Die einfachste Methode scheint darin zu bestehen, die folgende vordefinierte Variable zu verwenden:
about_Automatic_Variables
undabout_Scripts
beide geben an:Ich benutze es so:
quelle
Sie können auch verwenden:
Der Teil in Klammern gibt ein
PathInfo
Objekt zurück.(Verfügbar seit PowerShell 2.0.)
quelle
C:\mydir
und ich den Befehl aufrufeC:\dir1\dir2\dir3\mycmdlet.ps1
, wird dies inC:\mydir
nicht aufgelöstC:\dir1\dir2\dir3
. Das Aufrufen einer neuen ausführbaren Datei hat das gleiche Problem, da das aktuelle Verzeichnis vom übergeordneten Prozess geerbt wird.Pfad ist oft null. Diese Funktion ist sicherer.
quelle
Versuchen :
oder:
quelle
$pwd
/$PWD
wenn ich eine lange Pause von Powershell nehmen! So viel nützlicher IMO ...Get-Location
gibt den aktuellen Speicherort zurück:quelle
Ich mag die einzeilige Lösung :)
quelle
Versuche dies:
quelle
In Powershell 3 und höher können Sie einfach verwenden
$PSScriptRoot
quelle
Sie würden denken, dass die Verwendung von '. \' Als Pfad bedeutet, dass es sich um den Aufrufpfad handelt. Aber nicht die ganze Zeit. Beispiel, wenn Sie es in einem Job ScriptBlock verwenden. In diesem Fall kann es auf% profile% \ Documents verweisen.
quelle
Diese Funktion setzt den Ort der Eingabeaufforderung auf den Skriptpfad und behandelt die unterschiedlichen Methoden zum Abrufen des Skriptpfads zwischen vscode, psise und pwd:
quelle
Für das, was es wert ist, eine einzeilige Lösung zu sein, ist das Folgende eine funktionierende Lösung für mich.
Die 1 am Ende ist das zu ignorieren
/
.Dank der obigen Beiträge mit dem Cmdlet Get-Location .
quelle
Die meisten Antworten funktionieren beim Debuggen in den folgenden IDEs nicht:
Denn in denen
$PSScriptRoot
ist das leer undResolve-Path .\
(und Ähnliches) führt zu falschen Pfaden.Die Antwort von Freakydinde ist die einzige, die diese Situationen löst, also habe ich das hochgestimmt , aber ich denke nicht,
Set-Location
dass die Antwort wirklich das ist, was gewünscht wird. Also habe ich das behoben und den Code etwas klarer gemacht:quelle
Um die Antwort von @Cradle zu erweitern: Sie können auch eine Mehrzweckfunktion schreiben , mit der Sie das gleiche Ergebnis gemäß der Frage des OP erzielen :
quelle
Wenn Sie nur den Namen des aktuellen Verzeichnisses benötigen, können Sie Folgendes tun:
Angenommen, Sie arbeiten in C: \ Temp \ Location \ MyWorkingDirectory>
Ausgabe
MyWorkingDirectory
quelle
Ich hatte ähnliche Probleme und es machte mir große Probleme, da ich in PowerShell geschriebene Programme (GUI-Anwendungen für Endbenutzer) erstelle und viele Dateien und Ressourcen habe, die ich von der Festplatte laden muss. Aus meiner Erfahrung mit . Danach wechselt PowerShell das Verzeichnis entweder in das Verzeichnis, aus dem Sie es aufgerufen haben, oder in das Verzeichnis, in dem sich das von Ihnen ausgeführte Skript befindet, bevor Sie entweder die PowerShell-Eingabeaufforderung erhalten oder das Skript ausführen. Dies geschieht jedoch, nachdem die PowerShell-App ursprünglich in Ihrem privaten Benutzerverzeichnis gestartet wurde.
.
zur Darstellung des aktuellen Verzeichnisses unzuverlässig. Es sollte das aktuelle Arbeitsverzeichnis darstellen, ist es aber häufig nicht. Es scheint, dass PowerShell den Speicherort speichert, von dem aus PowerShell aufgerufen wurde.
. Genauer gesagt wird PowerShell beim ersten Start standardmäßig in Ihrem Home-Benutzerverzeichnis gestartet. Das ist normalerweise das Verzeichnis Ihres BenutzerkontosC:\USERS\YOUR USER NAME
Und
.
repräsentiert das ursprüngliche Verzeichnis, in dem PowerShell gestartet wurde. Stellt also.
nur das aktuelle Verzeichnis dar, wenn Sie PowerShell aus dem gewünschten Verzeichnis aufgerufen haben. Wenn Sie später das Verzeichnis im PowerShell-Code ändern, scheint sich die Änderung nicht.
in jedem Fall darin zu widerspiegeln . In einigen Fällen handelt es sich.
um das aktuelle Arbeitsverzeichnis, in anderen um das Verzeichnis, aus dem PowerShell (selbst, nicht das Skript) aufgerufen wurde, was zu inkonsistenten Ergebnissen führen kann. Aus diesem Grund verwende ich ein Invoker-Skript. PowerShell-Skript mit einem einzigen Befehl :POWERSHELL
. Dadurch wird sichergestellt, dass PowerShell aus dem gewünschten Verzeichnis aufgerufen wird und somit make.
aktuelles Verzeichnis darstellen. Dies funktioniert jedoch nur, wenn Sie das Verzeichnis später im PowerShell-Code nicht ändern. Im Falle eines Skripts verwende ich ein Aufruferskript, das dem zuletzt erwähnten ähnlich ist, außer dass es eine Dateioption enthält :POWERSHELL -FILE DRIVE:\PATH\SCRIPT NAME.PS1
. Dadurch wird sichergestellt, dass PowerShell im aktuellen Arbeitsverzeichnis gestartet wird.Durch einfaches Klicken auf das Skript wird PowerShell aus Ihrem privaten Benutzerverzeichnis aufgerufen, unabhängig davon, wo sich das Skript befindet. Dies führt dazu, dass das aktuelle Arbeitsverzeichnis das Verzeichnis ist, in dem sich das Skript befindet, das PowerShell-Aufrufverzeichnis jedoch
C:\USERS\YOUR USER NAME
, und dass.
je nach Situation eines dieser beiden Verzeichnisse zurückgegeben wird, was lächerlich ist.Um all diese Aufregung zu vermeiden und das Aufruferskript zu verwenden, können Sie einfach entweder
$PWD
oder$PSSCRIPTROOT
anstelle des.
aktuellen Verzeichnisses verwenden, je nachdem, ob Sie das aktuelle Arbeitsverzeichnis oder das Verzeichnis darstellen möchten, aus dem das Skript aufgerufen wurde. Und wenn Sie aus irgendeinem Grund ein anderes von zwei zurückgegebenen Verzeichnissen abrufen möchten.
, können Sie verwenden$HOME
.Ich persönlich habe nur ein Aufruferskript im Stammverzeichnis meiner Apps, die ich mit PowerShell entwickelt habe und das mein Haupt-App-Skript aufruft, und denke einfach daran, niemals das aktuelle Arbeitsverzeichnis in meinem Quellcode meiner App zu ändern, damit ich mir darüber keine Sorgen machen muss. und ich kann verwenden
.
, um das aktuelle Verzeichnis darzustellen und die relative Dateiadressierung in meinen Anwendungen ohne Probleme zu unterstützen. Dies sollte in neueren Versionen von PowerShell (neuer als Version 2) funktionieren.quelle