2012-01-18 109 views
21

我在Powershell中有一个文件名的数组,并且我想为它们中的每一个添加一个路径并在新数组中获取结果。选择/映射Powershell阵列的每个项目到一个新的阵列

在C#中我能做到这一点使用LINQ ...

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

但什么是惯用的方法在PowerShell中做到这一点?它看起来像我可以使用的foreach语法,但我认为必须有一个更简洁,功能更强大的方法来实现它。

回答

35

Powershell中的数组声明为@()语法。 %foreach-object的简写。让我们声明一个包含所有文件名的数组,并用foreach循环遍历它。 join-path将路径和子路径合并为一条路径。

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

输出:

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

非常感谢,我没有看到有关该速记的任何信息。 – 2012-01-18 11:32:17

+0

这很好看,如果源数组只有1个元素,结果不会是数组......这是您的理解吗? – chosenbreed37 2016-01-06 15:43:23

+0

@ chosenbreed37这是一个四岁左右的问题。请发布一个新的,这样你会得到更多的社会关注。 – vonPryz 2016-01-06 16:02:18

2

像这样:

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

我不知道这W/O一个foreach。对不起

乔什 - 爱因斯坦使用非常出色LINQ for Powershell

,你可以这样写:

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

具有在LINQ的方式相同的结果,但不使用foreach(%)。

+3

W/O'foreach'这将是'$ C = $ A | 。{process {$ b + $ _}}'。它基本上是相同的,但工作更快。 – 2012-01-18 11:28:45

+0

谢谢你们,如果可以的话,我会接受所有的答案! – 2012-01-18 11:33:42

+0

@RomanKuzmin对此感谢,绝对不要使用这种'foreach'!你在快速执行方面有百分之几的价值吗?谢谢 – 2012-01-18 11:35:06

2

您也可以使用替换操作:

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

C:\temp\file1.txt 
C:\temp\file2.txt 
C:\temp\file3.txt