2016年5月24日火曜日

touch.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 touch.js.bat "YYYY/MM/DD hh:mm:ss" filepath

cscript.exe //nologo //e:JScript "%~f0" %*

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


@end


// http://d.hatena.ne.jp/aba3/20110612/1307866375
var fso = new ActiveXObject("Scripting.FileSystemObject");
var filepath = WScript.Arguments(1);
WScript.CreateObject("Shell.Application")
    .NameSpace(fso.GetParentFolderName(filepath))
    .ParseName(fso.GetFilename(filepath))
    .ModifyDate = WScript.Arguments(0);
WScript.quit(0);

2016年5月18日水曜日

_deleteEmptyDirectory.ps1.bat

@echo off
setlocal
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@rem setlocal DISABLEDELAYEDEXPANSION

@rem 説明:
@rem Template of PowerShell script in Batch file.

@rem Usage:
@rem "_deleteEmptyDirectory.ps1.bat" "PS1_DeleteEmptyDirectory"              "ディレクトリ・パス"
@rem "_deleteEmptyDirectory.ps1.bat" "PS1_Output_PowerShellScriptLinesRange" " 1 "    "  22  二弐  "     "   333   333   333   "
@rem "_deleteEmptyDirectory.ps1.bat" "PS1_Output_PowerShellScriptLinesRange" "_deleteEmptyDirectory.ps1.bat" " 1 "    "  22  二弐  "     "   333   333   333   "
@rem "_deleteEmptyDirectory.ps1.bat"
@rem "_deleteEmptyDirectory.ps1.bat" "xxxxxxxx"                              " 1 "    "  22  二弐  "     "   333   333   333   "
@rem echo errorlevel=%errorlevel%


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

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

@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
echo BAT %0 %* ....................
call :L_call_PS1
call :L_call_PS1
set /a rv=!errorlevel!+9
goto :eof


@rem ....................
@rem Other args.
@rem ....................
:L_call_BAT_OtherArgs
@rem echo BAT %0 %* ....................
call :L_call_PS1 %*
set /a rv=!errorlevel!+8
goto :eof


@rem ....................
@rem Echo ErrorLevel.
@rem ....................
:L_echoErrorLevel
@rem echo BAT L_echoErrorLevel ....................
@rem echo BAT %0 R errorlevel=!errorlevel!
@rem echo.
goto :eof


@rem ....................
@rem Get PowerShellScriptLinesRange.
@rem ....................
:L_getPowerShellScriptLinesRange
@rem echo BAT %0 %* ....................
for /f "usebackq tokens=1,2 delims=, " %%y in (
  `call "%~f0" "PS1_Output_PowerShellScriptLinesRange" "%~f0"`
) do (
  set /a ps1Sta1=%%y+0 2>nul
  set /a ps1End1=%%z+0 2>nul
  if "!ps1Sta1!,!ps1End1!"=="%%y,%%z" (
    set "ps1Sta=%%y"
    set "ps1End=%%z"
  )
)
goto :eof


@rem ....................
@rem Call PowerShell script.
@rem ....................
:L_call_PS1
@rem http://qiita.com/cd01/items/82829ba0ec0f59e1b04d
@rem http://scripting.cocolog-nifty.com/blog/2007/07/powershellps1_bd41.html
@rem echo BAT %0 %* ....................
set "ps1args=%*"
set "ps1line=$ps1sb = (\"\");"
set "ps1line=!ps1line!$ps1obj = (Get-Content \"%~f0\");"
if "!ps1Sta!,!ps1End!"=="," (
  if "%~1"=="PS1_Output_PowerShellScriptLinesRange" (
    set "ps1line=!ps1line!$ps1Sta = ($ps1obj | Select-String (\"^goto \:eof$\") | Select-Object -Last 1).LineNumber + 1;"
    set "ps1line=!ps1line!$ps1End = ($ps1obj | Select-String (\"^@\" + \"end$\") | Select-Object -First 1).LineNumber - 1;"
    set "ps1line=!ps1line!if ($ps1End -eq -1) {$ps1End = $ps1obj.Length};"
  ) else (
    call :L_getPowerShellScriptLinesRange
    set "ps1line=!ps1line!$ps1Sta = !ps1Sta!;"
    set "ps1line=!ps1line!$ps1End = !ps1End!;"
  )
) else (
  set "ps1line=!ps1line!$ps1Sta = !ps1Sta!;"
  set "ps1line=!ps1line!$ps1End = !ps1End!;"
)
set "ps1line=!ps1line!$ps1sb += for ($cc = 0; $cc -lt $ps1Sta; ++$cc) {$ps1sb += \"`n\"} <# Dummy blank lines for line number in PowerShell message. #>;"
set "ps1line=!ps1line!$ps1sb += ($ps1obj | Select-Object -First $ps1End | Select-Object -Skip $ps1Sta) -Join \"`n\";"
set "ps1line=!ps1line!$ps1sb = [scriptblock]::create($ps1sb);"
set "ps1line=!ps1line!&$ps1sb"
if "!ps1args!"=="" (
  powershell -NoProfile -ExecutionPolicy Unrestricted "!ps1line!"
) else (
  set "ps1args=!ps1args:"='!"
  rem '
  powershell -NoProfile -ExecutionPolicy Unrestricted "!ps1line!" "!ps1args!"
)
call :L_echoErrorLevel
goto :eof


