【问题标题】:Powershell pass string to ForEachPowershell 将字符串传递给 ForEach
【发布时间】:2014-01-01 18:59:02
【问题描述】:

我正在尝试导入 csv 文件并以竖线分隔格式输出列。

Import-csv file.dat | foreach {($_.'Column1')+ "|" +($_.'Column2')+ "|" +($_.'Column3')}

当我显式传递列值时,这很有效

($_.'ColumnX' + "|" $_.'ColumnY') etc.

我想将动态生成的变量字符串传递给 foreach 组件。

我能够生成一个看起来完全一样的“字符串”

"($_.'Column1')+ "|" +($_.'Column2')+ "|" +($_.'Column3')" 

但是,powershell 将生成的字符串视为单列并仅输出第一列。

例如。

$columns = ($_.'Column1')+ "|" +($_.'Column2')+ "|" +($_.'Column3')
Import-csv file.dat | foreach {$columns}

关于如何获取在 foreach 部分下传递的列字符串以便我获得正确输出的任何建议?

【问题讨论】:

  • 您只是想将逗号转换为管道吗?为什么不使用-replace

标签: variables powershell csv dynamic foreach


【解决方案1】:

这对你有用吗?

Import-csv file.dat | ConvertTo-Csv -Delimiter '|' -NoTypeInformation

【讨论】:

  • 这很棒。它绝对有效!但是,我花了两天多的时间试图弄清楚如何将动态变量添加到 foreach 组中。我想知道如何将字符串作为动态变量传递!
  • 您的意思是要传递属性名称(列标题)的数组吗?
【解决方案2】:

如果我理解正确,您想读取 CSV(逗号分隔值)文件并将其输出为竖线“|”分开的文件。如果是这种情况,您可以执行以下操作:

gc file.dat | % {[string]::join("|", $_.split(','))}

这只是读取该行,将其拆分为每个逗号的字段并用竖线连接它们。

在您对@mjolnir 的回答发表评论后,以下是如何在 foreach 块中使用动态字段名称:

$f1 = "ColumnA"
$f2 = "ColumnB"
import-csv file.dat | % {$_.$($f1) + "|" + $_.$($f1)}

解释见我的回答here

【讨论】:

  • 是的,这就是计划,@mjolinor 的解决方案也可以正常工作。但是,我很想了解如何将字符串作为动态参数传递给 foreach 或其他任何东西。谢谢
  • $() 告诉 PS 首先计算括号内的表达式。所以foreach块变成{$_.ColumnA + "|" + $_.ColumnB}
猜你喜欢
  • 2014-09-04
  • 2018-11-14
  • 1970-01-01
  • 2022-12-20
  • 1970-01-01
  • 2021-08-26
  • 1970-01-01
  • 2012-06-13
  • 2020-04-08
相关资源
最近更新 更多