【问题标题】:Select/map each item of a Powershell array to a new array选择/映射 Powershell 数组的每个项目到一个新数组
【发布时间】:2012-02-13 02:21:31
【问题描述】:

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

【问题讨论】:

    标签: powershell higher-order-functions array-map


    【解决方案1】:

    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 个元素而不是结果将不是一个数组......这是你的理解吗?
    • @chosenbreed37 这是一个大约四年前的问题。请发布一个新的,以便您得到社区更多的关注。
    • @vonPryz 这个问题是 powershell map array 的最高 Google 结果,而您的问题是获得最高票数和接受的答案。如果您建议的方法在输入长度为 1 时表现不同(而且似乎确实如此),那么我认为您应该在回答中提及这种事情,而不是忽略另一个问题。
    【解决方案2】:

    像这样:

    $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 (%)。

    【讨论】:

    • 没有foreach,它将是$c = $a | .{process{ $b + $_ }}。基本相同,但运行速度更快。
    • @RomanKuzmin 谢谢你,永远不要使用这种'foreach'!你在更快的执行方面有一些百分比价值吗?谢谢
    • 这很好。我以前从未见过这种语法。你能解释一下吗?在......面前 {?这是点源还是其他?
    【解决方案3】:

    你也可以使用替换操作符:

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

    【讨论】:

      猜你喜欢
      • 2018-11-16
      • 1970-01-01
      • 1970-01-01
      • 2021-09-30
      • 1970-01-01
      • 1970-01-01
      • 2018-05-05
      • 2023-01-09
      • 2015-07-14
      相关资源
      最近更新 更多