find.exeはWindowsのコマンドプロンプトで指定したファイル内テキストをパターン検索してくれるコマンドとなります。
このコマンドをコマンドプロンプトから実行する場合は特に気を付ける必要はないのですが。
PowerShellから実行する場合はちょっと注意が必要なので本記事ではその点について説明する。
find.exeでは<"string">のように文字列をダブルクオートで囲む必要がある
find.exeのSyntaxを読むと、下記赤枠のように<"string">と記載があります。
これはfind.exeで検索を行う場合に、文字列指定は"String"
といったように、ダブルクオートで囲む必要を表しています。
それぞれhello(hello.txt),world(world.txt),helloworld(helloworld.txt)のようにテキスト(ファイル名)したテキストとファイル名が同一のファイルを用意して、helloという文字列で検索をかけてみます。
rem 文字列 hello を *.txtを対象に検索
find.exe "hello" *.txt
コマンドプロンプトでは上記のように検索できました。
この時点でPowerShellを普段ご利用の方はいやな予感がしてきているかと思いますが。
同様のコマンドをPowerShellから実行すると下記のようにエラーになります。
この動作が何に起因するかといえば、下記のドキュメントにあるように
PowerShellではダブルクオートで囲まれた文字列は展開してしまうしようとなっているため。
find.exeでは文字列として"String"といった形で渡す必要があるるが、PoweShellでは展開されてダブルクオートがなくなってしまう事に起因していそうです。
回避するためには下記のようにシングルクオートでさらに囲んで、文字列が展開されないようにエスケープしてあげればOK
find.exe '"hello"' *.txt
ちなみにfindstr.exeではダブルクオートは必要ない
似たコマンドとしてfindstr.exe
がありますが、こちらはSyntaxを見てみるとfind.exeと異なり、<strings>
といった具合でこちらのコマンドはダブルコーテーションでくくる必要がないため、PowerShellから実行する際は、こちらを利用すれば手間は少ない。
そもそもSelect-Stringでよくない?
PowerShellのコマンドレットには、Select-String
というコマンドレットが用意されてる。
このコマンドレットはfindstr.exeと同様にファイルを文字列検索する機能を提供している。
総評
PowerShellを使っているとダブルクオートの部分で失敗する事があるかと思います。
PowerShellからネイティブコマンドを実行するに注意する一つのポイントかと思います。