プロが教える店舗&オフィスのセキュリティ対策術

バッチファイルで、置換をしたいのですが、"="と"<"の置換が出来ません。

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

置換出来ないのは、"=" と "<"の文字だけが置換出来ません。
ネットで調べたのですが、"^" でエスケープしても、""二重引用部でくくっても、正しく置換でき有ません。

A 回答 (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%

の置き換えができなため再度宣言する必要がある。
    • good
    • 1

= の置換は無理です。



< は、

set "tmp=%line%"
set "tmp=%tmp:<=,%"

のように " で囲めば出来ます。

あと、forループの後に、goto :EOF を入れないと処理がおかしい。
    • good
    • 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
------------------

なにがいいたいか分かるかと。
    • good
    • 1

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています


このQ&Aを見た人がよく見るQ&A