Ich habe ein PowerShell-Skript, das einige Aufgaben im aktuellen Verzeichnis des Skripts erledigt. Wenn Sie sich also in diesem Verzeichnis befinden, .\script.ps1
funktioniert das Ausführen ordnungsgemäß.
Jetzt möchte ich dieses Skript aus einem anderen Verzeichnis aufrufen, ohne das Referenzverzeichnis des Skripts zu ändern. Ich möchte also anrufen ..\..\dir\script.ps1
und möchte, dass sich das Skript so verhält, wie es aus seinem Verzeichnis heraus aufgerufen wurde.
Wie mache ich das oder wie ändere ich ein Skript, damit es von jedem Verzeichnis aus ausgeführt werden kann?
quelle
ant
mit einigen Parametern aufruft . Ich muss alsoant
aus diesem Ordner aufrufen , um sicherzustellen, dass die Konfigurationsdatei korrekt gefunden wird. Idealerweise suche ich nach etwas, um das Ausführungsverzeichnis lokal in diesem Skript vorübergehend zu ändern.Push-Location
undPop-Location
Wenn Sie native Apps aufrufen, müssen Sie sich keine Gedanken über
[Environment]::CurrentDirectory
das$PWD
aktuelle Verzeichnis von PowerShell machen . Aus verschiedenen Gründen legt PowerShell beim Festlegen des Speicherorts oder des Push-Speicherorts nicht das aktuelle Arbeitsverzeichnis des Prozesses fest. Sie müssen dies daher sicherstellen, wenn Sie Anwendungen (oder Cmdlets) ausführen, die das Festlegen erwarten.In einem Skript können Sie Folgendes tun:
Es gibt keine narrensichere Alternative dazu. Viele von uns haben eine Zeile in ihre Eingabeaufforderungsfunktion eingefügt, um [Environment] :: CurrentDirectory festzulegen ... aber das hilft Ihnen nicht, wenn Sie den Speicherort innerhalb eines Skripts ändern .
Zwei Hinweise zum Grund, warum dies von PowerShell nicht automatisch festgelegt wird:
$PWD
Arbeitsverzeichnis, aber es gibt nur einen Prozess und nur eine Umgebung.$PWD
ist dies nicht immer ein legales CurrentDirectory (Sie können beispielsweise eine CD beim Registrierungsanbieter erstellen).Wenn Sie es in Ihre Eingabeaufforderung einfügen möchten (die nur im Hauptlaufbereich mit einem Thread ausgeführt wird), müssen Sie Folgendes verwenden:
quelle
.\_/.
- für diese getötete Hälfte meines Tages! Leute, im Ernst? Ernsthaft? ..[Environment]::CurrentDirectory
wenn dies nicht der Fall ist$PWD
. Das Richtige wäre, es in einer Variablen zu speichern$origEnvDir = [Environment]::CurrentDirectory
und später wiederherzustellen[Environment]::CurrentDirectory = $origEnvDir
.Es gibt Antworten mit einer großen Anzahl von Stimmen, aber als ich Ihre Frage las, dachte ich, Sie wollten das Verzeichnis wissen, in dem sich das Skript befindet, nicht das, in dem das Skript ausgeführt wird. Sie können die Informationen mit den automatischen Variablen von Powershell abrufen
Zum Beispiel habe ich ein $ profile-Skript, das die Visual Studio-Lösungsdatei findet und startet. Ich wollte den vollständigen Pfad speichern, sobald eine Lösungsdatei gestartet wurde. Aber ich wollte die Datei speichern, in der das ursprüngliche Skript existiert. Also habe ich $ PsScriptRoot verwendet.
quelle
Ich habe oft den folgenden Code verwendet, um ein Modul zu importieren, das sich im selben Verzeichnis befindet wie das laufende Skript. Es wird zuerst das Verzeichnis abgerufen, aus dem Powershell ausgeführt wird
quelle
Das würde gut funktionieren.
quelle
Pop-Location
am Ende anzurufen , um den Pfad in seinen ursprünglichen Zustand zurückzusetzen.Nun, ich habe eine Weile nach einer Lösung dafür gesucht, ohne irgendwelche Skripte nur von CLI. So mache ich es xD:
Navigieren Sie zu dem Ordner, in dem Sie das Skript ausführen möchten (wichtig ist, dass Sie Registerkarten vervollständigen).
..\..\dir
Umgeben Sie nun die Position mit doppelten Anführungszeichen und fügen Sie sie hinzu
cd
, damit wir eine weitere Instanz von Powershell aufrufen können."cd ..\..\dir"
Fügen Sie einen weiteren Befehl hinzu, um das Skript getrennt durch
;
auszuführen. Dabei handelt es sich um ein Befehlstrennzeichen in Powershell"cd ..\..\dir\; script.ps1"
Führen Sie es schließlich mit einer anderen Instanz von Powershell aus
start powershell "cd..\..\dir\; script.ps1"
Dadurch wird ein neues Powershell-Fenster geöffnet, das Fenster aufgerufen
..\..\dir
, ausgeführtscript.ps1
und geschlossen.Beachten Sie, dass ";" Trennt nur Befehle, wie Sie sie einzeln eingegeben haben, wenn der erste fehlschlägt, wird der zweite ausgeführt und der nächste danach und der nächste danach ... Wenn Sie das neue Powershell-Fenster geöffnet lassen möchten, fügen Sie -noexit im übergebenen Befehl hinzu. Beachten Sie, dass ich zuerst zum gewünschten Ordner navigiere, damit ich Tab-Vervollständigungen verwenden kann (Sie konnten nicht in doppelte Anführungszeichen setzen).
start powershell "-noexit cd..\..\dir\; script.ps1"
Verwenden Sie doppelte Anführungszeichen,
""
damit Sie Verzeichnisse mit Leerzeichen in Namen übergeben können, z.start powershell "-noexit cd '..\..\my dir'; script.ps1"
quelle
Ich habe aus der Lösung von @ JohnL einen Einzeiler gemacht:
quelle