2016-03-09 41 views
11

Ho 6 o più script e sto crescendo per essere eseguito su una cartella, qual è il modo migliore per eseguirli uno dopo l'altro.Esegui più script Powershell in sequenza - su una cartella - Combina gli script in uno script principale

Ho visto e provato questo thread - non ha funzionato purtroppo.

How to run multiple Scripts one by one in a powershell script

In un file .ps maestro - ho messo i link per gli script di shell potere che hanno bisogno di essere eseguito in modo

Esecuzione script al fine

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

ecc

Anche questo non ha funzionato. Il tuo aiuto è apprezzato - ho cercato dappertutto e non riesco a risolvere questo problema.

revisione: credo che dovrò aspettare per ogni script di shell potere per terminare prima di eseguire la prossima - come ho avuto errori quando ho provato a correre 3 script uno dopo l'altro - non è successo niente quando gli script sono stati eseguiti

finale -

ringrazio tutti voi per il vostro aiuto - per mantenere le cose semplici questo è quello che ho fatto

cartella ha gli script qui sotto - ho quindi creato un Maestro. ps1 con il codice b elow al suo interno:

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

Ho quindi eseguire il Master.ps1 sulla cartella con tutti i file - e fa il lavoro finora.

+0

Quando si dice "uno dopo l'altro", si desidera attendere il completamento di ogni script prima di eseguire il successivo o eseguirli tutti contemporaneamente? – Bluecakes

+0

Ciao, dovrei aspettare che ognuno finisca - questo ha senso. Esegui lo script 1 - quindi 2 e poi 3, in sequenza :) – wp44

risposta

9

Se non si desidera codificare il percorso, è possibile eseguire Master.ps1 piace questo:

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

E cercherà quegli script nella stessa directory in cui si trova.

+0

Has '$ PSScriptroot' è sempre stato lì? Ho analizzato la radice dello script con 'Split-Path $ MyInvocation.MyCommand.Definition' per ciò che sembra come sempre. – TheMadTechnician

+0

Ciao Mj - Ho fatto questo e "C: \ Users \ WP \ Desktop \ Mjolinor \ 1.ps1" e "C: \ Users \ WP \ Desktop \ Mjolinor \ 2.ps1" - ha funzionato :) - è c'è qualche possibilità - che può aspettare per finire - prima che il prossimo script venga eseguito - nel caso in futuro - potrei avere uno script lungo, per evitare che i risultati degli spaghetti nei file di testo - grazie – wp44

+1

Eseguiranno in sequenza di default. Devi usare lavori o spazi di esecuzione per portarlo a multi-thread. – mjolinor

0

Sei difficile codificare i percorsi dei file nel file principale?

In questo caso qualcosa come questo dovrebbe funzionare

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

Preferirei non il codice hard - ma come un noob PowerShell - Non ho idea. Se inserisco un master.ps nella cartella con tutti gli altri script, come li chiamerei dal master? Grazie Captain – wp44

1

Per ottenere il percorso che lo script è in voi può fare questo:

$MyInvocation.MyCommand.Definition 

che vi mostrerà qualcosa di simile a 'C: \ Users \ WP \ Desktop \ Scripts \ Master.ps1' . Da questo possiamo fare uno Split-Path per ottenere solo la cartella ed eseguire Get-ChildItem sulla cartella per ottenere un elenco di file. Noi probabilmente vogliamo escludere la sceneggiatura maestro, in modo da non finire in un ciclo ricorsivo, in modo che sarebbe un aspetto simile:

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

Poi abbiamo appena farli funzionare attraverso un ciclo ForEach-Object, e invochiamo lo script con l'operatore di call & come tale:

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

Edit: Hm, che non è stata corretta filtrazione. Ecco una riscrittura che filtra correttamente lo script master.

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

TMD, grazie - Nella cartella ho messo 2 script e lo script master che li chiama ... qualcosa è successo .. ma è andato in un ciclo dopo. Nel master ho inserito questo: $ MyInvocation.MyCommand.Definition $ ScriptPath = Percorso diviso $ MyInvocation.MyCommand.Definition Get-ChildItem "$ ScriptPath \ *. Ps1" | Dove {$ _. FullName -ne $ MyInvocation.MyCommand.Definition} | ForEach-Object {& $ _. FullName} - Non sono sicuro se l'ho fatto bene? – wp44

+0

Siamo spiacenti, la mia prima versione non stava filtrando lo script principale, quindi era in esecuzione come parte dello script e ha creato un ciclo infinito. Ho aggiornato la mia risposta. – TheMadTechnician

+0

Grazie, aggiungerò questo ai miei strumenti di power shell - box - :) – wp44

0

Per eseguire più script in sequenza è possibile utilizzare il parametro -Wait su Start-Process in questo modo:

$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 attenderà lo script corrente per terminare prima di eseguire lo script successivo

+0

Hi BC - Ho eseguito questa schermata, ma non sono state apportate modifiche nei file di testo, non so perché :( – wp44

1

Il motivo per cui la PowerShell lo schermo si apre perché non hai l'argomento -NoExit impostato. Si prega di utilizzare il seguente come un esempio per vedere se il codice funziona correttamente:

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

Ci scusiamo per il ritardo di risposta, ma ho anche incontrato il problema e thats come sono stato in grado di risolvere per assicurarsi che fosse il lavoro .

Anche io cambia i nomi dei file come segue:

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

è sufficiente creare un file di testo, utilizzando qualsiasi editor di codice o editor di testo, e utilizzare il seguente script batch di esempio:

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

Salva è come script.bat e aprilo. Ciò farà funzionare due script PowerShell contemporaneamente.