重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

a.logというテキストの値を、一行づつ取り出して、ある値より大きいかの判定を行いたいのですがうまくいきません。

イメージ的には下記のような感じです。

FOR /F "eol=; tokens=3 delims=, " %%j in (C:\PerfLogs\memory_02071801.csv) do (
set MEMORY=%%j
set MEMORY=%MEMORY:~1,6%
rem 値が20000がより大きい場合はエラーメッセージを表示する。
if %MEMORY% GTR 20000 net send %COMPUTERNAME% %ERRTXT%
)

・memory_02071801.csvの内容
"02/07/2007 18:34:36.075""150836"
"02/07/2007 18:34:51.093""151020"
"02/07/2007 18:35:06.110""151252"
"02/07/2007 18:35:21.128""151360"

上記ではうまく動いてくれません。
もしわかる方いらっしゃったら教えていただけませんでしょうか。

A 回答 (3件)

環境変数の参照%MEMORY%は、バッチの実行前に展開されてしまいます。


こういうケースでは遅延展開という方法を使います。
おまじないとして、最初に
setlocal EnableDelayedExpansion
と書いておいて、
%MEMORY% を !MEMORY! に変えればできると思います。

質問文のケースでは、

setlocal EnableDelayedExpansion
FOR /F "eol=; tokens=3 delims=, " %%j in (C:\PerfLogs\memory_02071801.csv) do (
set MEMORY=%%j
set MEMORY=!MEMORY:~1,6!
rem 値が20000がより大きい場合はエラーメッセージを表示する。
if !MEMORY! GTR 20000 net send %COMPUTERNAME% %ERRTXT%
)

とすればいけるのではないでしょうか。

参考URL:http://www.fpcu.jp/dosvcmd/bbs/log/cat3/for_in_d …
    • good
    • 0
この回答へのお礼

ham_kamoさんありがとう御座います。

上記の指摘どおりに変更したところ正常に稼動してくれました。
次回に生かしたいと思います。

話は変わってしまうのですが、
FOR文にて読み込んでいる(C:\PerfLogs\memory_02071801.csv)が
他のプロセスにて使用されているときにアクセスする事は可能でしょうか。

実はWindows既存のパフォーマンスのカウンタログで、メモリー状況を出力させて、
バッチにて一定間隔で監視させる設定を行いたいのですが難しいですかね・・・。
何かオプションで回避できるものがあればいいのですが・・。

お礼日時:2007/02/08 16:18

No.1です。


同じようにパフォーマンスログを出力させていろいろためしてみました。その結果、

cd \PerfLogs
Copy Test_02081714.csv MemoryLog.txt

で普通にコピーできました。なので、ワンクッション置いて、バッチの中でいったんコピーして、コピーしたファイルをFOR文で使用すればいいのではないでしょうか。
    • good
    • 0
この回答へのお礼

上記方法にて解決いたしました。
hidesbizarさん回答ありがとう御座いました。

お礼日時:2007/02/09 09:24

No.1です。

一部訂正。

> 環境変数の参照%MEMORY%は、バッチの実行前に展開されてしまいます。

→構文解析時に展開されてしまいます。

の誤りでした。FOR文が実行される前に()の中が解析され、そこでMEMORYの値が確定してしまう、という意味です。
    • good
    • 0

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