将内容添加到 powershell 中的特定行
Add Content to a specific line in powershell
我看过这个post:
但我无法添加这些行,因为“数组索引超出范围”。
我的脚本在做什么:
- 找到直线
- 遍历包含我要添加的数据的数组
- $文件[$行]+=$数据
- $行+=1
- 写入文件
我应该创建一个新的文件内容,然后将原始文件的每一行添加到其中吗?
如果是这样,您知道该怎么做以及如何停止并在其间添加我的数据吗?
谢谢!
--编辑--
我无法 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
简单多了:)
我看过这个post:
但我无法添加这些行,因为“数组索引超出范围”。
我的脚本在做什么:
- 找到直线
- 遍历包含我要添加的数据的数组
- $文件[$行]+=$数据
- $行+=1
- 写入文件
我应该创建一个新的文件内容,然后将原始文件的每一行添加到其中吗? 如果是这样,您知道该怎么做以及如何停止并在其间添加我的数据吗?
谢谢!
--编辑-- 我无法 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
简单多了:)