在 powershell 中替换 $_ 子字符串值

Replacing $_ substring value in powershell

我正在尝试进一步使用我在 replace text at a specified line.

时发现的一段精彩代码

然而,试图让它读取 $_.Substring() 然后使用 $_ -replace 给我带来了麻烦;虽然我没有收到任何错误消息,但文本没有被替换。

这是无效的代码:

$content = Get-Content Z:\project\folder\subfolder\newindex2.html
$content | 
ForEach-Object { 
if ($_.ReadCount -ge 169 -and $_.ReadCount -le 171) { 
  $a = $_.Substring(40,57)
  $linked = '<a href="http://tempsite.info/folder1/folder2/' + $a + '">' + $a + '</a>'
  $_ -replace $a,$linked
} else { 
  $_ 
} 
} | 
Set-Content Z:\project\folder\subfolder\newindex2.html

重点是将 html table 列 link 中单元格的内容保存到网络服务器上与单元格中内容同名的文件中。

我尝试用正则表达式匹配文件名时运气不佳,但由于我设法做到了,所以要替换的文本总是在相同的位置结束,我想我会尝试位置替换。 要替换的文本始终为 57 个字符长,并且始终从位置 40 开始。

我查看了设置的变量,一切都设置正确,除了

$_ -replace $a,$linked 

不替换任何东西。 相反,整个文件只是重新写入,没有任何改变。任何人都可以指出我所缺少的 and/or 指出如何更轻松地达到结果吗?也许我使用的 Substring 有误,应该使用其他东西?

-replace 右侧参数中的第一项是正则表达式模式,因此根据子字符串包含的内容,某些字符可能是正则表达式控制字符。

你可以逃避它:

$_ -replace $([regex]::Escape($a)),$linked

或者使用不使用正则表达式的String.Replace()方法:

$_.Replace($a,$linked)

最后,正如@Matt 指出的那样,您可能希望完全避免查找和替换方法,因为您已经知道需要在哪些字符索引处插入新值:

$_.Remove(40,57).Insert(40,$linked)