# ####################
# PowerShell script.
# ####################


# ....................
# No args.
# ....................
function global:NoArgs {
  Write-Host "PS1 NoArgs ...................."
  # Write-Host "PS1 Argc=$($Args.Length)."  
  Write-Host "PS1 There are no arguments."
  return 9
}


# ....................
# Delete empty directory.
# ....................
function global:PS1_DeleteEmptyDirectory([string[]]$ps1args) {
# http://qiita.com/yjnk/items/a69920748e96272bfd10
# http://www.atmarkit.co.jp/ait/articles/0808/29/news131.html
# http://www55.atwiki.jp/sabakanse/pages/20.html
  if(Test-Path $ps1args[0]){
    $List = Get-ChildItem -Recurse $ps1args[0] |
        Where-Object {$_.Attributes -eq "Directory"} |
        Sort-Object FullName -Descending
    foreach($a in $List) {
#      Write-Host ("1`t" + $a.GetDirectories().Count + "`t" + $a.GetFiles().Count + "`t" + $a.FullName)
      if (($a.GetFiles().Count -eq 0) -and ($a.GetDirectories().Count -eq 0)) {
#        Write-Host ("2`t" + $a.GetDirectories().Count + "`t" + $a.GetFiles().Count + "`t" + $a.FullName)
        Write-Host ($a.FullName)
        Remove-Item $a.FullName
      }
    }
  }else{
    Write-Host 'ディレクトリは存在しません。'
  } 

  return 1
}


# ....................
# Other args.
# ....................
function global:OtherArgs([string[]]$ps1args) {
  Write-Host "PS1 OtherArgs ...................."
  Write-Host "PS1 [$($ps1args.Length)]$($ps1args)."
  for($idx = 0; $idx -lt $ps1args.Length; ++$idx) {
    Write-Host "PS1 Args[$($idx)]=$($ps1args[$idx])."
  }
  return 8
}


# ....................
# Output PowerShellScriptLinesRange.
# ....................
function global:Output_PowerShellScriptLinesRange([string]$pathPowerShellScript) {
  $ps1Sta = 0
  $ps1End = 0
  if (Test-Path $pathPowerShellScript) {
    $ps1obj = Get-Content $pathPowerShellScript
    $ps1Sta = ($ps1obj | Select-String ("^goto \:eof$") | Select-Object -Last 1).LineNumber + 1
    $ps1End = ($ps1obj | Select-String ("^@" + "end$") | Select-Object -First 1).LineNumber - 1
    if ($ps1End -eq -1) {$ps1End = $ps1obj.Length}
  }
  Write-Host "$ps1Sta,$ps1End"
  return 7
}


# --------------------
# PowerShell script main.
# --------------------
$rv = 20
if ($Args.Length -eq 0) {
  $rv = $rv + (NoArgs)
} else {
  if (0 -eq 1) {
    $rv = $rv + 1
  } elseif (($Args.Length -eq 2) -and ($Args[0].Equals("PS1_DeleteEmptyDirectory"))) {
    $ary = $Args[1 .. ($Args.length - 1)]
    $rv = $rv + (PS1_DeleteEmptyDirectory ($ary))
  } elseif (($Args.Length -ge 1) -and ($Args[0].Equals("PS1_Output_PowerShellScriptLinesRange"))) {
    $rv = $rv + (Output_PowerShellScriptLinesRange ($Args[1]))
  } else {
    $rv = $rv + (OtherArgs ($Args))
  }
}
exit $rv

