更改并保存.nc文件

时间:2017-06-19 10:07:08

标签: powershell

我有大量的.nc文件(文本文件),我需要根据他们的布料和内容更改不同的行。

示例:

enter image description here

到目前为止,我有:

Get-ChildItem I:\temp *.nc -recurse | ForEach-Object {
    $c = ($_ | Get-Content)
    $c = $c -replace "S355J2","S235JR2"
    $c = $c.GetType() | Format-Table -AutoSize
    $c = $c -replace $c[3],$c[4]
    [IO.File]::WriteAllText($_.FullName, ($c -join "`r`n"))
}

但这不起作用,因为它只向每个文件返回少量PowerShell行,而不是原始(已更改)内容。

1 个答案:

答案 0 :(得分:0)

我不知道你期望$c = $c.GetType() | Format-Table -AutoSize做什么,但它很可能不会做你期望的任何事情。

如果我理解你的问题,你基本上想要

  1. 删除行pos
  2. 将代码S355J2替换为S235JR2
  3. 删除部分SI(如果存在)。
  4. 以下代码应该有效:

    Get-ChildItem I:\temp *.nc -Recurse | ForEach-Object {
      (Get-Content $_.FullName | Out-String) -replace 'pos\r\n\s+' -replace 'S355J2', 'S235JR2' -replace '(?m)^SI\r\n(\s+.*\n)+' |
        Set-Content $_.FullName
    }
    

    Out-String将输入文件的内容转换为单个字符串,菊花链替换操作会在将该字符串写回文件之前对其进行修改。表达式(?m)^SI\r\n(\s+.*\n)+匹配以SI开头的行,后跟一个或多个缩进行。 (?m)修饰符允许在多行字符串中匹配起始行,否则^只匹配字符串的开头。

    编辑:如果您需要将第3行中的变量文本替换为第4行中的文本(从而复制第4行),那么您最好使用数组。延迟字符串数组的重整,直到替换之后:

    Get-ChildItem I:\temp *.nc -Recurse | ForEach-Object {
      $txt = @(Get-Content $_.FullName)
      $txt[3] = $txt[4]
      ($txt | Out-String) -replace 'S355J2', 'S235JR2' -replace '(?m)^SI\r\n(\s+.*\n)+' |
        Set-Content $_.FullName
    }