Помните, что PowerShell обрабатывает объекты, а не только текст. В то время как в обычных пакетных файлах вы можете установить переменную в строку, а затем просто использовать ее как команду:
set Foo=dir /b
%Foo%
... это не работает в PowerShell. Таким образом, ваше присвоение $Start
уже создает новый процесс, так как команда после =
запускается, а ее результат присваивается $Start
.
Кроме того, вы все усложняете без необходимости. Вместо этого я бы предложил следующее:
$Running = Get-Process prog -ErrorAction SilentlyContinue
if (!$Running) { Start-Process C:\utilities\prog.exe }
Поскольку Get-Process
возвращает объект (который оценивается в $true
) или $null
(который оценивается в $false
), вы можете упростить проверку, как показано выше. Это называется приведением типа, поскольку оператор if
ожидает логическое значение, а правила для того, что будет обрабатываться как $true
и $false
, очень согласованы в таких случаях, как указано выше. И это звучит лучше.
Я также использовал командлет Start-Process
вместо WMI для создания нового процесса. Вы даже можете использовать следующее:
if (!$Running) { C:\utilities\prog.exe }
, если приложение не является консольным приложением (и, таким образом, блокирует сценарий PowerShell до его завершения). PowerShell по-прежнему является оболочкой, поэтому запуск программ - это то, что изначально отлично работает: -)
Вы могли бы даже вставить переменную $running
, но я думаю, что комментарий был бы для того, чтобы уточнить, что вы делаете.