将内容添加到 powershell 中的特定行

Add Content to a specific line in powershell

我看过这个post:

但我无法添加这些行,因为“数组索引超出范围”。

我的脚本在做什么:

  1. 找到直线
  2. 遍历包含我要添加的数据的数组
  3. $文件[$行]+=$数据
  4. $行+=1
  5. 写入文件

我应该创建一个新的文件内容,然后将原始文件的每一行添加到其中吗? 如果是这样,您知道该怎么做以及如何停止并在其间添加我的数据吗?

谢谢!

--编辑-- 我无法 post 整个代码,因为它存储在虚拟机上,我无法将内容复制到我的实际计算机中。 但这是我尝试添加的部分:

$f=Get-Content $path
$ct=$begin+1 #$begin is the line where i want to place content under
foreach($add in $add_to_yaml)
{
     $f[$ct]+=$add
     $ct+=1
}
$f | Out-File -FilePath $file

让我们分解你的脚本并尝试分析发生了什么:

$f = Get-Content $path

Get-Content,默认情况下,读取文本文件并在文件中的每一行吐出 1 个字符串。如果在 $path 处找到的文件有 10 行,则存储在 $f 中的结果值将是一个包含 10 个字符串值的数组。

值得注意的是 PowerShell(和一般的 .NET)中的数组索引是 zero-based - 要从文件中获取第 10 行,我们将参考数组中的索引 9 ($f[9]).

这意味着如果您想将内容连接到第 10 行的末尾(或“下方”),您需要指定索引 9。因此,您需要更改以下行:

$ct = $begin + 1 #$begin is the line where i want to place content under

$ct = $begin 

现在我们有了正确的起始偏移量,让我们看看循环:

foreach($add in $add_to_yaml)
{
     $f[$ct] += $add
     $ct += 1
}

假设$add_to_yaml包含多个字符串,循环体将执行不止一次。先看第一条语句:

$f[$ct] += $add

我们知道 $f[$ct] 解析为 字符串 - 并且字符串有 += 运算符重载以表示“字符串连接”。这意味着存储在 $f[$ct] 中的字符串值将被修改(例如,字符串会变长),但数组 $f 本身 不会 改变其大小- 它仍然包含相同数量的字符串,只是其中一个稍微长了一点。

这让我们找到了问题的症结所在,这行就在这里:

$ct += 1

通过增加索引计数器,您可以有效地“跳”到 $add_to_yaml 中每个值的下一个字符串 - 所以如果您要添加的元素数超过 [=29= 之后的行数],您自然会在完成之前到达数组“超出范围”的点。

不要递增 $ct,而是确保将新字符串值与换行序列连接起来:

$f[$ct] = $f[$ct],$add -join [Environment]::Newline

把它们全部放回去,你最终会得到这样的结果(注意我们可以完全丢弃 $ct,因为它的值是常数,无论如何都等于 $begin):

$f = Get-Content $path

foreach($add in $add_to_yaml)
{
    $f[$begin] = $f[$begin],$add -join [Environment]::Newline
}

但是等一下 - $add_to_yaml 中的所有字符串都将由换行符简单地连接 - 我们可以在单个 -join 操作中做到这一点并摆脱循环!

$f = Get-Content $path
$f[$begin] = @($f[$begin];$add_to_yaml) -join [Environment]::Newline
$f | Out-File -FilePath $file

简单多了:)