尝试编辑具有特定字符串的 txt 文件



试图从此文件文本中删除字符串.txt,但行$user1 -DistributionGroup "GRP-$user1"需要具体说明这一点,并且我在表达式或语句中得到了一个意外的标记'GRP-$user1""'

这是脚本:

Get-Content C:test.txt | Where-Object {
$_ -notmatch " $user1 -DistributionGroup "GRP-$user1""
} | Set-Content C:test.txt

如果我在整行中使用'$user1 -DistributionGroup "GRP-$user1"',它不会出错,但它也不使用命令$user1,它会以纯文本形式查找$user1

您必须按如下方式转义字符串。

"$user1 -DistributionGroup ""GRP-$user1"""

此外,删除上述文本的每次出现都使用替换。

$content = Get-Content C:test.txt | ForEach-Object { $_.replace("$user1 -DistributionGroup ""GRP-$user1""", "") }
$content | Set-Content C:test.txt

你的代码有两个问题:

  • 您需要正确转义可扩展字符串中嵌入的"字符("..."(

    • 虽然使用""是一种选择,如 rufer7 的答案所示,但最好养成使用通用转义字符的习惯,`(反引号(:
    • " $user1 -DistributionGroup `"GRP-$user1`""
  • 如果不进行额外的努力,则无法将结果写回在同一管道的上下文中提供输入的同一文件,因为管道的逐行(对象(处理,Get-Content在开始写入文件时尚未完成读取文件Set-Content

    • 一个简单的解决方法是将Get-Content调用括在(...)(括号(中,这会强制将输入文件完全入内存。[1]

总而言之:

# Note the (...) around Get-Content and the `-escaped embedded " chars.
(Get-Content C:test.txt) | Where-Object {
$_ -notmatch " $user1 -DistributionGroup `"GRP-$user1`""
} | Set-Content C:test.txt

假设您首先将所有行读入内存,您还可以使用更快的.Where()数组方法(PSv4+(:

Set-Content C:test.txt -Value (
(Get-Content C:test.txt).Where({ $_ -notmatch " $user1 -DistributionGroup `"GRP-$user1`"" })
)

将筛选行数组作为参数传递给Set-Content而不是通过管道传递可进一步加快命令的速度。


[1] 请注意,如果您的命令在完成将所有行写回文件之前中断Set-Content则存在数据丢失的轻微风险。如果这是一个问题,您必须先写入临时文件,只有在成功后才能替换原始文件。

最新更新