试图从此文件文本中删除字符串.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
则存在数据丢失的轻微风险。如果这是一个问题,您必须先写入临时文件,只有在成功后才能替换原始文件。