Mogę uruchomić to dobrze:
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe"
start-process $msbuild -wait
Ale kiedy uruchamiam ten kod (poniżej), pojawia się błąd:
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe /v:q /nologo"
start-process $msbuild -wait
Czy istnieje sposób przekazywania parametrów do programu MSBuild przy użyciu procesu startowego? Jestem otwarty na to, że nie używam start-process, jedynym powodem, dla którego go użyłem, było posiadanie „polecenia” jako zmiennej.
Kiedy mam
C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ MSBuild.exe / v: q / nologo
w jednym wierszu, jak to jest obsługiwane w programie Powershell?
Czy powinienem zamiast tego używać jakiejś funkcji eval ()?
command-line
powershell
start-process
BuddyJoe
źródło
źródło
Odpowiedzi:
będziesz chciał podzielić swoje argumenty na osobne parametry
$msbuild = "C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe" $arguments = "/v:q /nologo" start-process $msbuild $arguments
źródło
$args
ponieważ nazwa zmiennej nie działa, jest zarezerwowana.$arguments
Zamiast tego użyj lub cokolwiek innego-ArgumentList
szuka ciągów znaków, więc przykład innej odpowiedzi z ciągami znaków oddzielonymi przecinkami (technicznie tablicą) może działać z powodu tego, jak potencjalnie PowerShell ją rozwija, ale jeśli tak chcąc przekazać listę argumentów z tablicy, prawdopodobnie najlepiej jest ją wcześniej „rozpakować” do łańcucha.get-help start-process
wskazuje, że -ArgumentList oczekujeString[]
Używając jawnych parametrów, byłoby to:
$msbuild = 'C:\WINDOWS\Microsoft.NET\Framework\v3.5\MSBuild.exe' start-Process -FilePath $msbuild -ArgumentList '/v:q','/nologo'
EDYCJA: cytaty.
źródło
-ArgumentList ('/v:q','/nologo')
git gui &
- jakie to proste (* nix oczywiście)! W porównaniu dostart-Process git -ArgumentList gui
. Wiem, wiem, nie pomocne. Ostatnio trochę bawiłem się Powershell i wiele fajnych rzeczy; ale gadatliwość jest zabójcza!sajb { git gui }
Ostrzeżenie
Jeśli uruchomisz PowerShell z okna cmd.exe utworzonego przez Powershell, drugie wystąpienie nie będzie już czekać na zakończenie zadań.
cmd> PowerShell PS> Start-Process cmd.exe -Wait
Teraz z nowego okna cmd uruchom ponownie PowerShell iw nim uruchom drugie okno cmd: cmd2> PowerShell
PS> Start-Process cmd.exe -Wait PS>
Drugie wystąpienie programu PowerShell nie honoruje już żądania -Wait, a WSZYSTKIE procesy / zadania w tle zwracają stan „Ukończono”, nawet jeśli nadal działają!
Odkryłem to, gdy mój program C # Explorer jest używany do otwierania okna cmd.exe i PS jest uruchamiany z tego okna, ignoruje również żądanie -Wait. Wygląda na to, że żaden program PowerShell, który jest „zadaniem win32” programu cmd.exe, nie spełnia żądania oczekiwania.
Natknąłem się na to z PowerShell w wersji 3.0 w systemie Windows 7 / x64
źródło
Zauważyłem, że użycie cmd działa dobrze jako alternatywa, zwłaszcza gdy musisz przesłać dane wyjściowe z wywoływanej aplikacji (szczególnie, gdy nie ma ona wbudowanego logowania, w przeciwieństwie do msbuild)
cmd /C "$msbuild $args" >> $outputfile
źródło
Chyba że OP korzysta z rozszerzeń społeczności programu PowerShell, które zapewniają cmdlet Start-Process wraz z kilkoma innymi. W takim przypadku rozwiązanie Glennulara działa świetnie, ponieważ pasuje do parametrów pozycyjnych pscx \ start-process: -path (pozycja 1) -arguments (pozycja 2).
źródło