バッチファイルでFINDSTRを使って文字列検索する方法とエラー対処法

このQ&Aのポイント
  • バッチファイルでFINDSTRを使って文字列検索をしたいが、ファイルが開けないエラーが発生します。
  • バッチファイルの中に複数のバッチファイルを組み合わせて実行すると、FINDSTRの部分でファイルを開くことができないエラーが発生します。
  • エラーを回避してバッチファイルで文字列検索を実行する方法はありませんか?
回答を見る
  • ベストアンサー

バッチファイルでFINDSTRを使って文字列検索をしたいが、ファイルが

バッチファイルでFINDSTRを使って文字列検索をしたいが、ファイルが開けない (1)と(2)のバッチファイルを作りました。それぞれ単体で実行すると、エラーは出ません。 (1)と(2)を一緒にした(3)というバッチファイルで実行すると、FINDSTRのところで、 「ファイルを開くことができません」というエラーが出て、途中でとまってしまいます。 エラーを出さずに実行する方法は何かないでしょうか? (A.batは、CドライブにあるWord.exeを実行するだけのバッチファイルです。) どうぞよろしくお願いします。 【(3)の中身】 call A.bat >kekka.txt   ←この1行だけが(1)のバッチファイルの中身です GOTO kensaku GOTO :EOF ::文字列検索 :kensaku SET keyword=作成しました。   ←この行から下が(2)のバッチファイルの中身です FINDSTR %keyword% kensaku.txt > NUL GOTO kekka%ERRORLEVEL% GOTO :EOF :kekka0 REM 文字列あり ECHO %keyword%がありました PAUSE > nul GOTO :EOF :kekka1 REM 文字列なし ECHO %keyword%はありませんでした。 PAUSE > nul GOTO :EOF

質問者が選んだベストアンサー

  • ベストアンサー
  • crossgate
  • ベストアンサー率65% (78/119)
回答No.4

A.batとWord.exeの仕様が良く分からないので何とも言えないですが、 そのどちらかでカレントフォルダが変わっていると今回のことが起きます。 (3)のバッチの  call C:\1a\1b\1c\A.bat >kekka.txt を実行したタイミングだとカレントフォルダは「C:\バッチファイル」なので kekka.txtは「C:\バッチファイル」の下に出力されますが、A.batなどで フォルダ移動しているとcall以降の処理は移動先のフォルダをカレントフォルダ として実行されます。(当然kekka.txtが無いので開けない) 試しに、(3)のバッチを以下のどちらでも良いので変更して、動くか確認してみてください。 ・FINDSTRの行を「FINDSTR %keyword% %~dp0kekka.txt > NUL」に変更 ・callの次の行に「cd %~dp0」を追加

dougasaisei
質問者

お礼

教えていただいた2つをどちらも試しましたが、どちらでもkekka.txtを開くことができました!! 質問の書き間違えに始まって、要領の得ない質問に何回も何回も丁寧に答えていただき、大変感謝しています。 今、うまく実行できて、天にも昇るうれしさです。すっごいニヤニヤしてます。 本当に、本当にありがとうございましたっ。

その他の回答 (3)

  • crossgate
  • ベストアンサー率65% (78/119)
回答No.3

>1番目の質問は答えることができなくて、すみません。ほかに何か理由が思い当たることが >ありましたら、何でもいいので、ぜひ教えてください。よろしくお願いします。 findstrの前に変な処理(cdとか、その他もろもろ)をしてるぐらいしか思いつかないですね。 質問のバッチに誤植があったということはどうやら(3)のシェル「そのもの」を貼り付けている訳ではなさそうなので、「そのもの」のシェルを見てみないと何とも言えないです。 解決の糸口にはならないかもしれないですが、あと気になるのは ・DOSプロンプト上でバッチファイルを実行したのか?それともバッチファイルをそのまま(ダブルクリックor選択してEnterなどで)実行したのか? ・(3)のバッチとA.batとkekka.txtは同じフォルダにあるのか? ぐらいです。

dougasaisei
質問者

補足

