选择/映射Powershell数组的每个项目到一个新数组

时间:2012-01-18 10:54:11

标签: 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语法,但我认为必须有一种更简洁,更实用的方法来实现它。

3 个答案:

答案 0 :(得分:51)

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

注意:如果输入由单个元素组成,则foreach不会返回集合。如果需要数组,请使用显式类型或包装结果。像这样,

[array]$pFiles = $files | % {join-path "c:\temp" $_ }
$pFiles = @($files | % {join-path "c:\temp" $_ })

答案 1 :(得分:3)

像这样:

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

我无法想象这不是一个foreach。遗憾

使用Josh Einstein的杰出工作LINQ for Powershell

你可以这样写:

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

以LINQ方式获得相同的结果但不使用foreach(%)。

答案 2 :(得分:3)

您也可以使用替换运算符:

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

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