あなたの要件を正しく理解している場合、.cs ファイル内に文字列 TODO と ? (他の文字列)。
FIND コマンドが壊れていると思います。書かれているように、 という名前のファイル内で空の文字列を探します:
。パイプされた FINDSTR コマンドの出力を検索したいと考えています。しかし、FIND で探したい文字列がわかりません。
FIND 検索文字列は二重引用符で囲む必要があります - "search"
. 検索に二重引用符を含める場合は、各二重引用符を別の二重引用符でエスケープする必要があります。を検索するにはShe said "Hello"
、 が必要"She said ""Hello"""
です。
カウントが必要なため、FIND コマンドを使用したと思われます。ただし、文字列 (カウント > 0) の存在のみを探しているため、実際のカウントは必要ありません。出力は nul にリダイレクトでき、文字列が見つかった場合は && 演算子を使用してアクションを実行できます。
正規表現を使用して、単一の FINDSTR コマンドで検索を実行できるはずです。:
ある時点でTODO
(大文字と小文字を区別しない)が続く行を探していると仮定します。式.*
は、改行以外の任意の文字に 0 回以上一致します。したがって、検索文字列は になります:.*TODO
。私が:
間違っていて、検索に二重引用符を含める必要がある場合は、各二重引用符を のようなバックスラッシュでエスケープする必要があります\"
。
すべてのサブディレクトリ内で大文字と小文字を区別しない再帰的な正規表現検索を行っているため/s
、オプション/r
と/i
オプションが必要です。
オプションを使用しない限り、FINDSTR は任意の文字列をスペースごとに複数の検索に分割し/c:
ます。検索にスペースがないと思いますが、この/c
オプションをどのような方法でも使用したいと思います。通常、検索文字列も二重引用符で囲みます。
完全なコマンドは次のようになります
>nul findstr /sri /c:":.*TODO" *.cs && echo Do something to make the build fail
私の問題は、TeamCity がわからないため、ビルドを中止するように TeamCity に通知する方法がわからないことです。検索文字列が見つかった場合はメッセージを出力しましたが、明らかに他のアクションを実行する必要があります。
コメントに応じて編集
OK - あなたのコメントに基づいて、TeamCity は別の二重引用符で二重引用符をエスケープしているようです。したがって、元の質問で実際に実行されるコマンドは次のようになります
findstr /s /i TODO *.cs | find /c ":" >todo.txt
あなたが言うように、それはまったく問題ありません。
その場合、単一の FINDSTR を使用するという私の提案は完璧なはずです。検索にはスペースが必要ないため、引用符をまとめて削除できます。TeamCity が返されたエラー コードを調べてアクションを実行できる場合、それは非常に簡単です。
>nul findstr /sri :.*TODO *.cs
エラー コードは、文字列が見つかった場合は 0、見つからなかった場合は 1 になります。
見つかった場合はエラー コードを 1 にし、見つからなかった場合は 0 にする必要がある場合は、単に使用します。
>nul findstr /sri :.*TOTO *.cs && (exit 1) || (exit 0)
どうしてもオリジナルのコマンドを使いたい場合
findstr /s /i "TODO" *.cs | >nul find /c "":""
見つかった場合はエラー コード 0 を返し、見つからなかった場合は 1 を返します。
findstr /s /i "TODO" *.cs | >nul find /c "":"" && (exit 1) || (exit 0)
見つかった場合はエラー コード 1 を返し、見つからなかった場合は 0 を返します