- 締切済み
バッチファイル内置換
バッチファイルで、置換をしたいのですが、"="と"<"の置換が出来ません。 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 置換出来ないのは、"=" と "<"の文字だけが置換出来ません。 ネットで調べたのですが、"^" でエスケープしても、""二重引用部でくくっても、正しく置換でき有ません。
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- lupin-333333
- ベストアンサー率31% (294/933)
まだ閉じられていなかったので --------- 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% (4900/10358)
= の置換は無理です。 < は、 set "tmp=%line%" set "tmp=%tmp:<=,%" のように " で囲めば出来ます。 あと、forループの後に、goto :EOF を入れないと処理がおかしい。
- lupin-333333
- ベストアンサー率31% (294/933)
少し改造しています -------------------- @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 ------------------ なにがいいたいか分かるかと。