日経NETWORK 2009.06の79ページに例として記載されています、下記バッチが期待通りに

動かないです。すみませんが ご教示願います。なお、すいませんが、今回は私の通常の
ポイントで支払わせてください。よろしくお願いします。

@echo off

set outdir=c:\test

if not exist %outdir%\\netstat-daily.txt ( echo time,received,
sent > %outdir%\\netstat-daily.txt )

netstat -e | find "Bytes" > %outdir%\\netstat-temp.txt

for /F "eol=; tokens=2,3 " %%i
in (%outdir%\\netstat-temp.txt)
do @echo %time:~0,2:%time:
~3,2%:%time:~6,2%,=%%i/1024/
1024,=%%j/1024/1024 >> %outdir
%\\netstat-daily.txt

set outdir=

rem exit

回答の条件
  • 1人2回まで
  • 登録:2009/06/05 16:50:47
  • 終了:2009/06/08 17:32:18

ベストアンサー

id:y3b5 No.1

y3b5回答回数32ベストアンサー獲得回数32009/06/05 18:11:10

ポイント300pt

まず、%time:~0,2の後ろに%がないので変な表示になっているようです。

該当の書籍を見ていないので、どういう結果になるのがいいのか示してもらえれば、もう少しお役にたてるかもしれません。

id:meichi

ありがとうございます。コメント欄に結果を記載しました。

2009/06/08 11:20:59

その他の回答(1件)

id:y3b5 No.1

y3b5回答回数32ベストアンサー獲得回数32009/06/05 18:11:10ここでベストアンサー

ポイント300pt

まず、%time:~0,2の後ろに%がないので変な表示になっているようです。

該当の書籍を見ていないので、どういう結果になるのがいいのか示してもらえれば、もう少しお役にたてるかもしれません。

id:meichi

ありがとうございます。コメント欄に結果を記載しました。

2009/06/08 11:20:59
id:utagawh No.2

utagawh回答回数114ベストアンサー獲得回数32009/06/07 07:52:05

ポイント35pt

%time:~0,2:%time:~3,2%:%time:~6,2%

~0,2の後ろに%が抜けてます

id:meichi

ありがとうございます。

結果をコメント欄に記載します。

