PowerShell - Bộ chuyển mạch Start-Process và Cmdline


79

Tôi có thể chạy cái này tốt:

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

Nhưng khi tôi chạy mã này (bên dưới), tôi gặp lỗi:

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

Có cách nào tôi có thể chuyển các tham số cho MSBuild bằng start-process không? Tôi sẵn sàng không sử dụng start-process, lý do duy nhất tôi sử dụng nó là tôi cần có "lệnh" dưới dạng một biến.

Khi tôi có
C: \ WINDOWS \ Microsoft.NET \ Framework \ v3.5 \ MSBuild.exe / v: q / nologo
trên một dòng, làm thế nào để xử lý điều đó trong Powershell?

Thay vào đó, tôi có nên sử dụng một số loại hàm eval () không?


Xem blog.msdn.com/powershell/archive/2007/01/16/… để biết các lựa chọn thay thế cho quá trình bắt đầu.
i_am_jorf

Cảm ơn jeffamaphone, đây cũng là một số thông tin tham khảo tốt.
BuddyJoe

1
Hãy nhớ rằng Start-Process là một tính năng mới trong phiên bản V2. Thông tin trong bài viết đó là rất tốt nhưng một số trong số đó không thực sự cần thiết nữa trong V2.
EBGreen

Start-Process chính nó là mới cho V2? Bạn có thể nói rõ hơn một chút? Tôi không có bất kỳ máy nào cài đặt V1 để kiểm tra.
BuddyJoe

1
Ý tôi chỉ là lệnh Start-Process không tồn tại trong V1. Trong V1, bạn phải sử dụng một trong các phương pháp được liệt kê trong bài đăng trên blog mà Jef đã liên kết.
EBGreen

Câu trả lời:


124

bạn sẽ muốn tách các đối số của mình thành tham số riêng biệt

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

15
$argsvì một tên biến không hoạt động, nó được dành riêng. Sử dụng $argumentshoặc bất cứ điều gì khác thay vì
joshcomley

1
Có vẻ như hàng đợi đề xuất đã đầy, nhưng tôi khuyên người đọc hiểu rằng -ArgumentListđang tìm kiếm chuỗi, vì vậy ví dụ về câu trả lời khác với các chuỗi được phân tách bằng dấu phẩy (về mặt kỹ thuật là một mảng) có thể hoạt động vì cách PowerShell có khả năng giải nén nó, nhưng nếu bạn tìm cách chuyển vào danh sách đối số từ một mảng, tốt nhất có lẽ nên "giải nén" nó thành một chuỗi trước.
dragon788

3
@ dragon788, get-help start-processcho biết rằng -ArgumentList mong đợiString[]
không đồng bộ

60

Sử dụng các tham số rõ ràng, nó sẽ là:

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

EDIT: dấu ngoặc kép.


Tôi nghĩ rằng nó sẽ là ok nếu không có họ, nhưng nó chắc chắn sẽ là ok với họ vì vậy tôi sẽ chỉnh sửa nó
EBGreen

4
Nó có vẻ là đáng tin cậy hơn để sử dụng-ArgumentList ('/v:q','/nologo')
Peter Taylor

1
Powershell là SO dài dòng. git gui &- sao mà đơn giản thế (tất nhiên là * nix)! So với start-Process git -ArgumentList gui. Tôi biết tôi biết, không hữu ích. Gần đây tôi đã chơi với Powershell một chút và rất nhiều thứ hay ho; nhưng độ dài là một kẻ giết người!
HankCa

1
Chà, nó chỉ dài dòng như vậy nếu bạn muốn: start git -args gui cũng hoạt động. Tôi nhận ra rằng điều này vẫn còn dài dòng hơn * nix. Vấn đề là nếu bạn sử dụng bí danh và hoàn thành tab, thì số lần nhấn phím thực tế sẽ giảm đi đáng kể. Tôi cũng sẽ nói thêm rằng chi tiết có nghĩa là một người không hiểu rõ về powershell có thể đọc lệnh PS và dễ dàng hiểu chính xác hơn những gì nó đang làm. Chỉ là sự khác biệt về triết học.
EBGreen

@HankCa,sajb { git gui }
asynchronos

7

Cảnh báo

Nếu bạn chạy PowerShell từ cửa sổ cmd.exe do Powershell tạo, phiên bản thứ 2 không còn đợi công việc hoàn thành.

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

Bây giờ từ cửa sổ cmd mới, hãy chạy lại PowerShell và bên trong nó bắt đầu cửa sổ cmd thứ 2: cmd2> PowerShell

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

Phiên bản thứ 2 của PowerShell không còn tôn trọng yêu cầu -Wait và TẤT CẢ quy trình / công việc nền trả về trạng thái 'Đã hoàn thành' ngay cả khi bạn vẫn đang chạy!

Tôi phát hiện ra điều này khi chương trình C # Explorer của tôi được sử dụng để mở cửa sổ cmd.exe và PS được chạy từ cửa sổ đó, nó cũng bỏ qua yêu cầu -Wait. Có vẻ như bất kỳ PowerShell nào là 'công việc win32' của cmd.exe không đáp ứng được yêu cầu chờ.

Tôi gặp phải vấn đề này với PowerShell phiên bản 3.0 trên windows 7 / x64


5

Tôi thấy việc sử dụng cmd hoạt động tốt như một giải pháp thay thế, đặc biệt là khi bạn cần chuyển đầu ra từ ứng dụng được gọi (thông thường khi nó không được tích hợp sẵn tính năng ghi nhật ký, không giống như msbuild)

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


2

Trừ khi OP đang sử dụng Tiện ích mở rộng cộng đồng PowerShell cung cấp lệnh ghép ngắn Start-Process cùng với một loạt các lệnh khác. Nếu đúng như vậy thì giải pháp của Glennular có tác dụng vì nó khớp với các tham số vị trí của pscx \ start-process: -path (position 1) -arguments (positon 2).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.