またまた回答、ありがとうございます。 ・DOSプロンプト上でバッチファイルを実行したのか?それともバッチファイルをそのまま(ダブルクリックor選択してEnterなどで)実行したのか? → バッチファイルをダブルクリックして実行してます。 ・(3)のバッチとA.batとkekka.txtは同じフォルダにあるのか? → 同じフォルダにはありません。 もう一回、バッチファイルの内容を載せますので、よろしくお願いします。 「C:\バッチファイル\」の中にあるもの  ・(3)のバッチファイル  ・kekka.txt 「C:\1a\1b\1c\」の中にあるもの  ・A.bat  ・Word.exe ※A.batは、C:\1a\1b\1c\Word.exeを実行するだけのバッチファイルです 【(3)のバッチファイルの中身】 call C:\1a\1b\1c\A.bat >kekka.txt GOTO kensaku GOTO :EOF ::文字列検索 :kensaku SET keyword=作成しました。 FINDSTR %keyword% kekka.txt > NUL GOTO kekka%ERRORLEVEL% GOTO :EOF :kekka0 REM 文字列あり ECHO %keyword%がありました PAUSE > nul GOTO :EOF :kekka1 REM 文字列なし ECHO %keyword%はありませんでした。 PAUSE > nul GOTO :EOF

  • crossgate
  • ベストアンサー率65% (78/119)
回答No.2

とりあえずバッチ動かしてみました。 「ファイルなし」にはなりませんでしたよ。 ■気になる点 ・A.batで実際にやっている処理は何か?(Word.exeってもしかしてOfficeのWINWORD.EXEのこと?) ・リダイレクトでkekka.txtに落とし込んでるけど、これって「作成しました。」が書き込める?  (こちらで作ったバッチでは無理。当然ですが。。。) ということで、バッチ(A.batも含めて)をそのまま書いてもらわないとホントのことは分かりません。 ■バッチ notepad.exe >kekka.txt ← A.batで実際にやっている処理が分からないからメモ帳で代用 GOTO kensaku GOTO :EOF ::文字列検索 :kensaku SET keyword=作成しました。 FINDSTR %keyword% kekka.txt > NUL GOTO kekka%ERRORLEVEL% GOTO :EOF :kekka0 REM 文字列あり ECHO %keyword%がありました PAUSE > nul GOTO :EOF :kekka1 REM 文字列なし ECHO %keyword%はありませんでした。 PAUSE > nul GOTO :EOF ■実行結果 D:\tmp>.\test.bat D:\tmp>call notepad.exe 1>kekka.txt D:\tmp>GOTO kensaku D:\tmp>SET keyword=作成しました。 D:\tmp>FINDSTR 作成しました。 kekka.txt 1>NUL D:\tmp>GOTO kekka1 D:\tmp>REM 文字列なし D:\tmp>ECHO 作成しました。はありませんでした。 作成しました。はありませんでした。 D:\tmp>PAUSE 1>nul バッチ ジョブを終了しますか (Y/N)? y D:\tmp>

dougasaisei
質問者

補足

早速の回答ありがとうございます。 質問にお答えします。 ・A.batで実際にやっている処理は何か?(Word.exeってもしかしてOfficeのWINWORD.EXEのこと?) → OfficeのWINWORD.EXEではありません。Word.exeという名前なのですが、作ったのは自分ではなく、業者なので、実際には中身がどうなってるかはわかりません。 ・リダイレクトでkekka.txtに落とし込んでるけど、これって「作成しました。」が書き込める? → 書き込めています。   Word.exeを実行した結果をkekka.txtに出力していますが、実行した後、kekka.txtを  開いて見てみると、「作成しました。」と書かれているときと、「作成してません。」と書かれて  いるときの2通りの結果があります。 1番目の質問は答えることができなくて、すみません。ほかに何か理由が思い当たることが ありましたら、何でもいいので、ぜひ教えてください。よろしくお願いします。

  • crossgate
  • ベストアンサー率65% (78/119)
回答No.1

貼り付けてある(3)のバッチをそのまま信じると、単に kensaku.txt が無いだけでは?

dougasaisei
質問者

補足

すみません。書き間違えました。 「kekka.txt」と書くべきところを「「kensaku.txt」と書いてしまいました。 実際のバッチファイルは、ちゃんと「kekka.txt」となっていましたので、引き続き、回答をよろしくお願いします。

関連するQ&A

  • コマンド 文字列検索 正規表現について

    すみませんどなたか教えて下さい。 ある処理が失敗するとエラーのlogファイルを出力します。 エラーがないと0バイトのファイルが作成されます。 そのファイルが0バイトの場合、次の処理を実行させるbatファイルを作成中です。 ファイルサイズの取得ができればいいのですが、コマンドで見つけ切れませんでした。 そこで、logファイルをfindftr /cで1文字でもあれば、、、で判断するようにしました。 正規表現を使って試しましたが、文字があってもヒットしません。 どなたかアドバイスをお願いします。 findstr /c:".*" d:\a.txt >nul 2>&1 if errorlevel 1 ( remエラーlogファイルに文字列なし ) else ( rem エラーlogファイルに文字列あり )

  • バッチファイルの文字判定について

    バッチファイルの文字判定について 以下のような処理をさせたいのですがうまくいきません。 変数Aの中に格納されている文字列の内、 ":"記号が1つでもあった場合→処理実行 ":"記号が1つもなかった場合→goto :eof ディレクトリのパスが納まっているかの確認で、":"を探すようにしました。 あまり良い方法でもないので、ディレクトリのパスが変数に入っているかの確認も、 併せてご教授くだされば幸いです。

  • バッチファイルでファイル名に文字列を挿入したい。

    フォルダにあるファイル全てに対して、ファイル名の先頭に文字列を挿入するバッチファイルを作っています。 対象のファイルは、主にエクセル、ワード、パワーポイント、PDFですが、ファイルの種類に関係なく、全てのファイルに対して、ファイル名の先頭に文字列を挿入したいです。 @echo off for %%i in (*) do ren "%%i" "【文字列】%%i" pause として文字列の挿入自体はできました。 しかし、このファイルを2回実行すると、ファイル名の先頭に【文字列】【文字列】と重複して挿入されてしまうので、すでに挿入済みのファイルに対しては実行しないようにしたいのですが、うまくいきません。 また、サブフォルダ内にあるファイルに対しても同様の処理を適用したいです。 どのように記述すればよいでしょうか。 リネームソフトを使えればよいのですが、フリーソフト等はインストールできない環境ですので、できればバッチファイルを記述して対応したいのです。 OSはウインドウズ7です。

  • 【バッチファイル】for繰り返しがうまくいかない

    バッチファイルの置いてあるフォルダ内(ついでにサブフォルダ内も)の 特定の拡張子(今回は.txt)ファイル全てを対象に (1)ある行ある列n文字目から2文字を読み込む×2 (2)読み込んだ文字をそのファイル名の先頭に追加 というバッチファイルを作りたいです。 具体例 テキストの中身↓ a.txt ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... ○○○○ ○○xx ○○yy ○○○○ .... ○○○○ ○○○○ ○○○○ ○○○○ .... →ファイル名を「xxyya.txt」にしたい そこで素人ながら下記のようなバッチファイルを作成してみましたが、 フォルダ内にある1つ目のファイルに対してはうまく動くのですが 2つ目以降はリネーム出来ません。 フォルダ内すべての.txtファイルに実行するための 対処法がお分かりになれば、ご教授いただけると幸いです。 「rename.bat」 cd /d %~dp0 rem .txtファイルを列挙 for /f "usebackq tokens=*" %%i in (`dir /s /b *.txt`) do ( set name=%%~xni rem 特定の行列の文字列を抜き出して変数へ格納 for /f "skip=5 tokens=2,3" %%a in (%%i) do ( set front=%%a set back=%%b rem 7行目以降は不要なのでforから離脱 goto break ) :break rem 抜き出した文字列からさらに必要な文字を抜き出して変数へ set hed="%front:~2,2%%back:~2,2%" rem 元のファイル名へ追記 ren %name% %hed%%name% )

  • 検索文字列以外のファイル

    テキストファイルの中身を検索して、その文字列以外のファイル名を取りたいのです。具体的には、 【A.txtの中身】 123 abc 【B.txtの中身】 111 abc 【C.txtの中身】 222 abc このようなテキストファイルの中身を検索して、文字列「123 abc」以外が書かれているファイル名(つまり、B.txt、C.txt)を取得したいのですが、findstrやForなどを駆使すれば、できますでしょうか?

  • バッチえファイルを編集するには??

    こんばんは。 初めて掲載します。 バッチファイルで、複数のあるファイルの中身の特定の文字列を一括編集したと思っているのですが、どのようにコマンドを組めばいいのでしょうか? コマンド、バッチは初めてなのでどのように組めばいいのか是非ともご教授願います。 例として、バッチを実行すると、 C:\temp\の下にtest1.xmlとtest2.xmlがあります。 バッチファイルを実行すると、その2つのファイルの中身のある特定の文字を編集("AAA"という文字列を"BBB"に)して保存する。 というような処理を行いたいです。

  • バッチファイルのIF分岐にて任意の文字を入力しておきたい

    バッチファイルのIF分岐にて任意の文字を入力しておきたいです。 下記のようなバッチファイルを作成し、「1」を入力すると「:AAA」のラベル に飛びメッセージが表示されるようにしています。 最初から「1」が自動で入力されているような状況にすることはできますでしょうか? 「set NUM=1」にしておけば、Enterを押すだけで「1」が入力されている のはわかったのですが、DOS上に「1」が表示されていません。 入力待ちの際に「1」が入力されている状況を作りたいと思っています。 Windows XP 32bitで動作させたいです。 お手数ですが知識をお借りしたいと思います。 もしくは「ここを見ろ」というのをご教授ください。 -------------------------------------------------- @echo off :LOOP set NUM= cls echo. echo "1. AAA" echo "2. BBB" echo "0. 終了" echo. echo. set /p NUM="番号を入力してください >" if %NUM% == 1 goto :AAA if %NUM% == 2 goto :BBB if %NUM% == 0 goto :owari echo 番号がありません echo. pause goto :LOOP :AAA echo "AAAです" echo. pause goto :LOOP :BBB echo "BBBです" echo. pause goto :LOOP :owari echo 終了します echo. pause goto :eof --------------------------------------------------

  • DOSのバッチで、テキストファイル中の文字を置換したい

    いつもお世話になっております。 WindwsXPでDOSバッチを使ってテキストファイル中にある文字列1を文字列2に置換したいのです。 ネットをさまよっていて、こんな例を見つけました。 (参考にしたのはここです。http://www.fpcu.jp/dosvcmd/bbs/log/cat3/cat54/2-0391.html) ====================== @echo off if "%1"=="" goto end set fname=%1 copy %fname% org >nul type nul >%fname% for /f "tokens=1* delims=" %%a in ( org ) do (set line=%%a&& call :sub) del org goto end :sub :この1行下の acb=xyz に置換前と置換後の文字列を指定する。 set l=%line:abc=xyz% echo %l%>>%fname% goto :EOF :end ====================== これをsample.batという名前で保存し、DOSのウィンドウでsample < a.txt と打つと、a.txtファイル中の"abc"が"xyz"に置き換わります。 これに手を入れて置換前と置換後の文字列を可変にしたく思い、sub中に set mae=abc set ato=xyz の2行を加え、変数に値を設定するようにしました。 ところが、次の1行の書き変え方がわかりません。 set l=%line:abc=xyz% を set l=%line:%abc%=%xyz%% のように変えてみましたが、うまく動きません。 どなたかご教授いただけませんか。DOSだけでファイル中の文字列の置換ができればset文を使う使わないにはこだわりません。

  • バグ?仕様?(バッチ複文での文字列置換)

    末尾のバッチコードは複文(変数がvの方)では動作しませんが、 非複文(変数がwの方)では動作します。 これはバッチ処理の文字列置換機能のバグでしょうか?仕様でしょうか? 意図は、バッチの文字列変換機能の、 %変数:<置換対象文字列>=<置換後文字列>% により 「<半角スペース>a<半角スペース>b」 を 「ab」 に変換することです。 IF t==t は無くてもいいのですが、複文をよく使う場合の雰囲気を出すためにつけてあります。 rem 以下コード---------------------------------------------------------------- rem 複文 IF t==t ( Set v= a b Set v=%v: =% ) echo v=%v% rem 非複文 Set w= a b Set w=%w: =% echo w=%w% pause

  • バッチファイルで文字列削除について

    バッチファイルで文字列削除について 以下の出力結果のファイルの中身です a.txt "DisplayName"="xxxxxxxxxxxxxx" "DisplayName"="と最後の"の部分を削除したいのですが Googleで色々調べたのですが、わかりません。 勉強不足で申し訳ありませんが、教えて頂けたら幸いです。 よろしくお願いします。