bat*_*cmd -3 windows powershell batch command-line
我有一个包含以下 3 行的文本文件:
This line contains foo.
This line contains bar.
This line has neither.
Run Code Online (Sandbox Code Playgroud)
我可以在“.bat”文件(在上面的“.txt”文件旁边)中运行以下命令,它会删除文本文件中的所有行,除了包含“foo”的行:
Powershell.exe -Command "gci *.txt | foreach { (cat $_.FullName | ? { $_ -like '*foo*' }) | set-content $_.FullName}"
Run Code Online (Sandbox Code Playgroud)
运行达到预期效果,在文本文件中只留下这一行:
This line contains foo.
Run Code Online (Sandbox Code Playgroud)
现在的问题是:如果我想保留行中包含“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 连接:
cat $_.FullName | ? { $_ -like '*foo*' -or $_ -like '*bar*' }
Run Code Online (Sandbox Code Playgroud)
括号可用于增加清晰度,但它们是可选的:
{ ($_ -like '*foo*') -or ($_ -like '*bar*') }
Run Code Online (Sandbox Code Playgroud)
就像我上面一样发布批处理文件命令。请不要告诉我改用 ps1 脚本或给出解释在控制台窗口中键入内容的答案。
这些字面意思是一样的。无论您如何调用 PowerShell 脚本,无论它是存储在文件中还是通过命令行传递或通过键盘输入,它仍然是一个 PowerShell 脚本,并且遵循相同的语法规则。
| 归档时间: |
|
| 查看次数: |
46 次 |
| 最近记录: |