2012-01-18 28 views
21

Tôi có một dãy tên tệp trong Powershell và tôi muốn thêm một đường dẫn cho mỗi mục và nhận kết quả trong một mảng mới.Chọn/ánh xạ từng mục của một mảng Powershell đến một mảng mới

Trong C# tôi có thể làm điều này sử dụng LINQ ...

var files = new string[] { "file1.txt", "file2.txt" }; 
var path = "c:\temp\"; 
var filesWithPath = files.Select(f => path + f).ToArray(); 

Nhưng cách thành ngữ để làm điều này trong Powershell là gì? Dường như có một cú pháp foreach tôi có thể sử dụng, nhưng tôi con số phải có một cách súc tích, chức năng hơn để làm điều đó.

Trả lời

35

Một mảng trong Powershell được khai báo với cú pháp @(). % là viết tắt của foreach-object. Hãy khai báo một mảng với tất cả các tên tệp và lặp qua nó với foreach. join-path kết hợp đường dẫn và đường dẫn con vào một đường dẫn duy nhất.

$files = @("file1.txt", "file2.txt") 
$pFiles = $files | % {join-path "c:\temp" $_ } 
$pFiles 

Output:

c:\temp\file1.txt 
c:\temp\file2.txt 
+0

Cảm ơn rất nhiều, tôi đã không thấy gì về tốc độ đó. –

+0

Điều này có vẻ như nếu mảng nguồn chỉ có 1 phần tử hơn kết quả sẽ không phải là mảng ... đây có phải là sự hiểu biết của bạn không? – chosenbreed37

+0

@ selectedbreed37 Đây là khoảng bốn tuổi một câu hỏi. Vui lòng đăng một bài đăng mới để bạn sẽ nhận được nhiều sự chú ý hơn từ cộng đồng. – vonPryz

2

Như thế này:

$a = @("file1.txt","file2.txt") 
$b = "c:\temp\" 
$c = $a | % { $b + $_ } 

Tôi không thể hình này w/o một foreach. Xin lỗi

Sử dụng công việc tuyệt vời từ Josh Einstein LINQ for Powershell

bạn có thể viết này:

$a = @("file1.txt","file2.txt") 
$b = "c:\temp\" 
$c = $a | Linq-Select -Selector {$b + $_ } 

có kết quả tương tự một cách LINQ nhưng không sử dụng foreach (%).

+3

w/o 'foreach' nó sẽ là '$ c = $ a | . {process {$ b + $ _}} '. Về cơ bản nó giống nhau nhưng hoạt động nhanh hơn. –

+0

Cảm ơn các bạn, tôi chấp nhận tất cả các câu trả lời nếu tôi có thể! –

+0

@RomanKuzmin cảm ơn vì điều này, không bao giờ sử dụng loại 'foreach' này! Bạn có một số giá trị phần trăm trong việc truy tố nhanh hơn để tôn trọng một% không? cảm ơn bạn –

2

Bạn cũng có thể sử dụng thay thế điều hành:

PS> 'file1.txt','file2.txt','file3.txt' -replace '(^.+$)','C:\temp\$1' 

C:\temp\file1.txt 
C:\temp\file2.txt 
C:\temp\file3.txt 
Các vấn đề liên quan