3

私は次のような名前の50個のファイルを持っています:CPUNAME_installer.txtそしてそれぞれの内容は次のようなものです:

CPUNAME;11724;sdaasdasdasdasdasdasd
CPUNAME;1034;231asddasd
CPUNAME;1035;231asddasd
CPUNAME;10741;231asddasd
CPUNAME;10111;231asddasd

...など、数百行の場合。コード11724、1034、または1487の行があるかどうかを確認し、trueの場合は、行全体を別のフォルダーにある同じ名前の別のテキストファイルにパイプします。

今のところ私はこの実用的な解決策を持っています:

for %%f in (*_installer.txt) do (
    type %%f | findstr /I /C:"11724">>outfolder\%%f
    type %%f | findstr /I /C:"1034">>outfolder\%%f
    type %%f | findstr /I /C:"1487">>outfolder\%%f
)

...ただし、ファイルごとに6つのコマンドを実行するため、時間がかかります。

各ファイル(または同様のもの)のコマンドの数を減らすことでこれを改善することは可能ですか?

4

1 に答える 1

5

FINDSTRのドキュメントを読んでください(HELP FINDSTRコマンドウィンドウから入力してください)-FINDSTRが1回のパスで複数の文字列を検索できることがわかります。

このバグがあるため、複数の検索文字列で/ Iオプションを使用しているのは良いことです。複数のリテラル検索文字列を使用したこのFINDSTRの例では、一致するものが見つからないのはなぜですか。

また、コンテンツを入力してFINDSTRにパイプする必要はありません。ファイル名を引数として渡すだけです。

あなたの場合、文字列にはスペースが含まれていないため、コードは次のようになります。検索文字列はスペースで区切られます。

for %%f in (*_installer.txt) do findstr /i "11724 1034 1487" "%%f" >"outfolder\%%f"

上記に注意してください。検索文字列を変更する場合は/L、文字列を正規表現ではなく文字列リテラルとして処理するように強制するオプションを追加する必要がある場合があります。

複数の検索を指定するもう1つの方法は、複数の/Cオプションを使用することです。/Rこれらの検索文字列は、オプションが使用されていない限り、常にリテラルとして扱われます。

for %%f in (*_installer.txt) do findstr /i /c:"11724" /c:"1034" /c:"1487" "%%f" >"outfolder\%%f"

オプションを調査することも/G:fileできます。これにより、検索文字列を1行に1つずつ別のテキストファイルに入れることができます。この手法を使用すると、多くの文字列を簡単に検索できます。

PS

FINDSTRを使用する場合、文書化されていない多くの落とし穴があります。WindowsFINDSTRコマンドの文書化されていない機能と制限は何ですか?を読むことに興味があるかもしれません。

于 2012-11-14T14:37:24.197 に答える