2008-10-08 37 views
24

Tôi đang cố gắng để có được kịch bản Powershell đơn giản này làm việc nhưng tôi nghĩ rằng một cái gì đó về cơ bản là sai ;-)Chạy chương trình trong một foreach

ls | foreach { "C:\Working\tools\custom-tool.exe" $_ } 

tôi về cơ bản muốn nhận được tập tin trong một thư mục và vượt qua chúng một một là đối số cho công cụ tùy chỉnh.

Trả lời

31
ls | %{C:\Working\tools\custom-tool.exe $_} 

Khi mỗi đối tượng đi xuống đường ống, công cụ sẽ chạy với nó. Đặt dấu ngoặc kép quanh chuỗi lệnh làm cho nó trở thành ... một sting! Biến cục bộ "$ _" sau đó có khả năng không biết phải làm gì với các pukes có lỗi.

6

Tôi đặt cược công cụ của bạn cần đường dẫn đầy đủ. $ _ Là mỗi đối tượng tệp đi qua đường dẫn. Bạn có thể cần phải sử dụng một biểu thức như thế này:

ls | %{C:\Working\tools\custom-tool.exe $_.fullname} 
40

Nếu bạn vẫn cần dấu ngoặc kép quanh con đường lệnh (ví dụ, nếu bạn đã có không gian), chỉ làm điều đó như thế này:

ls | % { &"C:\Working\tools\custom-tool.exe" $_.FullName } 

Chú ý việc sử dụng & trước chuỗi để ép PowerShell diễn giải nó dưới dạng một lệnh chứ không phải chuỗi.

+0

Và nếu cờ là cần thiết, họ có thể được thêm vào sau khi kết thúc; 'ls | % {& "C: \ Working \ tools \ custom-tool.exe" $ _. FullName --flag --flag2 = 47} ' –

+0

% làm gì? – User

+0

Tôi đã phát hiện ra. Đó là bí danh cho 'ForEach-Object'. Bạn có thể thấy các bí danh hiện tại tại dấu nhắc powerhell bằng cách gõ 'get-alias' – User

2

Cả Jeffrery Hicks và slipsec đều chính xác. Yank dấu ngoặc kép tắt.

$ _ hoặc $ _. Fullname làm việc trong tập lệnh thử nghiệm của tôi (bên dưới). YMMV với công cụ tùy chỉnh của bạn.

gci | % { c:\windows\notepad.exe $_.fullname } 

hoặc

gci | % { c:\windows\notepad.exe $_ } 
Các vấn đề liên quan