DOSバッチで外部ファイルの指定行を読み取る方法

このQ&Aのポイント
  • DOSバッチを使用して、外部ファイルの指定行の内容を読み取る方法について教えてください。
  • ファイル内の最初の行を読み取る方法と最後の行を読み取る方法を知りたいです。
  • DOSのHelpを調べても、パラメータの使い方がよくわからないため、ファイルの指定行を読み取る方法を教えてください。
回答を見る
  • ベストアンサー

DOSバッチにて外のファイルの指定行を読む

今回、皆様の助けを頂き、DOSバッチを作成して仕事をやることができました。 感謝します。しかしながら、入出力に関して、もう少し理解したいと思います。 特に、外のファイルの指定行の内容を読み出すことはできないでしょうか? 外のファイルの最初の行を読み出す @echo off set /p abc=< c:\mylog.log echo %abc% 外のファイルの最後の行を読み出す @echo off FOR /F "delims= " %%a IN (c:\mylog.log) DO (set abc=%%a) echo %abc% ----------- DOSのHelpを調べてみましたが、 For のパラメータについて、よく理解できていません。 パラメータをうまく使えば、ファイルの指定行を読み出せる気がするのですが、 調べ切れていません。 宜しくお願いします。

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

  • ベストアンサー
  • M_Sato
  • ベストアンサー率54% (550/1003)
回答No.1

こんにちは。前回も回答したM_Satoです。 前回と同じような内容になりますが…… 内部コマンドだけで処理せず、外部コマンドとしてsed.exeを導入すれば、テキスト・ファイルの処理に自由度が出てきます。 ●使用例 1)1行目を読み出す場合 c:\sed -ne "1p" c:\mylog.log > oneline.txt 2)5行目を読み出す場合 c:\sed -ne "5p" c:\mylog.log > oneline.txt 3)最後の行を読み出す場合 c:\sed -ne "$p" c:\mylog.log > oneline.txt ●sed のオプションの説明 -n ……標準出力を抑制する(sedは入力ファイルを1行ずつ読んで(編集後に)標準出力に吐き出します。このオプションをつけると、出力コマンドがある場合に限り出力します) -e ……うしろに記述されているコマンドを実行する。 -f ……うしろに記述されているファイルの内容をスクリプトとして実行する。 ●コマンドの説明 1p……1行目を出力する 5p……5行目を出力 $p……最後の行を出力する 行数はバッチファイルの引数%1で与えてもかまいません。 ●出力方法 いずれもoneline.txtに1行だけ出力しますから、あとは type oneline.txt として画面に出力してもいいし、 下記のようにいったん変数に取り込んでから出力してもいいでしょう。 set /p abc=<oneline.txt echo %abc% ●導入 sed.exeはストリームエディタというDOSのソフトで、下記からダウンロードして解凍したあと、sed.exeだけをc:\に置いてください。特にインストール作業は必要ありません。 http://www.vector.co.jp/soft/dos/util/se000880.html (sed.exeはさまざまな開発者によって発表されており、いろいろな版がありますが、上記のものが使いやすいと思います) なお、入力ファイル名は旧DOSの規則に従って半角換算で8文字以内+拡張子3文字以内にしてください。

atom_28
質問者

補足

sed.exeの詳細な説明、ありがとうございます。 外部コマンドとして、こういうものがあることを、初めて知りました。感謝します。 しかしながら、DOSコマンドのFORは、まだ、使えると言う気がします。 小生が、理解できていないだけのことのように感じています。 目的を達成することよりは、むしろ、FORを使いこなせるようになりたい、と言うのが正直なところです。 宜しくお願いします。

