• 締切済み

バッチファイル内置換

バッチファイルで、置換をしたいのですが、"="と"<"の置換が出来ません。 ping出力を「file.txt」へ保存し、保存した「file.txt」を一行づつ読み出し下記を実行しています。 for /f "delims=" %%a in ( orig ) do ( set line=%%a call :sub ) :sub set tmp=%line% set tmp=%tmp:<=,% set tmp=%tmp:= =,,% set tmp=%tmp:"時間" =,% set tmp=%tmp:ms=,ms% echo %tmp%>>%CSV_Name% goto :EOF :end 置換出来ないのは、"=" と "<"の文字だけが置換出来ません。 ネットで調べたのですが、"^" でエスケープしても、""二重引用部でくくっても、正しく置換でき有ません。

みんなの回答

回答No.3

まだ閉じられていなかったので --------- a.bat ---------------------------- @echo off setlocal type NUL> b.csv for /f "usebackq tokens=* delims=" %%a in (`ping 192.168.XXX.XXX`) do ( call :sub "%%a" ) goto :EOF :sub set tmp=%1 set tmp=%tmp:<=,% set tmp=%tmp:\= =,,% set tmp=%tmp:時間 =,% set tmp=%tmp:ms=,ms% echo %1 echo %tmp% echo\ echo %tmp:~1,-1%>> b.csv goto :EOF endlocal ------------------------------- こんな感じだろうか? 前後にどのように使っていて、どのように使用するのか明確でないので、とりあえず、単独で動作するようにした。 setlocal /? for /? set /? call /? をそれぞれ実行し、使用方法を熟知すること。とくに  setlocal は重要。またエスケープが必要な文字は、DOSの仕様がくそなので、思わぬ動作になります。変数にセットして扱う場合と、for コマンドなどを使用して扱う場合と、多少違う。つまり、コマンドマター的な所が多い。なので ”<” はファイルからfor を読み込んだ場合、そのまま、変数で扱えるが set a=a< なんてするとエラーになって扱えない。だが、 set a="a<" などと値にダブルクォートすると、エスケープしてくれる。これは ”|” などともまた、対応が変わってくる。 set コマンドでのエスケープ文字は"\" 半角の円マーク(\ -> バックスラッシュとも言う) これは、findstr と同じ。コマンドの仕様をそれぞれ把握してゆくと、いろんな整合性が取れていないことが見つかってくる。 まあ、DOSだけでなく、フレームワークを組み込むようなC++、Java でも似たような経験をする方は多いが。 WSHでも似たような事はたくさんある。仕方ないんかもしれない。 なお、set "a=a<" というやり方もあるが、扱いによっては思わぬ落とし穴があり、変数の値をエスケープし扱えるようにはなっていない。なので、その後もダブルクォートで式を記述する必要がでてくる。実行したカレントフォルダーのファイルリストを見ると意味がわかるはず。 値をクォーとする方が、動作が予測できます(しやすい)。 前回提示したスクリプトでダブルクォーとしなくても”<”はエラーになっていない。今回は引数に1行全部を渡すので、forで取得した値をダブルクォーとしている。 そう前回のはなぜかあなたが記載したスクリプトに line と言う変数を設定しているにもかかわらず、 tmp と言う変数に格納している。それは必要ない。 line をそのまま使えばいい。今回のように、引数に渡したとき %1 で受け取る必要があり、それは %var:a=b% の置き換えができなため再度宣言する必要がある。

  • notnot
  • ベストアンサー率47% (4846/10257)
回答No.2

= の置換は無理です。 < は、 set "tmp=%line%" set "tmp=%tmp:<=,%" のように " で囲めば出来ます。 あと、forループの後に、goto :EOF を入れないと処理がおかしい。

回答No.1

少し改造しています -------------------- @echo off setlocal for /f "delims=" %%a in ( a.txt ) do ( set line=%%a call :sub ) goto :EOF :sub echo 1 line=%line% set tmp=%line% echo 2 set tmp=%tmp:<=,% echo 3 set tmp=%tmp:= =,,% echo 4 set tmp=%tmp:"時間" =,% echo 5 set tmp=%tmp:ms=,ms% echo 6 echo %tmp%>>b.txt echo 7 goto :EOF :end endlocal ------------------ なにがいいたいか分かるかと。