2009/06/08 11:26:49
  • id:standard_one
    改行しちゃいけないところで改行しているのでまずはそこを直してからかと。
    その際 @echo off という行は削除して、出ているエラーメッセージ(というか画面全部)を貼り付けるといいかもです。
  • id:utagawh
    c:\testはあらかじめ作成してありますか?
    if not exist %outdir% md %outdir%
    とかしてもいいですが。
  • id:meichi
    すいません。下記構文で実行すると、下記エラーになります。

    set outdir=c:\test

    if not exist %outdir% md %outdir% \\netstat-daily.txt ( echo time,received,sent > %outdir%\\netstat-daily.txt )

    netstat -e | find "Bytes" > %outdir%\\netstat-temp.txt

    for /F "eol=; tokens=2,3 " %%i
    in (%outdir%\\netstat-temp.txt)
    do @echo %time:~0,2%:%time:
    ~3,2%:%time:~6,2%,=%%i/1024/
    1024,=%%j/1024/1024 >> %outdir
    %\\netstat-daily.txt

    set outdir=

    rem exit

    下記エラー内容
    >set outdir=c:\test
    >if not exist c:\test md c:\test \\netstat-daily.txt ( echo time,received,sent ) 1>c:\test\\netstat-daily.txt
    >netstat -e | find "Bytes" 1>c:\test\\netstat-temp.txt
    プロセスはファイルにアクセスできません。別のプロセスが使用中です。
    コマンドの構文が誤っています。
  • id:y3b5
    「別のプロセスが使用中」とありますので、まずは、c:\test\netstat-temp.txtをエディタとかで開いてないか確認してみましょう。
    次に、コマンドプロンプト上で「netstat -e」だけを入力して、エラーがないかを確認してみましょう。
    「netstat -e」の結果に下の行みたいな結果は出ていますか?
    Received Sent
    Bytes 199029266 102533172
    次にコマンドプロンプト上で、「netstat -e | find "Bytes" >c:\test\netstat-temp.txt」を入力して
    結果を確認してみてください。
  • id:meichi
    ありがとうございます。c:\test\netstat-temp.txtは下記です。
    C:\>netstat -e | find "Bytes" 1>c:\test\\netstat-temp.txt

    netstat -e を実行すると下記で正常にでます。
    C:\>netstat -e
    Interface Statistics

    Received Sent

    Bytes 29726973 11490300
    Unicast packets 123976 121206
    Non-unicast packets 25547 69
    Discards 0 0
    Errors 0 0
    Unknown protocols 6002

    netstat -e | find "Bytes" >c:\test\netstat-temp.txt
    上記を実行すると、テキストファイルには下記があります。netstat -eの実行結果がすべて残ればいいのですが、

    Bytes 29761529 11494181
  • id:y3b5
    元質問のバッチファイルの動作はだいたいこんな感じだと思います。

    ------
    rem ★出力先を設定
    set outdir=c:\test

    rem ★「netstat-daily.txt」がなければヘッダ(time,received,sent)を付けてファイルを作成
    if not exist %outdir%\\netstat-daily.txt ( echo time,received,sent > %outdir%\\netstat-daily.txt )

    rem ★netstatコマンドで送受信バイト数を得て、「netstat-temp.txt」に一時的に書く
    netstat -e | find "Bytes" > %outdir%\\netstat-temp.txt

    rem ★2列目(受信バイト)と3列目(送信バイト)を抜き出し、現在時刻を付けて「netstat-daily.txt」に追加する
    for /F "eol=; tokens=2,3 " %%i in (%outdir%\\netstat-temp.txt) do @echo %time:~0,2%:%time: ~3,2%:%time:~6,2%,=%%i/1024/1024,=%%j/1024/1024 >> %outdir%\\netstat-daily.txt
    ------

    だとすると、netstat-temp.txtは一時的なものなので1行だけでいいのかなと思います。

    > netstat -eの実行結果がすべて残ればいいのですが、
    これを行いたければ、
    -----
    netstat -e > %outdir%\\netstat-temp.txt
    -----
    と、| find "Bytes"を外してあげればいいと思いますが、その後の動作に支障が出そうです。
    あくまでも、結果をためておくのはnetstat-daily.txtなんだと思います。
  • id:meichi
    たびたびすいません。下記で実行しました。

    set outdir=c:\test

    if not exist %outdir%\\netstat-daily.txt ( echo time,received,sent > %outdir%\\netstat-daily.txt )

    netstat -e | find "Bytes" > %outdir%\\netstat-temp.txt

    for /F "eol=; tokens=2,3 " %%i in (%outdir%\\netstat-temp.txt) do @echo %time:~0,2%:%time: ~3,2%:%time:~6,2%,=%%i/1024/1024,=%%j/1024/1024 >> %outdir%\\netstat-daily.txt

    set outdir=

    rem exit

    すると、DOSプロンプトは下記になります。
    c:\>set outdir=c:\test
    c:\>if not exist c:\test\\netstat-daily.txt (echo time,received,sent 1>c:\test\\netstat-daily.txt )
    c:\>netstat -e | find "Bytes" 1>c:\test\\netstat-temp.txt

    そこでできたファイルの中身は下記です。
    netstat-daily.txtの中身は
    time,received,sent

    netstat-temp.txtの中身は
    c:\>netstat -e | find "Bytes" 1>c:\test\\netstat-temp.txt

    となります。
  • id:y3b5
    netstat-temp.txtの中身がコマンドの内容になってしまって、結果が出ないのですね。

    > netstat -e | find "Bytes" >c:\test\netstat-temp.txt
    > 上記を実行すると、テキストファイルには下記があります。netstat -eの実行結果がすべて残ればいいのですが、
    > Bytes 29761529 11494181

    これも、出なくなってしまいましたか?

    もしそうなら、単独でコマンドプロンプト上で、
    netstat -e | find "Bytes"
    を行ったら、どんな結果になるか知りたいです。
    (Bytes 29761529 11494181のような結果が画面上に出ますでしょうか?)

    その次に、
    netstat -e | find "Bytes" > c:\test\netstat-temp.txt
    を行って、
    > Bytes 29761529 11494181
    のような結果がファイルに書かれているか確認してみてください。
  • id:meichi
    たびたびすいません。

    > netstat -e | find "Bytes" >c:\test\netstat-temp.txt
    > 上記を実行すると、テキストファイルには下記があります。netstat -eの実行結果がすべて残ればいいのですが、
    > Bytes 29761529 11494181

    >これも、出なくなってしまいましたか?
    上記をもう一度試しましたが、出ます。よろしくお願いします。
  • id:y3b5
    実行結果が出ているようでよかったです。

    では、最初から「★2列目(受信バイト)と3列目(送信バイト)を抜き出し、現在時刻を付けて「netstat-daily.txt」に追加する」の個所までを実行するとどうなりますでしょうか?

    まず、バッチファイルに
    -----
    for /F "eol=; tokens=2,3 " %%i in (%outdir%\\netstat-temp.txt) do @echo %time:~0,2%:%time: ~3,2%:%time:~6,2%,=%%i/1024/1024,=%%j/1024/1024 >> %outdir%\\netstat-daily.txt
    -----
    を1行で書き、できればその後ろに
    -----
    pause
    -----
    を書き込んでおいて、エラーが出ないか確認できるとよいでしょう。
    (ちゃんと動くようになったらpauseは外してかまいません)

    こちらの環境(Windows XP)では、実行後にnetstat-daily.txtに
    -----
    14:01:13,=224472207/1024/1024,=111626806/1024/1024
    -----
    のような内容が書かれています。
  • id:meichi
    たびたびありがとうございます。下記で実行しました。

    rem
    set outdir=c:\test

    rem
    if not exist %outdir%\\netstat-daily.txt ( echo time,received,sent > %outdir%\\netstat-daily.txt )

    rem
    netstat -e | find "Bytes" > %outdir%\\netstat-temp.txt

    for /F "eol=; tokens=2,3 " %%i in (%outdir%\\netstat-temp.txt) do @echo %time:~0,2%:%time: ~3,2%:%time:~6,2%,=%%i/1024/1024,=%%j/1024/1024 >> %outdir%\\netstat-daily.txt
    pause

    すると下記エラーになります。
    C:\>rem

    C:\>set outdir=c:\test

    C:\>rem

    C:\>if not exist c:\test\\netstat-daily.txt (echo time,received,sent 1>c:\test\\netstat-daily.txt )

    C:\>rem

    C:\>netstat -e | find "Bytes" 1>c:\test\\netstat-temp.txt
    プロセスはファイルにアクセスできません。別のプロセスが使用中です。

    C:\>for /F "eol=; tokens=2,3 "
    %i in (c:\test\\netstat-temp.txt) do @echo 14:14:23:02.83outdir\\netstat-daily.
    txt
    14:14:23:02.83outdir\\netstat-daily.txt

    C:\>pause
    続行するには何かキーを押してください . . .

    netstat-daily.txtの中身は
    time,received,sent

    netstat-temp.txtの中身は
    C:\>netstat -e | find "Bytes" 1>c:\test\\netstat-temp.txt

    となっています。すいません、よろしくお願いします。

  • id:meichi
    すいません、少しすすみました。
    ファイル名をバッチの実行コマンドと同じにしてたのを変更したら、とりあえずうごきました。
    netstat-temp.txtにErrorの結果がでるのは いいのですが、これをファイル名に
    タイムスタンプをつけたいです。わたしも しらべますが、ご存知でしたらご教示いただければ
    と思います。
  • id:y3b5
    何度もすみません。

    コマンドプロンプト上では実行できているけど、バッチファイルになるとうまくいかないみたいですので、バッチファイルの中身を確認してみましょうか。
    ・全角スペースとか全角の記号とか使っていないか
    ・1行で書くべきところはちゃんと1行になっているか
    ・バッチファイル実行中は、netstat-daily.txt、netstat-temp.txtは他のプログラムで開いていないか
    ・バッチファイル名はnetstat-daily.txt、netstat-temp.txt以外になっているか
    ・c:\testは作成済みで存在するか
    ・PCを再起動した後でバッチファイルを実行しても「プロセスはファイルにアクセスできません。別のプロセスが使用中です。」が出てしまうか

    あと、OSのバージョンは何でしょうか?
  • id:meichi
    ありがとうございます。下記でうごくようになりました。
    rem
    set outdir=c:\test

    rem
    if not exist %outdir%\\netstat-daily.txt ( echo time,received,sent > %outdir%\\netstat-daily.txt )

    rem
    netstat -e | find "Errors" > %outdir%\\netstat-temp.txt

    for /F "eol=; tokens=2,3 " %%i in (%outdir%\\netstat-temp.txt) do @echo %time:~0,2%:%time:~3,2%:%time:~6,2%,=%%i/1024/1024,=%%j/1024/1024 >> %outdir%\\netstat-daily.txt

    set outdir=

    rem exit

    あと、netstat-temp.txtのファイル名にタイムスタンプをつけたいのですが、ご教示いただけ
    ないでしょうか。
    OSはWindowsXPのServicePack3です。
  • id:y3b5
    動くようになってなによりです。
    (OSは、こちらの環境と全く違っていたら・・と思って聞きました。)

    > netstat-temp.txtのファイル名にタイムスタンプをつけたいのですが
    netstat-temp1630.txtのようにしたいなら、こんな感じでしょうか。

    rem 実行時間を取得
    for /F "tokens=1-2 delims=: " %%a in ('time /t') do set SYORI_TIME=%%a%%b

    rem
    set outdir=c:\test

    rem
    if not exist %outdir%\\netstat-daily.txt ( echo time,received,sent > %outdir%\\netstat-daily.txt )

    rem netstat-temp+実行時間でファイル名作成
    netstat -e | find "Errors" > %outdir%\\netstat-temp%SYORI_TIME%.txt

    rem netstat-temp+実行時間のファイルを読み込む
    for /F "eol=; tokens=2,3 " %%i in (%outdir%\\netstat-temp%SYORI_TIME%.txt) do @echo %time:~0,2%:%time:~3,2%:%time:~6,2%,=%%i/1024/1024,=%%j/1024/1024 >> %outdir%\\netstat-daily.txt

    set outdir=

    rem exit
  • id:meichi
    本当にすみません。ファイル名に日時をつけることは可能でしょうか。よろしくお願いします。
    m(_ _)m
  • id:y3b5
    時間だけだと翌日以降に上書きされちゃいますものね。
    今回は日付+時刻でnetstat-temp200906081700.txtのような形で出力します。

    rem 実行時間・実行日付を取得
    for /F "tokens=1-2 delims=: " %%a in ('time /t') do set SYORI_TIME=%%a%%b
    for /F "tokens=1-3 delims=/ " %%c in ('date /t') do set SYORI_DATE=%%c%%d%%e

    rem
    set outdir=c:\test

    rem
    if not exist %outdir%\\netstat-daily.txt ( echo time,received,sent > %outdir%\\netstat-daily.txt )

    rem netstat-temp+タイムスタンプでファイル名作成
    netstat -e | find "Errors" > %outdir%\\netstat-temp%SYORI_DATE%%SYORI_TIME%.txt

    rem netstat-temp+タイムスタンプのファイルを読み込む
    for /F "eol=; tokens=2,3 " %%i in (%outdir%\\netstat-temp%SYORI_DATE%%SYORI_TIME%.txt) do @echo %time:~0,2%:%time:~3,2%:%time:~6,2%,=%%i/1024/1024,=%%j/1024/1024 >> %outdir%\\netstat-daily.txt

    set outdir=

    rem exit
  • id:meichi
    本当にありがとうございました。これで終了します。お世話になりました。
  • id:y3b5
    いるか賞とたくさんのポイントありがとうございます。
    今回は自分も勉強になりました。
    ありがとうございました。

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません