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