Tenga en cuenta que PowerShell maneja objetos y no solo texto. Mientras que en los archivos por lotes normales se podría establecer una variable en una cadena y luego simplemente utilizarlo como un comando:
set Foo=dir /b
%Foo%
... esto no funciona en PowerShell.Así, su asignación de $Start
ya se crea el nuevo proceso, ya que el comando después de la =
se ejecuta y su resultado asignado a $Start
.
Además eres complicar las cosas innecesariamente. Me gustaría sugerir lo siguiente en su lugar:
$Running = Get-Process prog -ErrorAction SilentlyContinue
if (!$Running) { Start-Process C:\utilities\prog.exe }
Desde Get-Process
devuelve un objeto (que se evalúa como $true
) o $null
(que evalúa a $false
) se puede simplificar el registro de entrada, como se muestra arriba. Esto se llama conversión de tipos, ya que la declaración if
espera un valor booleano y las normas sobre lo que va a ser tratada como $true
y $false
son muy consistentes en tales casos que el anterior. Y se lee mejor.
También utilicé el Start-Process
cmdlet en lugar de WMI para crear el nuevo proceso. Incluso se puede utilizar lo siguiente:
if (!$Running) { C:\utilities\prog.exe }
si la aplicación no es una aplicación de consola (y por lo tanto podría bloquear la secuencia de comandos PowerShell hasta que sale). PowerShell sigue siendo un shell, por lo que iniciar programas es algo que funciona de forma nativa muy bien :-)
Incluso podría alinear la variable $running
, pero supongo que un comentario sería para aclarar lo que hace, entonces.
OK gracias por una explicación clara. – Charlotte
No entiendo cómo su solución resolverá el problema. La línea '$ Start = ...' todavía comenzará el proceso cada vez. Probé se ejecutó el código y se iniciaron los múltiplos del mismo proceso. (asegúrese de probar con un programa que permita varios instantes de sí mismo) – LosManos
Hola @LosManos, ¿es posible que hayas olvidado {} (scriptblock)? –