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

Jon*_*mer 34 powershell

我在Powershell中有一个文件名数组,我想在它们前面添加一个路径并将结果放在一个新数组中.

在C#中,我可以使用Linq来做到这一点......

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

但是在Powershell中这样做的惯用方法是什么?看起来我可以使用foreach语法,但我认为必须有一个更简洁,更实用的方法来实现它.

von*_*ryz 61

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

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

输出:

c:\temp\file1.txt
c:\temp\file2.txt
Run Code Online (Sandbox Code Playgroud)

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

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

  • @vonPryz 这个问题是 _powershell map array_ 的最高谷歌结果,而你是最高投票和接受的答案。如果您建议的方法在输入长度为 1 时表现不同(似乎确实如此),那么我认为这是您应该在答案中提及的事情,而不是回避另一个问题。 (3认同)
  • 如果源数组只有1个元素而不是数组,这看起来很好......这是你的理解吗? (2认同)

CB.*_*CB. 5

像这样:

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

我无法理解这个 w/oa foreach 。对不起

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

你可以这样写:

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

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

  • 如果没有`foreach`,它将是`$c = $a | .{进程{ $b + $_ }}`。它基本上是相同的,但运行速度更快。 (4认同)
  • 这非常好。我以前从未见过这种语法。您能否解释一下有关 . 在......面前 {?这是点源还是其他什么? (2认同)