2009年2月24日火曜日
EVENTQUERY

久しぶりに投稿してみる。
最後に投稿して以来、仕事ではCとJAVAを併用して、今年に入ってからはPHPをごにょごにょしてたんだけど、今度はAccessになりそう。

で、少し前に居た常駐先で使ってたバッチを、自分の会社でも使おうとしたら、動かなくて…

このテの会社って出勤、退社時間って、自己管理なことが多い。
だけど、毎日Excelにぽちぽち入れてくのって、面倒だし、忘れるんだよね。
ってことで、週末なんかにまとめて入力するんだけど…
そういうときって、PCの起動時間を確認することが多い。

[スタート]→[設定]→[コントロールパネル]→[管理ツール]→[イベントビューア]

システムからeventlogの開始と終了を確認するんだけど、ま、面倒だよね。
なので、バッチを作ってみた。

検索部分だけピックアップすると、こんなイメージ。



CSCRIPT //H:CSCRIPT //S //NOLOGO

EVENTQUERY /FI "ID eq 6005" /FI "Datetime eq %MM%/%DD%/%YYYY%,12:00:00AM-%MM%/%DD%/%YYYY%,11:59:00PM" /L SYSTEM | GREP 6005>> log.txt
EVENTQUERY /FI "ID eq 6006" /FI "Datetime eq %MM%/%DD%/%YYYY%,12:00:00AM-%MM%/%DD%/%YYYY%,11:59:00PM" /L SYSTEM | GREP 6006>> log.txt




ID6005はeventlogの起動、6006は停止のID。
勿論、%YYYY%とかは、変数で設定させるんだけど…

出力結果にはヘッダ部分があるので、log.txtにはGREPで必要な行だけ落としてる。
でもCygwinとか入れないと、GREPは使えないので…

あとはFORとかでまわして、時刻だけ抜き出したりして、整形すればOK。


でも、常駐先の環境ではこれで動いたんだけど、自社に戻ったら、動かない。
CSCRIPT //H:CSCRIPT //S //NOLOGO
してるけど、CSCRIPTで動かせ!とダイアログが表示される。

仕方なく、
CSCRIPT C:\WINDOWS\SYSTEM32\EVENTQUERY.vbs
に書き換え。

なんだろう?



0 コメント | コメントを書く | コメントの表示
2008年5月9日金曜日
SET

せっかくなので、バッチファイルについて、もう少し。
正直、今更な話だけど、案外探すのが面倒なので、とりあえず自分用にここへ。

対話形式でなにかやろうとすると、コマンドプロンプト/MS-DOSって、どーしてもSETコマンドに頼らざるを得ない。
そんなときは

@ECHO OFF
SET /P TESTMSG=ここに何か入力してください。:
ECHO %TESTMSG%

として、バッチファイルを実行すると…
C:\>test.bat
ここになにか入力してください。:

で入力待ちになるので、なにか入力してエンターを押すと、入力された文字列がTESTMSGに格納される。
ECHOでそのTESTMSGを表示しておしまし。
C:\>test.bat
ここになにか入力してください。:テストメッセージ
テストメッセージ
C:\>


この場合、事前にTESTMSGになにかセットしておいても、入力で上書きされる。ただし何も入力をしないで、エンターを押すと、なにも格納されない。
なので、
@ECHO OFF
SET /P ANSWER=よろしいですか?[Y/N]:
IF /I %ANSWER% EQU Y (
ECHO 了解いたしました。
)

とかやると、何も入力しない場合にはANSWERは空のまま。IF文でエラーになってしまう。
C:\>test.bat
よろしいですか?[Y/N]:
Yの使い方が誤っています
C:\>

対策するなら、「"」で括るか、
@ECHO OFF
SET /P ANSWER=よろしいですか?[Y/N]:
IF /I "%ANSWER%" EQU "Y" (
ECHO 了解いたしました。
)

あらかじめ、なにか値を入れておくしかないのかな?(ここではデフォルトでNを入れてみた)
@ECHO OFF
SET ANSWER=N
SET /P ANSWER=よろしいですか?[Y/N]:
IF /I %ANSWER% EQU Y (
ECHO 了解いたしました。
)


こうやってSET /Pだとその値を変更/更新することができるんだけど…

うーん…
こうして書いてみると、なにか忘れてることがある気がしてならん。

あぁ、そうそう、このSETコマンドはやはり環境変数の操作を行うものだから、バッチが終わっても有効なのだな。
なので、処理の最後で
SET 変数名=
で解放するか、処理の最初で初期化(解放と同じ)する必要があるね。

さっきの「よろしいですか?[Y/N]」のバッチだと、1回目にYと入力したあとすぐ2回目を実行し、空エンターで再度IF文に入るのだが、1回目に格納したYが未だ入ったままであるため、IF "入力" == "Y"が有効になってしまう。


…まぁ、とりあえずこんなカンジで書いていこうかと思ってる。
備忘録代わりってことでさ。



0 コメント | コメントを書く | コメントの表示
2008年4月16日水曜日
フォルダ(ディレクトリ)が空かどうか

客先によっては、自分なりの環境を整えるのが難しいところがある(最近は多い)。
なので、バッチファイルって意外と重宝する。

でもって、気になって調べてみると、今更ながら情報って少ないねぇ。
なんつーか、探しきれてないのだろうけど。

で、ここ数日悩みのタネだったのが、タイトルにあるとおり、フォルダの中身の調査。
何故必要かはおいといて、調査結果を…

基本、2ch情報だけど、こういうのがあった。

ユーザー必読!コマンドライン(DOS Pt.6)
http://pc11.2ch.net/test/read.cgi/win/1176558776/124-125

124 :名無し~3.EXE:2007/06/16(土) 19:02:59 ID:CXEmvWRn
DIR /B "C:\hoge" | FIND /V "" > NUL で ERRORLEVEL=1 なら空。
ってのは強引?

125 :名無し~3.EXE:2007/06/18(月) 01:45:27 ID:H6wUdAfo
読みやすさ優先ならfor /r と set /a ってなところだろうけどねぇ


124のは単純だね。DIRで取得した結果が空じゃなければERRORLEVELは0だから。
あとはIF文をどうするかってことだね。

ってことで、125のやつ。
これは、FORでフォルダ内部のファイルを列挙して、SET /Aで数を数えるってことかな?
@ECHO OFF
SET /A CNT=0
FOR /R パス %I IN (*) DO (
SET /A CNT=CNT+1
)

これでCNTがゼロでなければファイルはあることになるので、フォルダは空じゃないと…

しかし、SETで計算できるの知らなかったな。
もう少し、修行が必要かな?


2008/05/01 - 追記
バッチファイルなら、%を重ねないといかんなぁ。
ケアレスミスです。
で、ECHOしてみた。
@ECHO OFF
SET /A CNT=0
FOR /R パス %%I IN (*) DO (
SET /A CNT=CNT+1
)
ECHO %CNT%

こういうのを知ってると、結構使える場面が… ないか。



0 コメント | コメントを書く | コメントの表示
Template Design: © 2007 Envy Inc.