_listEmptyDirectory.bat

@echo off
setlocal
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
setlocal DISABLEDELAYEDEXPANSION

@rem 説明:
@rem 指定されたディレクトリ配下の空ディレクトリのパスの一覧を出力します。
@rem ディレクトリは複数を指定できます。
@rem ディレクトリが指定されない場合、このバッチファイルが置かれたディレクトリを対象とします。
@rem ディレクトリパスが「@」、「!」を含む場合、正しく出力されない場合があります。

@rem Usage:
@rem _listEmptyDirectory.bat [<dirpath> [...]]

call :L_main %*
exit /b !errorlevel!
goto :eof

:L_main
call :L_lsredirs %*
goto :eof

:L_lsredirs
if "%~1"=="" (
  call :L_lsredir1 "%~dp0"
) else (
  for %%v in (
    %*
  ) do (
    if not "%%~v"=="" (
      if exist "%%~v" (
        call :L_lsredir1 "%%~v"
      )
    )
    shift
  )
)
goto :eof

@rem http://fpcu.on.coocan.jp/dosvcmd/bbs/log/dir/4-1473.html
@rem 指定されたディレクトリ配下の空ディレクトリのパスの一覧を出力します。
@rem ディレクトリは1つ指定します。
@rem ディレクトリパスが「@」、「!」を含む場合、正しく出力されない場合があります。
:L_lsredir1
for /R "%~1" %%w in ( . ) do (
  if exist "%%~w" (
    call :L_lsedir1 "%%~w" 2> nul
  )
)
goto :eof

@rem 指定されたディレクトリが空ディレクトリの場合、そのディレクトリのパスを出力します。
@rem ディレクトリは1つ指定します。
@rem ディレクトリパスが「@」、「!」を含む場合、正しく出力されない場合があります。
:L_lsedir1
set "arg1=%~1"
for /f "usebackq tokens=1-3" %%x in (
  `dir "%~1" ^| find "個のファイル"`
) do (
  set "filenum=%%x"
  set "bytes=%%z"
)
set "bytes=%bytes:,=%"
for /f "usebackq tokens=1" %%z in (
  `dir "%~1" ^| find "個のディレクトリ"`
) do (
  set "dirnum=%%z"
)
if %filenum% equ 0 (
  if %bytes% equ 0 (
    if %dirnum% equ 2 (
      echo %arg1:~,-2%
    )
  )
)
goto :eof

Lsdfr.ps1.bat

@echo off
setlocal
setlocal ENABLEEXTENSIONS ENABLEDELAYEDEXPANSION
@rem setlocal DISABLEDELAYEDEXPANSION

@rem 説明:
@rem Directory file list.

@rem Usage:
@rem "Lsdfr.ps1.bat" dirpath csvpath
@rem echo errorlevel=%errorlevel%


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

@rem ....................
@rem Batch main.
@rem ....................
set rv=11
if "%~1"=="" (                                              call :L_call_BAT_NoArgs
) else if "%~1"=="BAT_Output_Args" (                        call :L_BAT_Output_Args %*
) else if "%~1"=="PS1_Output_PowerShellScriptLinesRange" (  call :L_call_PS1 %*
) else (                                                    call :L_call_BAT_OtherArgs %*
)

@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_PS1
set /a rv=!errorlevel!+9
goto :eof


@rem ....................
@rem Output Args.
@rem ....................
:L_BAT_Output_Args
set /a y=0
for %%z in (
  %*
) do (
  set /a y=!y!+1
  echo BAT %%!y!=%%~z.
)
set /a rv=!errorlevel!+1
goto :eof


@rem ....................
@rem Other args.
@rem ....................
:L_call_BAT_OtherArgs
call :L_call_PS1 %*
set /a rv=!errorlevel!+0
goto :eof


@rem ....................
@rem Echo ErrorLevel.
@rem ....................
:L_echoErrorLevel
@rem echo BAT L_echoErrorLevel ....................
echo BAT %0 R errorlevel=!errorlevel!
@rem echo.
goto :eof


