![バッチ ファイル内の Powershell コマンド: 「foo」と「bar」を含む行を除くすべての行をテキスト ファイルから削除しますか?](https://rvso.com/image/1654781/%E3%83%90%E3%83%83%E3%83%81%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E5%86%85%E3%81%AE%20Powershell%20%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%3A%20%E3%80%8Cfoo%E3%80%8D%E3%81%A8%E3%80%8Cbar%E3%80%8D%E3%82%92%E5%90%AB%E3%82%80%E8%A1%8C%E3%82%92%E9%99%A4%E3%81%8F%E3%81%99%E3%81%B9%E3%81%A6%E3%81%AE%E8%A1%8C%E3%82%92%E3%83%86%E3%82%AD%E3%82%B9%E3%83%88%20%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%8B%E3%82%89%E5%89%8A%E9%99%A4%E3%81%97%E3%81%BE%E3%81%99%E3%81%8B%3F.png)
次の 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」を含む行を保持したい場合はどうすればいいかということです。そして行に「バー」がありますか?
これまでに、パイプ文字を挿入する*foo*|*bar*
、アスタリスクを削除するfoo|bar
、先頭と末尾にのみアスタリスクを配置する、*foo|bar*
カンマを使用する、カンマを使用しない、セミコロンを使用する、セミコロンを使用しない、コマンドを複製する(使用する場合-like
と使用しない場合)$_
、その他さまざまな方法を試したと思います。
何も機能しません。これまでのすべての試行で、テキスト ファイルは同じように見え、元の 3 行には foo (行 1)、bar (行 2)、および both (行 3) が含まれます。
コマンドを編集してエラーが発生しないように、定期的に編集内容を削除してコマンドを再度実行し、「foo」のない行を削除するだけで動作します。または、コマンドを再度貼り付けてテストし、「bar」を含めるように編集しようとしますが、効果はありません。
最近この質問をしましたが、タイトルの言い回しが明確ではなかったようです。誰かが答えようとしましたが、彼らが提供した答えはどれもうまくいきませんでした。少なくとも、コマンドをバッチファイルに入れてテキストファイルの横で実行しているときはうまくいきました。彼らにとっては、私とは違う方法を使ってうまくいっているのかもしれません。わかりません。
バッチ ファイルで PowerShell コマンドを使用していることに注意してください。コンソールに入力したり、ps1 スクリプトを使用したりしていません。 上で述べた最初のコマンドは動作する「foo」を含むすべての行を削除します。
明らかに、これは機能するので、コマンドを追加するための基盤として使用でき、1 つのコマンドで「foo」と「bar」を処理できます。
もちろん、これが 100% 不可能な場合を除いて、約 4 日間にわたってコマンドの 40 または 50 の異なるバリエーションを試した結果、私はその可能性を疑い始めています。
どなたかこの質問に答えてくださる方は、上記のようなバッチ ファイル コマンドを投稿してください。ps1 スクリプトの使用に切り替えるように指示したり、コンソール ウィンドウに入力する内容を説明する回答をしたりしないでください。
上記で投稿したコマンドは、単に何らかの修正を加えるだけで、「bar」を「foo」に追加して、複数のテキスト文字列を処理できるようになります。
これが非常に難しい理由は、"foo" を含む行を除くすべての行を削除するコマンドを実行すると、"bar" を含む行がすでに削除されているためと思われます。これが、まだ誰も有効な解決策を思いついていない理由であり、おそらく解決策が存在しないだけでしょう。
有効な回答をお持ちの方は、どうぞよろしくお願いいたします。通常、このような質問にはここですぐに回答が返ってくるか、さまざまな方法を試し続けることで解決しますが、今回はそうではありません。何らかの理由で、これは本当に難しい問題です。
答え1
OR で結合された 2 つの別々の条件を使用します。
cat $_.FullName | ? { $_ -like '*foo*' -or $_ -like '*bar*' }
わかりやすくするために括弧を使うこともできますが、オプションです。
{ ($_ -like '*foo*') -or ($_ -like '*bar*') }
上記のようなバッチ ファイル コマンドを投稿してください。ps1 スクリプトの使用に切り替えるように指示したり、コンソール ウィンドウに入力する内容を説明する回答をしたりしないでください。
これらは文字通り同じものです。PowerShell スクリプトの呼び出し方法は関係ありません。ファイルに保存されているか、コマンド ラインで渡されているか、キーボードで入力されているかに関係なく、それは PowerShell スクリプトであり、同じ構文規則に従います。
答え2
select-string
代わりに正規表現を使用することもできます:
gci *.txt | % { (cat $_.FullName | select-string -pattern 'foo|bar') | set-content $_.FullName -Force }
select-string
必要に応じて、今後さらに複雑な正規表現マッチングを実行できるようになります。