47

我在 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 语法,但我认为必须有一种更简洁、更实用的方法来做到这一点。

4

3 回答 3

78

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" $_ })
于 2012-01-18T11:05:56.743 回答
4

像这样:

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

我想不出这个 w/oa foreach。对不起

将 Josh Einstein LINQ 的出色工作用于 Powershell

你可以这样写:

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

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

于 2012-01-18T11:04:36.370 回答
4

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

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

C:\temp\file1.txt
C:\temp\file2.txt
C:\temp\file3.txt
于 2012-01-18T13:06:10.197 回答