@rem ....................
@rem Get PowerShellScriptLinesRange.
@rem ....................
:L_getPowerShellScriptLinesRange
for /f "usebackq tokens=1,2 delims=, " %%y in (
  `call "%~f0" "PS1_Output_PowerShellScriptLinesRange" "%~f0"`
) do (
  set /a ps1Sta1=%%y+0 2>nul
  set /a ps1End1=%%z+0 2>nul
  if "!ps1Sta1!,!ps1End1!"=="%%y,%%z" (
    set "ps1Sta=%%y"
    set "ps1End=%%z"
  )
)
goto :eof


@rem ....................
@rem Call PowerShell script.
@rem ....................
:L_call_PS1
@rem http://qiita.com/cd01/items/82829ba0ec0f59e1b04d
@rem http://scripting.cocolog-nifty.com/blog/2007/07/powershellps1_bd41.html
set "ps1args=%*"
set "ps1line=$ps1sb = (\"\");"
set "ps1line=!ps1line!$ps1obj = (Get-Content \"%~f0\");"
if "!ps1Sta!,!ps1End!"=="," (
  if "%~1"=="PS1_Output_PowerShellScriptLinesRange" (
    set "ps1line=!ps1line!$ps1Sta = ($ps1obj | Select-String (\"^goto \:eof$\") | Select-Object -Last 1).LineNumber + 1;"
    set "ps1line=!ps1line!$ps1End = ($ps1obj | Select-String (\"^@\" + \"end$\") | Select-Object -First 1).LineNumber - 1;"
    set "ps1line=!ps1line!if ($ps1End -eq -1) {$ps1End = $ps1obj.Length};"
  ) else (
    call :L_getPowerShellScriptLinesRange
    set "ps1line=!ps1line!$ps1Sta = !ps1Sta!;"
    set "ps1line=!ps1line!$ps1End = !ps1End!;"
  )
) else (
  set "ps1line=!ps1line!$ps1Sta = !ps1Sta!;"
  set "ps1line=!ps1line!$ps1End = !ps1End!;"
)
set "ps1line=!ps1line!$ps1sb += for ($cc = 0; $cc -lt $ps1Sta; ++$cc) {$ps1sb += \"`n\"} <# Dummy blank lines for line number in PowerShell message. #>;"
set "ps1line=!ps1line!$ps1sb += ($ps1obj | Select-Object -First $ps1End | Select-Object -Skip $ps1Sta) -Join \"`n\";"
set "ps1line=!ps1line!$ps1sb = [scriptblock]::create($ps1sb);"
set "ps1line=!ps1line!&$ps1sb"
if "!ps1args!"=="" (
  powershell -NoProfile -ExecutionPolicy Unrestricted "!ps1line!"
) else (
  set "ps1args=!ps1args:"='!"
  rem '
  powershell -NoProfile -ExecutionPolicy Unrestricted "!ps1line!" "!ps1args!"
)
@rem call :L_echoErrorLevel
goto :eof


# ####################
# PowerShell script.
# ####################


# ....................
# No args.
# ....................
function global:NoArgs {
  # Write-Host "PS1 NoArgs ...................."
  # Write-Host "PS1 Argc=$($Args.Length)."  
  Write-Host "Usage: Lsdfr.ps1.bat dirpath csvpath"
  return 9
}


# ....................
# Get-Lsdfr.
# ....................
# http://eco.senritu.net/make_filelist_with_powershell/
function global:Get-Lsdfr {
  Param ([string]$dirpath, [string]$csvpath)
  Set-Location $dirpath
  # "PSPath","PSParentPath","PSChildName","PSDrive","PSProvider","PSIsContainer",
  # "BaseName","Mode","Name","Parent","Exists","Root","FullName","Extension",
  # "CreationTime","CreationTimeUtc","LastAccessTime","LastAccessTimeUtc","LastWriteTime","LastWriteTimeUtc","Attributes"
  Get-ChildItem -Recurse | Select-Object Mode,CreationTime,CreationTimeUtc,LastAccessTime,FullName,Extension | Export-Csv -Encoding Default -force -notype $csvpath
  return 0
}


