2012-01-18 9 views
21

Mam tablicę nazw plików w Powershell i chciałbym dodać ścieżkę do każdego z nich i uzyskać wynik w nowej tablicy.Zaznacz/zamapuj każdy element tablicy Powershell na nową tablicę

W języku C# mogłem to zrobić przy użyciu LINQ ...

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

Ale co to jest idiomatycznych sposób to zrobić w PowerShell? Wygląda na to, że istnieje składnia foreach, z której mógłbym skorzystać, ale uważam, że musi istnieć bardziej zwięzły, funkcjonalny sposób.

Odpowiedz

35

Tablica w Powershell jest zadeklarowana przy użyciu składni @(). % jest skrótem dla foreach-object. Zadeklaruj tablicę z wszystkimi nazwami plików i przeprowadź przez nią pętlę foreach. join-path łączy ścieżkę i ścieżkę podrzędną w jedną ścieżkę.

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

wyjściowa:

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

Wielkie dzięki, nie widziałem nic o tym% stenotypie. –

+0

To dobrze, wygląda na to, że jeśli tablica źródłowa ma tylko jeden element, to wynik nie będzie tablicą ... czy to twoje zrozumienie? – chosenbreed37

+0

@ selectedbreed37 To jest około cztery lata pytanie. Opublikuj nowy, aby uzyskać więcej uwagi od społeczności. – vonPryz

2

jak poniżej:

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

nie może dowiedzieć W/O foreach. Niestety

Korzystanie z wielką pracę z Joshem Einsteina LINQ for Powershell

można napisać tak:

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

mający takie same wyniki w sposób LINQ, ale nie przy użyciu foreach (%).

+3

w/o 'foreach' będzie to' $ c = $ a | . {process {$ b + $ _}} '. Jest w zasadzie taki sam, ale działa szybciej. –

+0

Dzięki chłopaki, zaakceptowałbym wszystkie odpowiedzi, gdybym mógł! –

+0

@RomanKuzmin dziękuję za to, nigdy nie używaj tego rodzaju foreach! Czy masz jakąś wartość procentową w szybszym wykryciu, respektując%? dziękuję –

2

Można też użyć zastąpić operator:

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

C:\temp\file1.txt 
C:\temp\file2.txt 
C:\temp\file3.txt 
Powiązane problemy