В PowerShell консольные приложения запускаются синхронно, а оконные - асинхронно. Это означает, что если запущенное приложение является консольным, PowerShell не перейдёт к выполнению следующей команды, пока не будет завершена предыдущая. Если же приложение оконное - оно запускается в отдельном процессе и существует само по себе, не влияя на работу PowerShell который в это время переходит к выполнению очередной команды.
Рассмотрим нюансы запуска оконных приложений из PowerShell. Предположим, что нам нужно запустить wordpad.
Вариант 1:
>PS C:\Users\user> & "C:\Program Files\Windows NT\Accessories\wordpad.exe"
Символ "&" перед полным строковым именем исполняемого файла указывает на то, что сделующую за ним строку следует трактовать как команду. Двойные или одинарные (смотря по обстоятельствам) кавычки необходимы, т.к. в пути содержатся пробелы. Для тех кто не в курсе, поясняю: если использовать двойные кавычки, то все имена переменных (определённых в PowerShell, а так же созданных нами), указанных в тексте, будут заменены их значениями. Если использовать одинарные кавычки - замена производиться не будет. Пример:
PS D:\> "Домашний каталог пользователя: $Home"
Домашний каталог пользователя: C:\Users\user
В строке переменная была заменена своим значением.
PS D:\> 'Домашний каталог пользователя: $Home'
Домашний каталог пользователя: $Home
Строка осталась без изменений.
Вариант 2:
PS C:\Users\user> cd "C:\Program Files\Windows NT\Accessories"
PS C:\Program Files\Windows NT\Accessories> .\wordpad
Наличие ".\" перед файлом необходимо (данное требование присутствует в PowerShell из соображений безопасности), а расширение файла можно не указывать.
Если развернуть свойство ярлыка, указывающего на файл wordpad.exe, то можно увидеть, что в пути используется системная переменная %ProgramFiles%. Однако, если мы просмотрим перечень переменных, доступных на диске "variable:", то увидим что переменной с таким именем там нет.
Соответственно нам не удастся в пути к файлу использовать переменную $ProgramFiles (т.к. её нет в приведённом выше списке). В подобных ситуациях следует использовать синтаксис $env:ИмяПеременной, тем самым указывая PowerShell, что речь идёт о переменной операционной системы:
Вариант 3:
PS C:\Users\user> & "$env:ProgramFiles\Windows NT\Accessories\wordpad.exe"
В принципе можно воспользоваться функционалом, предоставленным .NET:
Вариант 4:
>PS C:\Users\user> & $([System.Environment]::ExpandEnvironmentVariables("%ProgramFiles%\Windows NT\Accessories\wordpad.exe"))
Наличие в данном выражении блока "$(...)" необходимо, т.к. этот синтаксис сообщает PowerShell о том, что сначала следует вычислить выражение, находящееся внутри этого оператора и уже затем результат передать далее (в нашем случае - "&").