# ....................
# Other args.
# ....................
function global:OtherArgs([string[]]$ps1args) {
#  Write-Host "PS1 OtherArgs ...................."
#  Write-Host "PS1 [$($ps1args.Length)]$($ps1args)."
#  for($idx = 0; $idx -lt $ps1args.Length; ++$idx) {
#    Write-Host "PS1 Args[$($idx)]=$($ps1args[$idx])."
#  }
  Write-Host "Usage: Lsdfr.ps1.bat dirpath csvpath"
  return 1
}


# ....................
# Output PowerShellScriptLinesRange.
# ....................
function global:Output_PowerShellScriptLinesRange([string]$pathPowerShellScript) {
  $ps1Sta = 0
  $ps1End = 0
  if (Test-Path $pathPowerShellScript) {
    $ps1obj = Get-Content $pathPowerShellScript
    $ps1Sta = ($ps1obj | Select-String ("^goto \:eof$") | Select-Object -Last 1).LineNumber + 1
    $ps1End = ($ps1obj | Select-String ("^@" + "end$") | Select-Object -First 1).LineNumber - 1
    if ($ps1End -eq -1) {$ps1End = $ps1obj.Length}
  }
  Write-Host "$ps1Sta,$ps1End"
  return 7
}


# --------------------
# PowerShell script main.
# --------------------
$rv = 0
if ($Args.Length -eq 0) {
  $rv = $rv + (NoArgs)
} else {
  if (0 -eq 1) {
    $rv = $rv + 1
  } elseif (($Args.Length -ge 2) -and ($Args[0].Equals("PS1_Output_PowerShellScriptLinesRange"))) {
    $rv = $rv + (Output_PowerShellScriptLinesRange ($Args[1]))
  } elseif ($Args.Length -ge 2) {
    $rv = $rv + (Get-Lsdfr $Args[0] $Args[1])
  } else {
    $rv = $rv + (OtherArgs ($Args))
  }
}
exit $rv

2016年5月17日火曜日

EventCheck.bat

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

@rem 説明:
@rem Windowsの開始日時と終了日時の一覧を出力します。
@rem
@rem 出力例:
@rem   2016/01/28 09:32:21 Thu - 2016/01/28 20:46:37 Thu
@rem   2016/01/29 09:40:02 Fri - 2016/01/29 18:40:56 Fri
@rem   2016/02/01 09:53:05 Mon - 2016/02/01 19:52:03 Mon
@rem   2016/02/02 09:30:32 Tue -
@rem
@rem 引数
@rem   日数
@rem     過去何日前からの記録をするかの日数を指定します。
@rem     日数は正の整数です。
@rem     既定値は40です。
@rem     不正値チェックはしていません。不正値の場合、異常終了します。
@rem
@rem 戻り値
@rem   0
@rem     常に0です。
@rem
@rem 情報源
@rem   Windowsの開始日時
@rem     Windowsのシステム ログのイベントID=6005(イベント ログ サービスの開始)。
@rem
@rem   Windowsの終了日時
@rem     Windowsのシステム ログのイベントID=6006(イベント ログ サービスの終了)。
@rem
@rem Windowsのシステム ログ内を検索するときの期間の条件
@rem   期間の開始日
@rem   「40日前」は当バッチ コマンドの第1引数で変更できます。
@rem
@rem   期間の終了日
@rem   当バッチ コマンド実行日。
@rem
@rem 当バッチ コマンドの名称
@rem   変更できます。
@rem
@rem 実行方法
@rem   引数を指定しない場合
@rem     EventCheck.bat
@rem
@rem   引数を指定する場合
@rem     EventCheck.bat 10

@rem Usage:
@rem EventCheck.bat


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

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

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


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


@rem ....................
@rem Other args.
@rem ....................
:L_call_BAT_OtherArgs
@rem echo BAT %0 %* ....................
call :L_call_JS "JS_EventCheck" %*
set /a rv=!errorlevel!+0
goto :eof


@rem ....................
@rem Echo ErrorLevel.
@rem ....................
:L_echoErrorLevel
@rem echo BAT L_echoErrorLevel ....................
@rem echo BAT %0 R errorlevel=!errorlevel!
@rem echo.
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!
)
call :L_echoErrorLevel
goto :eof


@end


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


