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
'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.
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.
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.
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 }
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"
);
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
Ê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"