Utilizzare powershell.exe
sembra essere un buon approccio ma con i suoi pro e contro, ovviamente.
Pro:
- Ogni script viene richiamato in una sessione pulita separata.
- Anche gli arresti anomali non interrompono l'intero processo di test.
Contro:
- Invocare
powershell.exe
è un po 'lento.
- Il test dipende dai codici di uscita ma 0 non sempre significa successo.
Nessuno dei contro è menzionato è una domanda come un potenziale problema.
Lo script demo è di seguito. È stato testato con PS v2 e v3.I nomi di script possono includere caratteri speciali come spazi, apostrofi, parentesi, apici, dollari. Uno menzionato nel requisito dei commenti è la possibilità di ottenere i percorsi di script nel loro codice. Con gli script approccio proposte possono ottenere il loro proprio percorso come $MyInvocation.MyCommand.Path
# make a script list, use the full paths or explicit relative paths
$scripts = @(
'.\test1.ps1' # good name
'.\test 2.ps1' # with a space
".\test '3'.ps1" # with apostrophes
".\test [4].ps1" # with brackets
'.\test `5`.ps1' # with backticks
'.\test $6.ps1' # with a dollar
'.\test ''3'' [4] `5` $6.ps1' # all specials
)
# process each script in the list
foreach($script in $scripts) {
# make a command; mind &, ' around the path, and escaping '
$command = "& '" + $script.Replace("'", "''") + "'"
# invoke the command, i.e. the script in a separate process
powershell.exe -command $command
# check for the exit code (assuming 0 is for success)
if ($LastExitCode) {
# in this demo just write a warning
Write-Warning "Script $script failed."
}
else {
Write-Host "Script $script succeeded."
}
}
fonte
2012-11-11 07:41:09
Che cosa significa "il modo migliore per farlo" significa? Senza queste informazioni il tuo approccio con 'powershell.exe' sembra il migliore. Fa esattamente quello che ti serve, secondo la domanda. –
Ho pensato che esistessero le migliori pratiche. Il tuo commento non implica, a meno che qualcun altro non ne conosca uno. Il metodo 'powershell.exe' non mi permette di ottenere la posizione dello script tramite' $ MyInvocation.MyCommand.ScriptBlock.File', a meno che non stia facendo qualcosa di sbagliato. – Vimes
In realtà, la cosa MyInvocation potrebbe funzionare ... Potrei giurarlo non prima. Ora mi sto solo strappando i capelli cercando di farlo accettare i percorsi con lo spazio E non lancarlo in una nuova finestra. Ho impiegato più di 10 ore su questo, quindi qualsiasi aiuto è benvenuto. – Vimes