PDA

View Full Version : [VBscript] parallelizzare le esecuzioni di un metodo ObjShell.Run (o Exec)


avvelenato
15-07-2013, 09:20
Ciao a tutti.
Sto facendo uno script per il deployment di software, premetto che scrivere script non è il mio lavoro e lo faccio giusto per evitare di installare "a manella", risparmiando tempo e imparando qualcosa di utile.

ok, il punto è questo: il processo di copia ed esecuzione del setup è LEENTO.

tempo addietro avevo visto che il metodo Run (http://msdn.microsoft.com/en-us/library/d5fk67ky%28v=VS.84%29.aspx) possiede la seguente opzione

bWaitOnReturn

Optional. Boolean value indicating whether the script should wait for the program to finish executing before continuing to the next statement in your script. If set to true, script execution halts until the program finishes, and Run returns any error code returned by the program. If set to false (the default), the Run method returns immediately after starting the program, automatically returning 0 (not to be interpreted as an error code).

in pratica permette di eseguire il comando in maniera asincrona allo script.

nella pratica però mi crea problemi, in quanto mi crea un numero di istanze illimitato di shells, che arrivano a saturare le risorse di sistema del pc che esegue lo script.

Attualmente stavo pensando di inserire un contatore per limitare il numero di istanze concomitanti a un numero prestabilito, diciamo una cinquantina, ma volevo massimizzare le performance, e nel contempo imparare qualcosa a riguardo.

Esiste una best practice in merito all'esecuzione del metodo in questione?

di seguito un piccolo snippet di codice, perdonate l'ingenuità (specialmente nell'uso di xcopy per la copia, non ho trovato di meglio considerando i vincoli di tempo per la scrittura, di affidabilità e di non installabilità di software aggiuntivo sul sistema che esegue: se avete dritte su una copia dei file tramite vbs che sia più sicura del classico objfso.copyfolder, ve ne sarò grato!)

Function Copia_Installer(byVal NomePc)
Set objShell = WScript.CreateObject("WScript.Shell")
Return = objShell.Run("xcopy " & Path_Install & " \\" & NomePc & "\C$\TMP\ /s /e /h /i /y",1,True)
End Function

Function EseguiInstall(byVal NomePc)
Set objShell = CreateObject("WScript.Shell")
EseguiInstall = objShell.Run("psexec \\" & NomePc & " C:\TMP\XLSilent\XLSilent.bat")
End Function

avvelenato
16-07-2013, 08:43
Non mi ha risposto nessuno :(

comunque nel frattempo ho trovato questo
http://windowsitpro.com/scripting/how-multi-thread-vbscript-scripts
che è molto carino.

Se riuscissi a far "parlare" gli script "figli" in esecuzione asincrona, sarebbe belliffimo :fagiano: