web-dev-qa-db-fra.com

Exécuter plusieurs scripts Powershell de manière séquentielle - sur un dossier - Combiner des scripts dans un script maître

J'ai plus de 6 scripts et de plus en plus pour fonctionner sur un dossier, quel est le meilleur moyen de les exécuter les uns après les autres.

J'ai vu et essayé ce fil - cela n'a malheureusement pas fonctionné.

Comment exécuter plusieurs scripts un par un dans un script PowerShell

Dans un fichier .ps principal - J'ai créé des liens vers les scripts Power Shell à exécuter dans l'ordre

Exécuter les scripts dans l'ordre

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

etc

Cela n'a pas fonctionné non plus. Votre aide est appréciée. J'ai cherché partout et n'arrive pas à résoudre ce problème.

Révisé: Je pense que je devrai attendre que chaque script Power Shell se termine avant d'exécuter le suivant - car des erreurs se sont produites lorsque j'ai essayé d'exécuter 3 scripts l'un après l'autre.

Final

Je vous remercie tous pour votre aide - pour que les choses restent simples, voici ce que j'ai fait

Mon dossier contient les scripts ci-dessous. J'ai ensuite créé un fichier Master.ps1 contenant le code ci-dessous:

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

J'ai ensuite exécuté le Master.ps1 sur le dossier avec tous les fichiers - et il fait le travail jusqu'à présent.

13
wp44

Si vous ne voulez pas coder en dur le chemin, vous pouvez créer Master.ps1 comme ceci:

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

Et il recherchera ces scripts dans le même répertoire où il se trouve.

12
mjolinor

Créez simplement un fichier texte à l'aide de n'importe quel éditeur de code ou éditeur de texte et utilisez l'exemple de script de traitement par lots suivant:

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

Enregistrez-le en tant que script.bat et ouvrez-le. Cela fera exécuter deux scripts Powershell en même temps.

3
Kristián Jalovec

Pour obtenir le chemin dans lequel se trouve votre script, vous pouvez procéder comme suit:

$MyInvocation.MyCommand.Definition

Cela affichera quelque chose comme 'C:\Utilisateurs\WP\Desktop\Scripts\Master.ps1'. À partir de là, nous pouvons faire un Split-Path pour obtenir uniquement le dossier et exécuter Get-ChildItem sur le dossier pour obtenir une liste de fichiers. Nous voudrons probablement exclure le script principal afin d'éviter de nous retrouver dans une boucle récursive. Cela ressemblerait donc à ceci:

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

Ensuite, nous les exécutons via une boucle ForEach-Object et appelons le script avec l'opérateur d'appel & en tant que tel:

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

Edit: Hm, ça ne filtrait pas correctement. Voici une réécriture qui filtre correctement le script maître.

$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
TheMadTechnician

La raison pour laquelle l'écran PowerShell apparaît est parce que vous n'avez pas l'argument -NoExit défini. Veuillez utiliser l'exemple suivant pour voir si votre code fonctionne correctement:

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

Désolé pour la réponse tardive, mais j’ai aussi rencontré le problème et c’est ainsi que j’ai pu le résoudre pour que cela fonctionne.

Aussi, je change les noms de fichiers comme suit:

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

Pour exécuter plusieurs scripts de manière séquentielle, vous pouvez utiliser le paramètre -Wait sur Start-Process comme suit:

$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 attendra que le script en cours se termine avant d'exécuter le prochain script

0
Bluecakes

Êtes-vous en train de coder les chemins d'accès aux fichiers dans le fichier maître?

Dans ce cas, quelque chose comme ça devrait marcher

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