Powershell在多个文本文件中调整列值

时间:2017-09-01 14:00:45

标签: powershell

Powershell的新手并寻求一些帮助。我有多个xyz文件,当前显示的z值为正值,我需要将所有值设为负值(或z-positive down)。到目前为止,我最好的尝试是尝试从其他代码行中拼凑出我所知道的内容,但我还远未找到解决方案。

$data = Get-ChildItem "C:\Users\dwilson\Desktop\test" -Recurse | 
foreach ($item in $data) {$item.'Col 3' = 0 - $item.'Col 3'}

非常感谢任何帮助!

2 个答案:

答案 0 :(得分:0)

使用Get-ChildItem返回的文件循环,您可以使用Import-CSV参数为-Header导入每个文件,为每列分配属性名称。然后我们可以更新该属性的信息然后导出它。使用ConvertTo-CSV cmdlet,然后使用Select-Object -Skip 1,我们可以在导出之前将标头从CSV中删除。

$Files = Get-ChildItem "C:\Users\dwilson\Desktop\test" -Recurse
foreach ($File in $Files) {
    $Data = Import-CSV $File -Header 'Col1','Col2','Col3'
    $newData = ForEach ($Row in $Data) {
        $Row.'Col3' = 0 - $Row.'Col3'
        $Row
    }
    $newData |
        Convertto-CSV -NoTypeInformation |
        Select-Object -Skip 1 |
        Out-File "$($File.Fullname).new)"
}

答案 1 :(得分:0)

有点暂时,但你在这里使用混合语法。

foreach ($i in $set) { ... }

这是Foreach statement。它不接受来自管道的输入,也不会自动将输出发送到管道。另请参阅Get-Help about_Foreach

Get-ChildItem | ForEach-Object { ... }

这是ForEach-Object command。它接受来自管道的输入并将输出发送到管道。重要的是,此命令还具有默认别名foreach。另请参阅Get-Help ForEach-Object

Foreach语句的帮助解释了PowerShell如何决定foreach的含义(强调我的):

  

Foreach出现在命令管道中时,PowerShell使用foreach别名,该别名调用ForEach-Object命令。 在命令管道中使用foreach别名时,不会像使用($<item> in $<collection>)语句那样包含Foreach语法。这是因为先前的管道中的命令提供此信息。