web-dev-qa-db-de.com

Mehrere Powershell-Skripts nacheinander ausführen - in einem Ordner - Kombinieren Sie Skripts zu einem Master-Skript

Ich habe mehr als 6 Skripte und wächst in einem Ordner. Was ist der beste Weg, um sie nacheinander ausführen zu lassen?.

Ich habe diesen Thread gesehen und ausprobiert - er hat leider nicht funktioniert.

So führen Sie mehrere Skripts nacheinander in einem Powershell-Skript aus

In einer Master-Datei .ps - Ich habe Links zu den Power-Shell-Skripts eingefügt, die der Reihe nach ausgeführt werden müssen

Führen Sie die Skripts der Reihe nach aus

'C:\Users\WP\Desktop\Scripts\1.ps1'
'C:\Users\WP\Desktop\Scripts\2.ps1'
'C:\Users\WP\Desktop\Scripts\3.ps1'

usw

Das hat auch nicht funktioniert. Ihre Hilfe wird geschätzt - ich habe alles gesucht und scheint dieses Problem nicht beheben zu können.

Revised: Ich glaube, ich muss warten, bis jedes Power-Shell-Skript fertig ist, bevor das nächste ausgeführt wird. Ich hatte Fehler, als ich versuchte, 3 Skripts nacheinander auszuführen. Bei der Ausführung der Skripts passierte nichts

Finale

Ich danke Ihnen allen für Ihre Hilfe. Um die Dinge einfach zu halten, habe ich dies getan

Mein Ordner enthält die folgenden Skripts - ich habe dann eine Master.ps1 mit dem folgenden Code erstellt:

&"$PSScriptroot\1.ps1"
&"$PSScriptroot\2.ps1"
&"$PSScriptroot\3.ps1"
&"$PSScriptroot\4.ps1"
&"$PSScriptroot\5.ps1"
&"$PSScriptroot\6.ps1"

Ich habe dann die Master.ps1 für den Ordner mit allen Dateien ausgeführt - und dies erledigt die Arbeit bisher.

13
wp44

Wenn Sie den Pfad nicht hart codieren möchten, können Sie Master.ps1 folgendermaßen erstellen:

&"$PSScriptroot\1.ps1"
&"$PSScriptroot\2.ps1"
&"$PSScriptroot\3.ps1"

Und es wird nach diesen Skripts im selben Verzeichnis suchen, in dem es sich befindet.

12
mjolinor

Erstellen Sie einfach eine Textdatei mit einem beliebigen Code-Editor oder Texteditor und verwenden Sie das folgende Beispiel-Batch-Skript:

start /min powershell.exe C:\your folder\script1.ps1
start /min powershell.exe C:\your folder\script2.ps1

Speichern Sie es als script.bat und öffnen Sie es. Dadurch werden zwei Powershell-Skripts gleichzeitig ausgeführt.

3

Um den Pfad zu erhalten, in dem sich Ihr Skript befindet, können Sie Folgendes tun:

$MyInvocation.MyCommand.Definition

Das zeigt etwas wie 'C:\Benutzer\WP\Desktop\Scripts\Master.ps1'. Von hier aus können wir einen Split-Path ausführen, um nur den Ordner abzurufen, und Get-ChildItem für den Ordner ausführen, um eine Liste der Dateien zu erhalten. Wir werden wahrscheinlich das Master-Skript ausschließen wollen, damit wir nicht in einer rekursiven Schleife enden, und das würde ungefähr so ​​aussehen:

$ScriptPath = Split-Path $MyInvocation.MyCommand.Definition
Get-ChildItem "$ScriptPath\*.ps1" | Where{$_.FullName -ne $MyInvocation.MyCommand.Definition}

Dann führen wir diese einfach durch eine ForEach-Object-Schleife und rufen das Skript mit dem Aufrufoperator & auf:

$ScriptPath = Split-Path $MyInvocation.MyCommand.Definition
Get-ChildItem "$ScriptPath\*.ps1" | Where{$_.FullName -ne $MyInvocation.MyCommand.Definition} | ForEach-Object { & $_.FullName }

Edit: Hm, das hat nicht richtig gefiltert. Hier ist eine Umschreibung, die das Masterskript korrekt herausfiltert.

$Master = Split-Path $MyInvocation.MyCommand.Definition -Leaf
$ScriptPath = Split-Path $MyInvocation.MyCommand.Definition
Get-ChildItem "$ScriptPath\*.ps1" | Where{$_.Name -ne $Master} | ForEach-Object { & $_.FullName }
1

Der Powershell-Bildschirm wird angezeigt, weil Sie das Argument -NoExit nicht gesetzt haben. Verwenden Sie das folgende Beispiel, um zu sehen, ob Ihr Code ordnungsgemäß ausgeführt wird:

Start-Process "$pshome\powershell.exe" -ArgumentList "-NoExit", "-Command '& script'" -wait

Entschuldigung für die späte Antwort, aber ich bin auch auf das Problem gestoßen, und so konnte ich es lösen, um sicherzustellen, dass es funktioniert.

Ich ändere auch die Dateinamen wie folgt:

$Scripts =
@(
 ".\C:\Scripts\First.ps1"
 ".\C:\Scripts\Second.ps1"
 ".\C:\Scripts\Third.ps1"
 );
1
InvalidFileName

Um mehrere Skripts nacheinander auszuführen, können Sie den Parameter -Wait für Start-Process wie folgt verwenden:

$scriptsList = 
@(
    'C:\Users\WP\Desktop\Scripts\1.ps1'
    'C:\Users\WP\Desktop\Scripts\2.ps1'
    'C:\Users\WP\Desktop\Scripts\3.ps1'
)

foreach($script in $scriptsList)
{
    Start-Process -FilePath "$PSHOME\powershell.exe" -ArgumentList "-command '& $script'" -Wait
}

PowerShell wartet, bis das aktuelle Skript beendet ist, bevor das nächste Skript ausgeführt wird

0
Bluecakes

Kodieren Sie die Pfade zu den Dateien in der Master-Datei hart?

In diesem Fall sollte so etwas funktionieren

Invoke-Expression "C:\Users\WP\Desktop\Scripts\1.ps1"
Invoke-Expression "C:\Users\WP\Desktop\Scripts\2.ps1"
Invoke-Expression "C:\Users\WP\Desktop\Scripts\3.ps1"
0
thecaptain0220