【问题标题】:Powershell build array with each item a new line [duplicate]Powershell构建数组,每个项目都有一个新行[重复]
【发布时间】:2021-09-30 01:33:57
【问题描述】:

使用Get-ChildItem,我提取了一个符合条件的文件列表,然后splitBasename 的一部分,并希望使用该部分名称构建一个数组。我可以成功地做到这一点,除了数组返回长字符串。我希望数组的每个部分都返回一个新行。

脚本:

$files = GCI "\\Paths" -Recurse | Where-Object {$_.LastWriteTime -ge (Get-Date).Adddays(-22)}

$name = ""

foreach($file in $files){
    $file = $file.basename.Split(".")[0]
        $array += $file    
}

我还尝试了以下方法,但没有成功:

$files = GCI "\\Paths" -Recurse | Where-Object {$_.LastWriteTime -ge (Get-Date).Adddays(-22)}
    
    $name = ""
    
    foreach($file in $files){
        $file = $file.basename.Split(".")[0]
            $array+= $file -split "`n"        
    }

调用$array时的当前结果:

file01file02file03file04

调用$array时的期望结果:

file01    
file02    
file03 
file04

【问题讨论】:

    标签: arrays powershell


    【解决方案1】:

    返回字符串是因为$array 不是数组。它是在赋值时输入的,它的第一个赋值是一个字符串。因此,它不断向该字符串附加新值。

    您可以改为:

    $array = foreach($file in $files){
        $file.basename.Split(".")[0]
    }
    

    在 foreach 语句中输出迭代值时,可以将该语句输出捕获到变量中。每个值都是数组的一个元素。

    顺便说一句,+= 向数组添加元素的语法效率低下,因为每次检索当前数组的所有内容后都会创建一个新数组。

    【讨论】:

      【解决方案2】:

      您已经返回了一个数组,因此只需将其缩小到您分配给变量的范围即可。

      $files = GCI "\\Paths" -Recurse | 
          Where-Object {$_.LastWriteTime -ge (Get-Date).Adddays(-22)} | 
          ForEach-Object -Process {
              $_.basename.Split(".")[0]
      
          }
      

      或者,只需为您的 foreach 循环分配一个变量,将输出删除到一个数组中。:

      $arr = foreach (...)
      

      【讨论】:

        猜你喜欢
        • 2012-02-13
        • 2018-07-25
        • 2019-11-29
        • 2015-07-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-03
        • 2018-02-19
        相关资源
        最近更新 更多