関連するQ&A

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

  • こちらのバッチファイルの改修をお願いしたいです。

    過去に別のIDで質問したのですがパス紛失してしまったので・・・ http://okwave.jp/qa/q6858298.html?&status=true&errcode=&msg=&qid=6858298 改修の内容としては下記2点になります。 【○○】 [△△] □□.txt (1)○○や△△の部分にドット等の記号があるとそのファイルはスルーしてしまうので、スルーせずに動くように。 (2)もし、同じファイル名があったら上書きせずに「C:\被り」のフォルダに振り分ける。 どなたかお手すきでしたらよろしくお願い致します。 ----------- echo off set from=C:\振り分け set to=C:\整理済 for /f "delims=" %%a in ( 'dir /b "%from%\*.txt"' ) do call :sub "%%a" echo 振り分け終了しました exit /b :sub for /f "tokens=1 delims=]" %%f in ( "%~n1" ) do set findname=%%f] :FolderA if exist "%to%\A\%findname%*" move "%from%\%~nx1" "%to%\A\"&&goto :EOF :FolderB if exist "%to%\B\%findname%*" move "%from%\%~nx1" "%to%\B\"&&goto :EOF :FolderC if exist "%to%\C\%findname%*" move "%from%\%~nx1" "%to%\C\" goto :EOF

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

    以下は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

  • 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 ------------------------------------------ 皆さんのご意見、ご指導をお待ちしてます。

  • バッチファイルの使い方について

    このサイトで、両面スキャンした画像ファイルを表面と裏面を別々のフォルダに振り分ける方法を質問して、バッチファイルを使う方法を教えてもらったのですが、上手くいきません。バッチファイルを使うのは初めてなので、どこかまずいところがあるのかと思います。 教えていただいた下記のものそのままでバッチファイルを作り、画像ファイル(jpg)を格納したフォルダに置いてダブルクリックすると、「1」「2」のフォルダができるだけで、画像ファイルは移動せず、2つのフォルダは空のままです。 どこを直せばよいのか教えてください。よろしくお願いします。 set N=1 mkdir 1 mkdir 2 for %%I in (*.jpg) do call :sub %%I goto :EOF :sub move %%I %N% set /a N=3-N goto :EOF

  • windows bat 置換

    master.csvの内容 11111,eeeeee,55555 for /f "delims=" %%A in (master.csv) do call :sub1 "%%A" del master.csv ren master6.csv master.csv goto :eof :sub1 set "LINE=%~1" echo %LINE:,=2C%>>master6.csv 以上のようにカンマを2Cに変換し、改行コード(CR)(LF)を0D0Aに変換したいのですが、 どうしたらよいでしょうか? また、同時に実行することは可能でしょうか?

  • バッチファイルで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

  • バッチファイル パス名に( )や!がある場合の対処

    2つのフォルダの配下にあるすべてのファイルが一致していることを確認する 下記のtest.batのプログラムでは、フォルダ名やファイル名の中に、 ()や!が含まれていない時は正しく動作しますが、 含まれていると正しく動作しません。 (問1) パスに( )が含まれている場合 (例)set x=C:\tmp\sample\DATA(1)_SP\   set y=C:\tmp\sample\DATA(2)_SP\ は、 echo !j:%x%=!>> list1.txt の所で 「_SP\ の使い方が誤っています。」 と表示されて正しく動作しませんが どのようにすればよいでしょうか。 (問2) echo !j:%x%=!>> list1.txt を echo !j:!x!=!>> list1.txt にすると、環境変数xの部分が空白に置き換わらないのですが なぜでしょうか。 (問3) パスに!が含まれている場合 (例)DATA1とDATA2の配下に!ABCというフォルダがある場合   C:\tmp\sample\DATA1\!ABC\… は、 for /F "delims=" %%i in (list01.txt) の取り出しの時に!が抜け落ちてしまい 以後の処理が正しく行えません。 !が抜け落ちないようにするには どのようにすればよいでしょうか。 よろしくお願いします。 ---test.bat---------------------------------------------- setlocal enabledelayedexpansion @echo off set x=C:\tmp\sample\DATA1\ set y=C:\tmp\sample\DATA2\ if exist list1.txt del list1.txt if exist list2.txt del list2.txt dir /b /s /a-d %x% > list01.txt dir /b /s /a-d %y% > list02.txt for /F "delims=" %%i in (list01.txt) do ( set j=%%i echo !j:%x%=!>> list1.txt ) for /F "delims=" %%i in (list02.txt) do ( set j=%%i echo !j:%y%=!>> list2.txt ) fc /n /w list1.txt list2.txt > result.txt if ERRORLEVEL 1 ( set /p z="両者は一致しませんでした。" goto :EOF ) else ( if exist result.txt del result.txt ) set cnt=1 set err_cnt=0 for /F "delims=" %%i in (list1.txt) do ( set /p<NUL=[!cnt!] fc /n /w "%x%%%i" "%y%%%i" >> nul if ERRORLEVEL 1 ( echo [!cnt!] %x%%%i >> result.txt fc /n /w "%x%%%i" "%y%%%i" 2>&1 >> result.txt set /a err_cnt=!err_cnt!+1 ) set /a cnt=!cnt!+1 ) echo; if %err_cnt%==0 ( set /p z="両者は完全に一致しました。" ) else ( set /p z="%err_cnt% 個が一致しませんでした。" ) ------------------------------------------------- 【動作環境】Windows7 コマンドプロンプト(Ver.6.1.7601)  

  • DOSバッチでフォルダ配下の全ファイルの一致確認

    Windowsのコマンドプロンプトのバッチファイルで 2つのフォルダの配下にあるファイルがすべて完全に 一致することを確認するバッチファイルを作成しています。 下記のようなコードまではできたのですが、 現状ではコードの「pause」の所で、 一度、止めて、人が、 list1.txtのファイルから環境変数xの文字列 (ここではC:\document\A\) list2.txtのファイルから環境変数yの文字列 (ここではC:\document\B\) を削除して保存し直してから続行しないと うまくいきません。 回避策として、pauseの所で、 list1.txtのファイルを1行ずつ読み込んで 環境変数xの文字列を空白文字に置換して 上書き保存する。 list2.txtのファイルを1行ずつ読み込んで 環境変数yの文字列を空白文字に置換して 上書き保存する。 ということをしたいのですが、 (方法1) set 環境変数=%環境変数:置換前文字列=置換後文字列% の置換前文字列を環境変数%x%で指定することが できないようなのでうまくいきません。 (方法2) 環境変数xの文字列の文字数を環境変数lenに入れて set 環境変数=%環境変数:~開始文字位置,文字数% の開始文字位置を環境変数%len%で指定することが できないようなのでうまくいきません。 何かよい方法はないでしょうか。 ---test.bat--------------------------------- @setlocal enabledelayedexpansion @echo off rem 以下の2行を実行前に書き換える set x=C:\document\A\ set y=C:\document\B\ set w=FC: 相違点は検出されませんでした set w=%w:~0,18% set v=***** set v=%v:~0,5% if exist list1.txt del list1.txt if exist list2.txt del list2.txt if exist huichi1.txt del huichi1.txt if exist huichi2.txt del huichi2.txt dir /b /s /a-d %x% > list1.txt dir /b /s /a-d %y% > list2.txt pause fc /n /w list1.txt list2.txt > huichi1.txt for /F "delims=" %%i in (huichi1.txt) do ( set j=%%i set j=!j:~0,18! if !j!==!w! goto OK1 ) set /p z="両者は一致しませんでした。huichi1.txtを確認してください。" goto END :OK1 for /F "delims=" %%i in (list1.txt) do ( fc /n /w "%x%%%i" "%y%%%i" >> huichi2.txt ) set u=0 for /F "delims=" %%i in (huichi2.txt) do ( set j=%%i set j=!j:~0,5! if !j!==!v! set u=1 ) if %u%==0 ( set /p z="両者は完全に一致しました。" ) else ( set /p z="両者は一致しませんでした。huichi2.txtを確認してください。" ) :END ------------------------------------ 【条件】  ・Wondows7のコマンドプロンプトで実行する。  ・他のツール(perlなど)は使用しない。  ・test.batは   set x=C:\document\A\   set y=C:\document\B\   の部分のみをその都度書き換えて使用する。 よろしくお願いします。

  • バッチファイルで条件によって書き出さないようにしたい

    temp.txtというファイルのカンマ4つめが同じだったらテキストに出力しないバッチファイルを作りたいと思っています。 set sbuf=test for /f "tokens=4 delims=, " %%a in (C:temp.txt) do ( set saddress=%%a if %sbuf% == %%a ( ) else ( set saddress=%%a findstr %saddress% C:\sip_cmail\ping_sip.txt >> C:\out.txt ) set sbuf=%%a ) と書いてみたのですが、動きません。 流れとしては、一巡目に通ったときの値をbufにいれておいて、二順目通ったときに比べ、同じだったら何もしないで次に行く、としたいのですが、、 括弧が何十にもなると出来ないのでしょうか。 よろしくお願い致します。

専門家に質問してみよう