PowerShell - перемикачі Start-Process та Cmdline


79

Я можу запустити це чудово:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" 
start-process $msbuild -wait

Але коли я запускаю цей код (нижче), я отримую повідомлення про помилку:

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /v:q /nologo" 
start-process $msbuild -wait

Чи є спосіб передати параметри в MSBuild за допомогою стартового процесу? Я відкритий для того, щоб не використовувати стартовий процес, єдина причина, через яку я його використав, - це те, що мені потрібно було мати команду як змінну.

Коли у мене на лінії є
C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ MSBuild.exe / v: q / nologo
, як це обробляється в Powershell?

Чи повинен я замість цього використовувати якусь функцію eval ()?


Дивіться blogs.msdn.com/powershell/archive/2007/01/16/… про альтернативні варіанти запуску.
i_am_jorf

Дякую, jeffamaphone, це була також хороша довідкова інформація.
BuddyJoe

1
Майте на увазі, що Start-Process - це нова функція у V2. Інформація в цьому дописі дуже гарна, але частина з них насправді вже не потрібна у V2.
EBGreen

Сам Start-Process є новим для V2? Ви можете трохи детальніше розказати? У мене не встановлено жодної машини з V1 для тестування.
BuddyJoe

1
Я просто маю на увазі, що командлет Start-Process не існував у V1. У V1 вам довелося використовувати один із методів, перерахованих у дописі в блозі, на який посилався Джеф.
EBGreen

Відповіді:


124

ви хочете розділити свої аргументи на окремий параметр

$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
$arguments = "/v:q /nologo"
start-process $msbuild $arguments 

15
$argsоскільки ім'я змінної не працює, воно зарезервоване. Використовуйте $argumentsабо щось інше замість цього
joshcomley

1
Схоже, черга пропозицій заповнена, але я порадив би читачам зрозуміти, що -ArgumentListшукає рядок, тому приклад іншої відповіді з відокремленими комами рядками (технічно масив) може працювати через те, як PowerShell потенційно розгортає його, але якщо ви прагнучи передати список аргументів з масиву, мабуть, найкраще заздалегідь «розпакувати» його в рядок.
dragon788

3
@ dragon788, get-help start-processвказує, що очікує -ArgumentListString[]
asynchronos

60

Використовуючи явні параметри, це буде:

$msbuild = 'C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe'
start-Process -FilePath $msbuild -ArgumentList '/v:q','/nologo'

EDIT: котирування.


Думаю, без них було б нормально, але з ними, безумовно, було б добре, тому я відредагую
EBGreen

4
Здається, це надійніше у використанні-ArgumentList ('/v:q','/nologo')
Пітер Тейлор,

1
Powershell настільки багатослівний. git gui &- як це просто (* nix, звичайно)! Порівняно з start-Process git -ArgumentList gui. Я знаю, що знаю, не корисно. Останнім часом я трохи грав у Powershell та багато приємних речей; але багатослівність - це вбивця!
HankCa

1
Ну, це лише багатослів'я, якщо ви хочете, щоб це було: start git -args gui теж працює. Я розумію, що це все-таки багатослівніше, ніж * nix. Справа в тому, що якщо ви використовуєте заповнення вкладки та псевдоніми, то кількість фактичних натискань клавіш значно зменшується. Я також додам, що багатослівність означає, що людина, яка взагалі погано знає PowerShell, могла читати команду PS і легше розуміти, що саме вона робить. Просто різниця у філософії.
EBGreen

@HankCa,sajb { git gui }
asynchronos

7

Увага

Якщо запустити PowerShell із вікна cmd.exe, створеного Powershell, другий екземпляр більше не чекає завершення завдань.

cmd>  PowerShell
PS> Start-Process cmd.exe -Wait 

Тепер із нового вікна cmd запустіть PowerShell ще раз і в ньому запустіть друге вікно cmd: cmd2> PowerShell

PS> Start-Process cmd.exe -Wait
PS>   

Другий екземпляр PowerShell більше не відзначає запит -Wait і ВСІ фонові процеси / завдання повертають статус "Завершено", навіть якщо вони все ще працюють!

Я виявив це, коли моя програма C # Explorer використовується для відкриття вікна cmd.exe, а PS запускається з цього вікна, а також ігнорує запит -Wait. Здається, будь-яка PowerShell, яка є `` завданням win32 '' cmd.exe, не виконує запит на очікування.

Я зіткнувся з цим з PowerShell версії 3.0 на Windows 7 / x64


5

Я виявив, що використання cmd працює як альтернатива, особливо коли вам потрібно конвеювати вихідні дані із викликаного додатка (особливо, коли воно не має вбудованих журналів, на відміну від msbuild)

cmd /C "$msbuild $args" >> $outputfile


2

Якщо операційна програма не використовує розширення спільноти PowerShell, яке надає командлет Start-Process разом із безліччю інших. Якщо це так, то рішення Гленнулара спрацьовує, оскільки воно відповідає позиційним параметрам pscx \ start-process: -path (позиція 1) -аргументи (позиція 2).

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.