Tenere presente che PowerShell gestisce gli oggetti e non solo il testo. Mentre in normali file batch è possibile impostare una variabile in una stringa e poi basta usarlo come un comando:
set Foo=dir /b
%Foo%
... questo non funziona in PowerShell.Pertanto, l'assegnazione di $Start
crea già il nuovo processo dal comando dopo l'esecuzione dello =
e il suo risultato assegnato a $Start
.
Inoltre stai complicando le cose inutilmente. Io suggerirei il seguente invece:
$Running = Get-Process prog -ErrorAction SilentlyContinue
if (!$Running) { Start-Process C:\utilities\prog.exe }
Dal Get-Process
restituisce un oggetto (che restituisce $true
) o $null
(che restituisce $false
) è possibile semplificare il controllo, come mostrato sopra. Si chiama coercizione di tipo, poiché la dichiarazione if
prevede un valore booleano e le regole su ciò che verrà trattato come $true
e $false
sono molto coerenti in questi casi come sopra. E legge meglio.
Ho anche utilizzato il cmdlet Start-Process
anziché WMI per creare il nuovo processo. Si potrebbe anche utilizzare il seguente:
if (!$Running) { C:\utilities\prog.exe }
se l'applicazione non è un'applicazione di console (e quindi potrebbe bloccare lo script PowerShell fino a quando non esce). PowerShell è ancora una shell, quindi avviare i programmi è qualcosa che funziona in modo nativo molto bene :-)
Si potrebbe persino allineare la variabile $running
, ma suppongo che un commento sarebbe per chiarire cosa si fa, quindi.
OK grazie per la spiegazione chiara. – Charlotte
Non capisco come la soluzione risolverà il problema. La riga '$ Start = ...' avvierà comunque il processo ogni volta. Ho eseguito il test del codice e sono stati avviati i multipli dello stesso processo. (assicurati di testare con un programma che permetta diversi istanti di se stesso) – LosManos
Ciao @LosManos, è possibile che tu abbia dimenticato il {} (scriptblock)? –