// ....................
// No args.
// ....................
function NoArgs() {
//  WScript.Echo("JS NoArgs ....................");
  // WScript.Echo("JS Argc=" + WScript.Arguments.length + ".");
  WScript.Echo("There are no arguments.");
  return 1;
}


http://qiita.com/osakanafish/items/c64fe8a34e7221e811d0
/**
 * 日付をフォーマットする
 * @param  {Date}   date     日付
 * @param  {String} [format] フォーマット
 * @return {String}          フォーマット済み日付
 */
var formatDate = function (date, format) {
  var WEEK_DAY_EN = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
  if (!format) format = 'YYYY-MM-DD hh:mm:ss.SSS www';
  format = format.replace(/YYYY/g, date.getFullYear());
  format = format.replace(/MM/g, ('0' + (date.getMonth() + 1)).slice(-2));
  format = format.replace(/DD/g, ('0' + date.getDate()).slice(-2));
  format = format.replace(/hh/g, ('0' + date.getHours()).slice(-2));
  format = format.replace(/mm/g, ('0' + date.getMinutes()).slice(-2));
  format = format.replace(/ss/g, ('0' + date.getSeconds()).slice(-2));
  if (format.match(/S/g)) {
    var milliSeconds = ('00' + date.getMilliseconds()).slice(-3);
    var length = format.match(/S/g).length;
    for (var i = 0; i < length; ++i) format = format.replace(/S/, milliSeconds.substring(i, i + 1));
  }
  format = format.replace(/www/g, (WEEK_DAY_EN[date.getDay()]));
  return format;
};


// http://www.activexperts.com/admin/scripts/wmi/jscript/0406/
function WmiDate_parseWmiDateTimeString(strDtmDate) {
  if (strDtmDate == null) {
    return "null date";
  }
  var strDateTime;
  if (strDtmDate.substr(4, 1) == 0) {
    strDateTime = strDtmDate.substr(5, 1) + "/";
  }  else  {
    strDateTime = strDtmDate.substr(4, 2) + "/";
  }
  if (strDtmDate.substr(6, 1) == 0) {
     strDateTime = strDateTime + strDtmDate.substr(7, 1) + "/";
  }  else  {
    strDateTime = strDateTime + strDtmDate.substr(6, 2) + "/";
  }
  strDateTime = strDateTime +
      strDtmDate.substr(0, 4) + " " +
      strDtmDate.substr(8, 2) + ":" +
      strDtmDate.substr(10, 2) + ":" +
      strDtmDate.substr(12, 2);
  return(strDateTime);
};


// http://qiita.com/search?q=JScript%E3%81%A7WMI&sort=rel
// http://qiita.com/tnakagawa/items/89917ca9fbde1c2f47a9
function WmiDate(date) {
  var datetime = null;
  if (date && date instanceof Date) {
    // 「SWbemDateTime」オブジェクト生成
    datetime = new ActiveXObject("WbemScripting.SWbemDateTime");
    datetime.Year = date.getUTCFullYear();                      // 年
    datetime.Month = date.getUTCMonth() + 1;                    // 月
    datetime.Day = date.getUTCDate();                           // 日
    datetime.Hours = date.getUTCHours();                        // 時
    datetime.Minutes = date.getUTCMinutes();                    // 分
    datetime.Seconds = date.getUTCSeconds();                    // 秒
    datetime.Microseconds = date.getUTCMilliseconds() * 1000;   // ミリ秒
  }
  return datetime;
};


function Date_formatLocal(date) {
  var ret = null;
  var DLM_YMD = "/";
  var DLM_HMS = ":";
  if (date && date instanceof Date) {
    ret = date.getFullYear() + DLM_YMD                          // 年
        + ("0" + (date.getMonth() + 1)).slice(-2) + DLM_YMD     // 月
        + ("0" + date.getDate()).slice(-2) + " "                // 日
        + ("0" + date.getHours()).slice(-2) + DLM_HMS           // 時
        + ("0" + date.getMinutes()).slice(-2) + DLM_HMS         // 分
        + ("0" + date.getSeconds()).slice(-2)                   // 秒
//      + "." + ("00" + date.getMilliseconds()).slice(-3)       // ミリ秒
//      + "000"                                                 // ナノ秒
//      + date.getTimezoneOffset()                              // 時差
        ;
  }
  return ret;
};


