2016年5月17日火曜日

tail-f.js.bat

@if(0)==(0) echo off
@rem http://computer-technology.hateblo.jp/entry/20131025/p1
setlocal
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@rem setlocal DISABLEDELAYEDEXPANSION

@rem 説明:
@rem 与えられたファイルそれぞれの末尾の部分を表示します。ファイルの内容がどんどん増えて続けているものと仮定し、ファイルの最終部分の文字を読み続けようと無限にループします。

@rem Usage:
@rem tail-f.js.bat filepath


@rem ####################
@rem Batch.
@rem ####################

@rem ....................
@rem Batch main.
@rem ....................
set rv=11
if "%~1"=="" (                                              call :L_call_BAT_NoArgs
) else (                                                    call :L_call_BAT_UnixTailF %*
)

@rem ....................
@rem Exit.
@rem ....................
@rem echo.
@rem pause
@rem echo 終了するには何かキーを押してください . . .
@rem pause>nul
exit /b !rv!
goto :eof


@rem ....................
@rem No args.
@rem ....................
:L_call_BAT_NoArgs
@rem echo BAT %0 %* ....................
call :L_call_JS
set /a rv=!errorlevel!+0
goto :eof


@rem ....................
@rem Unix tail -f.
@rem ....................
:L_call_BAT_UnixTailF
@rem echo BAT %0 %* ....................
call :L_call_JS %*
set /a rv=!errorlevel!+0
goto :eof


@rem ....................
@rem Call JScript.
@rem ....................
:L_call_JS
@rem echo BAT %0 %* ....................
set "jsargs=%*"
if "!jsargs!"=="" (
  cscript.exe //nologo //e:JScript "%~f0"
) else (
  cscript.exe //nologo //e:JScript "%~f0" !jsargs!
)
@rem call :L_echoErrorLevel
goto :eof


@end


// ####################
// JScript.
// ####################


// ....................
// No args.
// ....................
function NoArgs() {
//  WScript.Echo("JS NoArgs ....................");
  // WScript.Echo("JS Argc=" + WScript.Arguments.length + ".");
  WScript.Echo("Usage: tail-f.js.bat filepath");
  return 1;
}


// ....................
// Unix tail -f.
// ....................
function UnixTailF(jsargs) {
// WScript.Echo("JS UnixTailF ....................");
// http://www.gadgety.net/shin/tips/win/tail.html
//
// tail.js - "tail -f" for windows
//
//   Usage: cscript tail.js filename
//

  if (WScript.Arguments.length == 0) {
      WScript.Echo("Usage: cscript tail.js filename");
      WScript.Quit(1);
  }

  var path = WScript.Arguments(0);
  var fso = WScript.CreateObject("Scripting.FileSystemObject");
  if (!fso.fileExists(path)) {
      fso = null;
      WScript.Echo("file not found");
      WScript.Quit(1);
  }

  var ts = fso.OpenTextFile(path,1,false);
  var size = fso.GetFile(path).Size;

  ts.Skip(size);
  try {
      while(true) {
          WScript.Sleep(1000);
          while(!ts.AtEndOfStream) {
              WScript.Echo(ts.ReadLine());
          }
      }
  } catch(e) {
  } finally {
      ts = null;
      fso = null;
  }
  return 0;
}


// --------------------
// JScript main.
// --------------------
var rv = 0;
if (WScript.Arguments.length == 0) {
  rv = rv + NoArgs();
} else {
  var args = new Array();
  for (var idx = 0; idx < WScript.Arguments.length; ++idx) {
    args[idx] = WScript.Arguments(idx);
  }
  var ary = new Array();
  ary = args.slice(0, args.length);
  if (0 == 1) {
    rv = rv + NoArgs();
  } else {
    rv = rv + UnixTailF(ary);
  }
}
WScript.quit(rv);