関連するQ&A

  • DOSバッチにて外のファイルをリードする方法

    DOS batchにて、外のファイルの中身をリードしたい。 どこかのサイトにて、下記を知りました。 FOR /F "delims=" %%a IN (c:\\GTM2\myfile.txt) DO (set abc=%%a) call echo step=%abc% しかし、この方法は、ファイルの最後の行を掴んでくるもののようです。 今、小生の欲しい事柄は、ファイルの最初の行の情報を掴むことです。 宜しくお願い申し上げます。

  • 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文を使う使わないにはこだわりません。

  • 【DOSコマンド】for の デリミタにダブルクォーテーションを使うには

    下記のような1行だけ書かれたテキストファイルがあり、その中からダブルクォーテーションで囲まれた部分を抜き出そうとしています。 --【abc.txt】----------------------------------------------------------- Command Line: "C:\Program Files\test\test.exe" ---ここまで------------------------------------------------------------- (C:\Program Files\test\test.exe を抜き出したい) DOSコマンドのfor文を使って抜き出そうとしたのですがダブルクォーテーションをどうやってデリミタに指定したらいいのかわかりません。   for /f 'delims=" tokens=2' %i in (test.txt) do @echo %i  とか   for /f "delims="" tokens=2" %i in (test.txt) do @echo %i など いろいろやってみたのですがエラーが出ました。 試しにテキストファイルのダブルクォーテーションを”+”に置き換えて試したところうまく出来たので、デリミタの指定の仕方だけだと思うのですが、どうしてもわかりません。 Command Line: +C:\Program Files\test\test.exe+   に対して for /f "delims=+ tokens=2" %i in (test.txt) do @echo %i はうまく出来ました。 どなたかご享受願えませんでしょうか。 よろしくお願いします。

  • DOSバッチでUNIXテキストファイルの文字列置換

    お世話になります。 早速ですが、 「DOSバッチでテキストファイルの文字列置換を行うプログラム」がいろいろ紹介されていたので、 皆さんのプログラムを流用させていただき、勝手に継ぎ足したDOSバッチプログラムを以下の ように作りました。 このDOSバッチで置換されたテキストファイルに2つの問題が発生して困っています。 問題 1)UNIXテキストファイルの改行コードがLFからCR+LFに変ってしまう。     文字列置換した後にファイルサイズが大きくなっていたので発見しました。      問題 2)空白行がなくなる。     DOSプログラムでは、対応不可でしょうか?     やはり、sed,awk,WHS,power shell を使わないと解決しませんか? -(DOSプログラム f0.bat)------------------------------------------------------ ::** @echo off setlocal ENABLEDELAYEDEXPANSION set fname=%1 copy /b %fname% org >nul type nul >%fname% for /f "delims=" %%a in (org) do (set line=%%a&&set l=!line:abc=xxx!&&echo !l!>>%fname%) del org goto end :end exit /b 0 -(実行時の標準出力結果 list)----------------------------------------------- C:\>setlocal ENABLEDELAYEDEXPANSION C:\>set fname=t22.txt C:\>copy /b t22.txt org 1>nul C:\>type nul 1>t22.txt C:\>for /F "delims=" %a in (org) do (set line=%a && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=J0000000 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=HHH && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=519 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=2011-08-28 12:16:44.98302 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=2011-08-28 12:16:44.016114 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=0 && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>(set line=abc && set l=!line:abc=xxx! && echo !l! 1>>t22.txt ) C:\>del org C:\>goto end C:\>exit /b 0 --(置換前 t22.org LF改行コード)-------------- J0000000 HHH 519 2011-08-28 12:16:44.98302 2011-08-28 12:16:44.016114 0 abc --(置換後 t22.txt CR+LF改行コード)----------- J0000000 HHH 519 2011-08-28 12:16:44.98302 2011-08-28 12:16:44.016114 0 xxxx ------------------------------------------ 皆さんのご意見、ご指導をお待ちしてます。

  • コマンドプロンプトでファイル読み込み

    For文を使って、パラメータファイルから値を読み込みたいのですが、 "C:\Documents and Settings\~"等(パスにスペースが含まれる場合)に置かれた場合、 ファイルを読み込んでくれず困っております。 ()内のファイル指定で、""(ダブルクォーテーション) や'(シングルクォーテーション)で囲むこともしてみましたが、ダメでした。。 どう指定すればよいのかご教授下さい。 よろしくお願いいたします。 【パラメータファイル(tmp.txt)】 ABC=12345 【バッチファイル(test.bat)】 for /F "delims== tokens=1,2" %%A in (D:\tmp.txt) do if %%A==ABC set value_1=%%B echo %value_1% pause

  • DOSプロンプト:for文のdelims指定でブランクを除外できますか?

    DOSプロンプトのfor文のdelims指定でブランクがデフォルトで指定されていると思いますが、ブランクを除外する方法はありますか? 具体的には、以下のテキスト内容の3行をブランクも含めて正確に取得したいです。 テキスト内容: abc def a b c ab cd ef gh

  • バッチファイルでの%を含むファイル名の取得

    以下はEドライブを走査してフォルダごとのjpgやpngなどのファイルの数を全て表示するバッチ処理ですが。基本的に上手く動きますが%を含むファイル名、フォルダ名に当たると上手く動きません。どうしたらいいでしょうか?”ファイル名、フォルダ名に%を使うな”という回答以外でお願いします。 @echo off pushd E:\ for /f "delims=" %%j in ('dir /b /s /a:d') do call :sub "%%j" exit /b :sub echo /////////////////////////////////////////////////////////////////////////// for /f "delims=" %%x in ('dir /b %1 ^| find /c ".jpg"') do call :jpg %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".JPG"') do call :jpg2 %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".png"') do call :png %%x for /f "delims=" %%x in ('dir /b %1 ^| find /c ".bmp"') do call :bmp %%x echo %1 echo jpg %jpg_c% echo png %png_c% echo bmp %bmp_c% echo JPG %jpg2_c% goto :EOF :jpg set jpg_c=%1 :echo %1 goto:EOF :jpg2 set jpg2_c=%1 :echo %1 goto:EOF :png set png_c=%1 :echo %1 goto:EOF :bmp set bmp_c=%1 :echo %1 goto:EOF :all set all_c=%1 :echo %1 goto:EOF

  • バッチファイルの見方について教えて下さい。

    バッチファイルを選択⇒右クリック⇒編集とすると テキストが表示されるのですが、 どういう事を書いてるのかよくわかりません。 解る方、教えて下さい。宜しくお願いします。 【pingnum.batの時】 ping 198.105.232.1 ping 198.105.232.6 @echo off echo ... echo Click the Help window to continue with the Internet troubleshooter. 実行するとdos画面でPingが実行されるのですが @echo offから下の部分はどういった意味でしょうか? echo Click the Help window to continue with the Internet は単なるメッセージ?かと思うのですが・・・。 また、下記についてもお願いします。 copyコマンドで指定したファイルを他のドライブに パスをきる時は、\\を付け加える?? A>TYPE BACK.BAT ECHO OFF CLS ECHO バックアップ ECHO ON XCOPY C:\WINDOWS\デスクトップ\コピー元\data\* C:\WINDOWS\デスクトップ\コピー先\data /E/C/H/R/Y ECHO OFF ECHO 完了しました

  • バッチファイルでファイルからパラメータを指定したいのですが。。。

    CALL abc.bat [ ] で [ ] の部分にパラメータをファイルから指定することは出来るでしょうか? 単にそのファイルのパスを記述してもダメでした。

  • バッチファイルにてFTPで指定したファイルを取得する

    OSはWindoswXPProです。 以下のようなBATファイルとバッチファイルを作成しました。 ---FTP.bat--- echo off ftp -s:get.ftp ---get.ftp--- open 10.0.X.X username password cd /log get log.yymmdd(実際には日付) c:\access_all_log.txt quit logというディレクトリには日次でログファイルが作成され ファイル名としてlog.yymmddと名づけられています。 やりたいことは2つあります。 1つめはftpするファイル名の日付部分をコマンドなどから 範囲指定して取得するファイルを指定できないか。 (たとえば070301~070315のファイルを一括で取得したい) 2つ目はftpでのファイル取得終了後に続いて バッチスクリプトを流したいのですが、その方法。 お分かりになる方いらっしゃいましたらよろしくお願いいたします。