我有一个包含这 3 行的文本文件:
This line contains foo.
This line contains bar.
This line has neither.
我可以在“.bat”文件(上面的“.txt”文件旁边)中运行以下命令,它会删除文本文件中的所有行,但包含“foo”的行除外:
Powershell.exe -Command "gci *.txt | foreach { (cat $_.FullName | ? { $_ -like '*foo*' }) | set-content $_.FullName}"
运行具有预期效果,在文本文件中只留下这一行:
This line contains foo.
现在的问题是:如果我想保留行中包含“foo”和“bar”的行怎么办?
到目前为止,我可能已经尝试了 40 或 50 种不同的组合,放一个竖线字符:*foo*|*bar*
,去掉星号foo|bar
,只在开头和结尾放星号:*foo|bar*
,使用逗号,不使用逗号,使用分号,不使用分号,使用和不使用 以及许多其他方式复制-like
命令。$_
没有任何效果 - 到目前为止,每次尝试时,我最终得到的文本文件看起来都一样,原来的三行包含 foo(第 1 行)、bar(第 2 行)和两者都不包含(第 3 行)。
为了确保我没有编辑命令并出错,我会定期删除我的编辑并再次运行该命令,以取出行上没有“foo”的行并且它可以工作,或者我只是再次粘贴命令,再次测试它,然后开始尝试编辑它以包含“bar”,但无济于事。
我最近已经问过这个问题,但我想我的标题措辞不清楚。有人试图回答它,但他们提供的每个答案都没有奏效,至少当我将命令放入批处理文件并在文本文件旁边运行时,也许它对他们有用,使用不同的方法我是谁,我不知道。
请注意,我在批处理文件中使用了 powershell 命令!我没有在控制台中输入或使用 ps1 脚本。 我不需要这样做,因为我上面提到的第一个命令确实可以删除所有带有“foo”的行。
显然,既然这确实有效,那么该命令可以用作添加的基础,因此它可以在一个命令中处理“foo”和“bar”。
除非这当然是 100% 不可能的——在大约 4 天之后尝试了 40 或 50 种不同的命令变体——这就是我开始怀疑的!
请,如果有人回答这个问题,请像我上面那样发布一个批处理文件命令。请不要告诉我改用 ps1 脚本或给出解释在控制台窗口中键入什么内容的答案。
我在上面发布的命令只需要某种修改,因此“bar”可以添加到“foo”,因此它可以处理多个文本字符串。
这看起来如此困难的原因似乎是因为如果您运行一个命令来取出除带有“foo”的行之外的所有行,那么您已经取出了带有“bar”的行。我怀疑这就是为什么还没有人想出一个可行的解决方案,也许根本就没有。
提前感谢任何有工作答案的人。通常,这些问题在这里得到了非常快的回答,或者我只是不断尝试不同的方式并让它发挥作用——但这次不是,出于某种原因,这真的很难。
只需使用两个单独的条件与 OR 连接:
括号可用于增加清晰度,但它们是可选的:
这些实际上是一回事。无论您如何调用 PowerShell 脚本 - 无论是存储在文件中、通过命令行传递还是通过键盘输入,它仍然是 PowerShell 脚本,并且遵循相同的语法规则。
您可以使用
select-string
采用正则表达式的方法:select-string
允许您在需要时执行更复杂的正则表达式匹配。延伸阅读