// http://qiita.com/tnakagawa/items/ae579f19d74dd86e40c6
function wmiProps(wqlQuery) {
  // 結果
  var result = [];
  try {
    // 「SWbemLocator」オブジェクト取得
    var locator = new ActiveXObject("WbemScripting.SWbemLocator");
    // 「SWbemServices」オブジェクト取得(ローカルコンピュータ、名前空間「root\CIMV2」)
    var services = locator.ConnectServer(null, "root\\CIMV2");
    // クエリ実行、「SWbemObjectSet」オブジェクト取得
    var set = services.ExecQuery(wqlQuery);
    // 「SWbemObjectSet」をJScriptで扱えるように「Enumerator」に変換
    var enumSet = new Enumerator(set);
    // 「SWbemObjectSet」の最後までループ
    while (!enumSet.atEnd()) {
      // 要素「SWbemObject」を取得
      var item = enumSet.item();
      // プロパティ「SWbemPropertySet」取得
      var props = item.Properties_;
      // 「SWbemPropertySet」をJScriptで扱えるように「Enumerator」に変換
      var enumProps = new Enumerator(props);
      // アイテム変数
      var item = {};
      // プロパティ分ループ
      item["RecordNumber"] = "";    // Reserve item[0]
      item["Logfile"] = "";         // Reserve item[1]
      while (!enumProps.atEnd()) {
        var val = null;
        // プロパティ取得
        var prop = enumProps.item();
        //WScript.StdOut.WriteLine(prop);
        // nullチェック
        if (prop.Value != null) {
          // 配列判定
          if (prop.IsArray) {
            // 配列化
            val = new VBArray(prop.Value).toArray();
          } else {
            val = prop.Value;
          }
        }
        // アイテム設定
        item[prop.Name] = val;
        // 次のプロパティへ移動
        enumProps.moveNext();
      }
      // アイテム設定
      result.push(item);
      // 次の要素へ移動
      enumSet.moveNext();
    }
  } catch (e) {
      // エラーの場合
      throw e;
  }
  return result;
};


function wmiPropsPrintAscend(props) {
  var DLM_DT_WK = " ";
  var DLM_DT_DT = " - ";
  // 曜日(英語)
  var WEEK_DAY_EN = ["Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"];
                  // "YYYY/MM/DD hh:mm:dd" + DLM_DT_WK + "www"
                  // "2016/01/02 03:04:05" + DLM_DT_WK + "Sat"
  var DATE_STR_SPC = "                   " + DLM_DT_WK + "   ";
  var dateStrSta = DATE_STR_SPC;
  var dateStrSto = DATE_STR_SPC;
  var dateStrCrr = DATE_STR_SPC;
  var dateTimeDst = new Date().getTimezoneOffset() * 60 * 1000;   // UTCと現地の時差。
  // キー配列
  var keys = null;
  var line1 = [];     // 1要素は1行
  // プロパティ配列数分ループ
  for (var i = props.length - 1; i >= 0; --i) {
    // 1プロパティを1イベントとして要素取得
    var items = props[i];
    // キー存在チェック
    if (keys == null) {
      // 初期化
      keys = [];
      // 要素のキー取得
      for (key in items) {
        keys.push(key);
      }
    }
    var line2 = [];   // 1要素は1イベント
    // 要素数分ループ
    for (var j = 0; j < keys.length; ++j) {
      // 要素取得
      var item = items[keys[j]];
      // 要素存在チェック
      if (item != null) {
        // 要素配列チェック
        if (item instanceof Array) {
          // 配列の場合、改行で連結
          item = item.join("\r\n");
        } else {
          // 文字列化
          item = "" + item;
        }
        // ダブルクォーテーションフラグ偽
        var isQuote = false;
        // 要素にダブルクォーテーションの存在チェック
        if (item.indexOf("\"") >= 0) {
          // ダブルクォーテーションを置き換え
          item = item.replace(/\"/g, "\"\"");
          // ダブルクォーテーションフラグ真
          isQuote = true;
        } else if (item.indexOf(",") >= 0
            || item.indexOf("\r") >= 0
            || item.indexOf("\n") >= 0) {
          // 要素に、「,」「CR」「LF」のいずれかがあるので
          // ダブルクォーテーションフラグ真
          isQuote = true;
        }
        // ダブルクォーテーションフラグ判定
        if (isQuote) {
          // 両端をダブルクォーテーションで囲む
          item = "\"" + item + "\"";
        }
      }
      // 要素設定
      line2.push(item);
    }
    // Windowsの1回分の開始日時と終了日時を1文字列として配列line1へ格納する。
    // Windowsをシャットダウンせずに電源断して再起動した場合、開始日時のイベントが連続することを考慮する。
    // WMIで取得したイベントの日時文字列を現地日時のDate型に変換する。
    var eventDate = new Date(
      Date.parse(WmiDate_parseWmiDateTimeString(line2[3])) - dateTimeDst
    );
    // イベントの現地日時のDate型を文字列に変換する。
    dateStrCrr = Date_formatLocal(eventDate) + DLM_DT_WK + WEEK_DAY_EN[eventDate.getDay()];
    // 1行分のデータを設定。
    if (6005 == line2[2]) {     // 開始日時
      if (dateStrSta != DATE_STR_SPC) {
        line1.push(dateStrSta + DLM_DT_DT + dateStrSto);
      }
      dateStrSta = dateStrCrr;
      dateStrSto = DATE_STR_SPC;
    }
    if (6006 == line2[2]) {     // 終了日時
      line1.push(dateStrSta + DLM_DT_DT + dateStrCrr);
      dateStrSta = DATE_STR_SPC;
      dateStrSto = DATE_STR_SPC;
    }
  }
  // 現在の稼働分は、開始日時ありで終了日時なしとして取得できているはず。
  if ((dateStrSta != DATE_STR_SPC) || (dateStrSto != DATE_STR_SPC)) {
    // 終了日時なしの場合、最終行の終了日時を現在の日時にする
    if ((true) && (dateStrSto == DATE_STR_SPC)) {
      dateStrSto = formatDate(new Date(), "YYYY/MM/DD hh:mm:ss www");
    }
    line1.push(dateStrSta + DLM_DT_DT + dateStrSto);
  }
  for (j = 0; j < line1.length; ++j) {
    WScript.StdOut.WriteLine(line1[j]);
  }
  return;
};


