Ich möchte die Aufrufausführung für ein myScript1.ps1-Skript in einem zweiten myScript2.ps1-Skript in Powershell ISE.
Der folgende Code in MyScript2.ps1 funktioniert in der Powershell-Verwaltung einwandfrei, in PowerShell ISE jedoch nicht:
#Call myScript1 from myScript2
invoke-expression -Command .\myScript1.ps1
Beim Ausführen von MyScript2.ps1 über PowerShell ISE wird der folgende Fehler angezeigt:
Der Begriff '. \ MyScript1.ps1' wird nicht als Name eines Cmdlets, einer Funktion, einer Skriptdatei oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens. Wenn ein Pfad enthalten war, überprüfen Sie, ob der Pfad korrekt ist, und versuchen Sie es erneut.
quelle
Der aktuelle Pfad von MyScript1.ps1 ist nicht der gleiche wie der von myScript2.ps1. Sie können den Ordnerpfad von MyScript2.ps1 abrufen, mit MyScript1.ps1 verknüpfen und dann ausführen. Beide Skripte müssen sich am selben Speicherort befinden.
quelle
Ich rufe myScript1.ps1 von myScript2.ps1 aus auf.
Angenommen, beide Skripte befinden sich am selben Speicherort, ermitteln Sie zuerst den Speicherort des Skripts mit diesem Befehl:
Fügen Sie dann den Skriptnamen, den Sie aufrufen möchten, wie folgt hinzu:
Das sollte funktionieren.
quelle
& "$PSScriptRoot\myScript1.ps1"
ist genugEinzeilige Lösung:
quelle
& '.\MyScript1.ps'
wenn sich das Skript im selben Verzeichnis befindet?Dies sind nur zusätzliche Informationen zu Antworten, um Argumente in eine andere Datei zu übergeben
Wo Sie Argumente erwarten
PrintName.ps1
So rufen Sie die Datei auf
Wenn Sie keine Eingabe machen, wird standardmäßig "Joe" verwendet. Dies wird als Argument an das Argument "printName" in der Datei " PrintName.ps1" übergeben , wodurch wiederum die Zeichenfolge "Joe" ausgedruckt wird
quelle
Sie haben vielleicht schon die Antwort darauf gefunden, aber hier ist, was ich tue.
Normalerweise setze ich diese Zeile am Anfang meiner Installationsskripte:
Dann kann ich die Variable $ PSScriptRoot als Speicherort des aktuellen Skripts (Pfads) verwenden, wie im folgenden Beispiel:
In Ihrem Fall können Sie ersetzen
Start-Prozess ... Linie mit
Aufrufausdruck $ PSScriptRoot \ ScriptName.ps1
Weitere Informationen zu den automatischen Variablen $ MYINVOCATION und $ PSScriptRoot finden Sie auf der Microsoft-Website: https://msdn.microsoft.com/en-us/powershell/reference/5.1/microsoft.powershell.core/about/about_automatic_variables
quelle
Um eine Skriptdatei einfach im selben Ordner (oder Unterordner von) wie der Aufrufer auszuführen, können Sie Folgendes verwenden:
quelle
Ich hatte ein Problem damit. Ich habe aber keine cleveren
$MyInvocation
Sachen benutzt, um das Problem zu beheben. Wenn Sie die ISE öffnen, indem Sie mit der rechten Maustaste auf eine Skriptdatei klicken undedit
dann das zweite Skript innerhalb der ISE öffnen, können Sie eines unter Verwendung der normalen . \ Script.ps1- Syntax voneinander aufrufen . Ich vermute, dass die ISE den Begriff eines aktuellen Ordners hat und beim Öffnen auf diese Weise den aktuellen Ordner auf den Ordner setzt, der die Skripte enthält. Wenn ich bei normaler Verwendung ein Skript von einem anderen aufrufe , verwende ich einfach . \ Script.ps1 , IMO. Es ist falsch, das Skript zu ändern, damit es in der ISE ordnungsgemäß funktioniert.quelle
Ich hatte ein ähnliches Problem und löste es auf diese Weise.
Mein Arbeitsverzeichnis ist ein allgemeiner Skriptordner und mehrere bestimmte Skriptordner im selben Stammverzeichnis. Ich muss einen bestimmten Skriptordner aufrufen (der das allgemeine Skript mit dem Parameter des jeweiligen Problems aufruft). Das Arbeitsverzeichnis ist also so
Solutions1 und Solutions2 rufen die PS1 im Ordner Scripts auf und laden den in ParameterForSolution gespeicherten Parameter. In Powershell ISE führe ich diesen Befehl aus
Und der Code in Solution1.PS1 lautet:
quelle
Ich reiche mein Beispiel zur Prüfung ein. So rufe ich in den von mir erstellten Tools Code aus einem Controller-Skript auf. Die Skripte, die die Arbeit erledigen, müssen auch Parameter akzeptieren, daher zeigt dieses Beispiel, wie sie übergeben werden. Es wird davon ausgegangen, dass sich das aufgerufene Skript im selben Verzeichnis befindet wie das Controller-Skript (Skript, das den Aufruf ausführt).
Das obige ist ein Controller-Skript, das 3 Parameter akzeptiert. Diese werden im Parameterblock definiert. Das Controller-Skript ruft dann das Skript Get-ZAEventLogData.ps1 auf. Zum Beispiel akzeptiert dieses Skript auch die gleichen 3 Parameter. Wenn das Controller-Skript das Skript aufruft, das die Arbeit erledigt, muss es es aufrufen und die Parameter übergeben. Das Obige zeigt, wie ich es durch Splattern mache.
quelle
Wie führen Sie integrierte PowerShell-Skripts in Ihren Skripten aus?
Wie benutzt man eingebaute Skripte wie
Diese werden von Ihrem Computer ausgeführt und überprüfen automatisch den Pfad des Skripts.
Ebenso kann ich meine benutzerdefinierten Skripte ausführen, indem ich einfach den Namen des Skripts in den Skriptblock schreibe
Gehen Sie zur Powershell-Befehlszeile und geben Sie ein
Dadurch wird der Pfad zu einer Datei zurückgegeben, die unsere PowerShell-Befehlszeile bei jedem Öffnen der App ausführt.
Es wird so aussehen
Gehen Sie zu Dokumente und prüfen Sie, ob Sie bereits ein WindowsPowerShell-Verzeichnis haben. Ich habe es nicht getan
Wir haben jetzt das Skript erstellt, das jedes Mal gestartet wird, wenn wir die PowerShell-App öffnen.
Der Grund dafür war, dass wir unseren eigenen Ordner hinzufügen konnten, der alle unsere benutzerdefinierten Skripte enthält. Lassen Sie uns diesen Ordner erstellen und ich werde ihn "Bin" nach den Verzeichnissen nennen, in denen Mac / Linux seine Skripte aufbewahrt.
Jetzt möchten wir, dass dieses Verzeichnis bei
$env:path
jedem Öffnen der App zu unserer Variablen hinzugefügt wird. Gehen Sie also zurück zumWindowsPowerShell
Verzeichnis undDann füge dies hinzu
Jetzt findet die Shell Ihre Befehle automatisch, solange Sie Ihre Skripte in diesem "Bin" -Verzeichnis speichern.
Starten Sie die Powershell neu und es sollte eines der ersten Skripte sein, die ausgeführt werden.
Führen Sie dies nach dem erneuten Laden in der Befehlszeile aus, um Ihr neues Verzeichnis in Ihrer Pfadvariablen anzuzeigen:
Jetzt können wir unsere Skripte einfach über die Befehlszeile oder aus einem anderen Skript heraus aufrufen:
Wie Sie sehen, müssen wir sie mit der
.ps1
Nebenstelle aufrufen, bis wir Aliase für sie erstellen. Wenn wir Lust haben wollen.quelle