// ....................
// EventCheck.
// ....................
function EventCheck(args) {
  var DAYS = 40;      // 抽出日数(過去n日)
  if ((args != null) && (args.length >= 1)) {
    DAYS = args;
  }
  var dt = new Date();
  dt.setHours(0);
  dt.setMinutes(0);
  dt.setSeconds(0);
  dt.setDate(dt.getDate() - DAYS);
  // WMIでイベントログを抽出するWQL。
  // WMIは日時をUTCで扱う。ただし、日時の書式は独自で、時差の±は逆。
  // WQLはSQLに似ているがORDER BY句がない。
  // Windowsの開始日時と終了日時であれば、降順と言えると思われる。
  var wqlQuery = [
    "SELECT EventCode,TimeGenerated,TimeWritten",
    "  FROM Win32_NTLogEvent",
    "  WHERE (EventCode = 6005 OR EventCode = 6006)",
    "  AND Logfile = 'System'",
    "  AND TimeGenerated >= '" + WmiDate(dt) + "'",
  ].join(" ");
  var props = wmiProps(wqlQuery);
  // 並べ替えせずに末尾から先頭方向へ参照していく方式で
  // Windowsの開始日時と終了日時を昇順で出力。
  wmiPropsPrintAscend(props);
  return 0;
}


// ....................
// Other args.
// ....................
function OtherArgs(jsargs) {
//  WScript.Echo(" OtherArgs ....................");
//  WScript.Echo("JS [" + jsargs.length + "]" + jsargs + ".");
//  for(var idx = 0; idx < jsargs.length; ++idx) {
//    WScript.Echo("JS Args[" + idx + "]=" + jsargs[idx] + ".");
//  }
  WScript.Echo("Other args.");
  return 1;
}


// --------------------
// 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 + 1;
  } else if ((args.length == 1) && (WScript.Arguments(0) == "JS_EventCheck")) {
    rv = rv + EventCheck();
  } else if ((args.length == 2) && (WScript.Arguments(0) == "JS_EventCheck")) {
    rv = rv + EventCheck(args[1]);
  } else {
    rv = rv + OtherArgs(ary);
  }
}
WScript.quit(rv);