Thursday, August 9, 2012

The World's Awesomest Most Insane Batch File?

@REM Is awesomest a word? I don' know, but here is the batch file
@REM Can you figure out what this does? If so you are pretty cool, like me :)
@echo off
rem by v-sopatt
setlocal ENABLEDELAYEDEXPANSION
set batchFile=%~n0
set tempspec=%batchFile%
if not defined loop_i set loop_i=0
if "%1"=="" goto :external_listen
if "%1"=="/?" goto :usage_
if "%1"=="-?" goto :usage_
if "%2"=="/?" (
    call :usage_%~1 1>&2 2>nul
) else if "%2"=="-?" (
    call :usage_%~1 1>&2 2>nul
) else (
    call :external_%* 2>nul
)
rem if errorlevel 1 call :usage_ 1>&2
goto :out_usage
rem ****************** RENAME_WAIT *************************
:rename_wait
rem * returns when the file is successfully renamed (hence it is unlocked)
ren "%~1" "%~nx2" 2> nul
IF %ERRORLEVEL%==0 goto :eof
sleep -m 50
if not exist "%~1" echo. > "%~1"
goto :rename_wait
rem ****************** CONTROLLER **********************
:usage_controller
goto :out_usage
:external_controller
set result=""
psexec \\%1 "C:\Program Files\Compaq\Hpacucli\Bin\hpacucli.exe" "controller all show" | find "%~2" > %tempspec%%loop_i%.tmp
for /f "tokens=6" %%f in (%tempspec%%loop_i%.tmp) do (
    set result=%%f
)
echo %loop_i% %result%
del %tempspec%%loop_i%.tmp
goto :eof
rem ****************** FINDDRIVE **********************
:usage_finddrive
goto :out_usage
:external_finddrive
set result=""
psexec \\%1 "C:\Program Files\Compaq\Hpacucli\Bin\hpacucli.exe" "controller slot=%2 physicaldrive all show" | find "bay %3," > %tempspec%%loop_i%.tmp
for /f "tokens=2" %%f in (%tempspec%%loop_i%.tmp) do (
    set result=%%f
)
echo %loop_i% %result%
del %tempspec%%loop_i%.tmp
goto :eof
rem ****************** DRIVEINFO **********************
:usage_driveinfo
goto :out_usage
:external_driveinfo
psexec \\%1 "C:\Program Files\Compaq\Hpacucli\Bin\hpacucli.exe" "controller slot=%2 physicaldrive %3 show" > %tempspec%%loop_i%.tmp
set result=
for /f "tokens=*" %%f in (%tempspec%%loop_i%.tmp) do (
    call :driveinfo_parse_%%f %*
)
del %tempspec%%loop_i%.tmp
echo %loop_i% %result%
goto :eof
:driveinfo_parse_array
set result=%1
goto :eof
:driveinfo_parse_physicaldrive
set result=%result%:%1
goto :eof
:driveinfo_parse_Status
if "%1"=="Predictive" (
    set result=%result%:%1%2
    if not "%6"=="" call :driveinfo_led %3 %4 "physicaldrive %5" %6
) else (
    set result=%result%:%1
    if not "%5"=="" call :driveinfo_led %2 %3 "" %5
)
goto :eof
:driveinfo_led
start cmd /c %batchFile% led %1 %2 "%~3" %4
goto :eof
:driveinfo_parse_Drive
set result=%result%:%2%3
goto :eof
:driveinfo_parse_Interface
set result=%result%:%2
goto :eof
:driveinfo_parse_Size
set result=%result%:%1%2
goto :eof
:driveinfo_parse_Firmware
set result=%result%:%2
goto :eof
:driveinfo_parse_Serial
set result=%result%:%2
goto :eof
:driveinfo_parse_Model
set result=%result%:%1.%2
goto :eof
:driveinfo_parse_SATA
set result=%result%:%3
goto :eof
:driveinfo_parse_PHY
if "%1"=="Count:" set result=%result%:%2
if "%1"=="Transfer" set result=%result%:%3
goto :eof
:driveinfo_parse_Active
:driveinfo_parse_Port
:driveinfo_parse_Smart
:driveinfo_parse_Box
:driveinfo_parse_Bay
goto :eof
rem ****************** LED **********************
:usage_led
goto :out_usage
:external_led
set result=
if "%4"=="on" (
    psexec \\%1 "C:\Program Files\Compaq\Hpacucli\Bin\hpacucli.exe" "controller slot=%2 %~3 modify led=on"
) else (
    psexec \\%1 "C:\Program Files\Compaq\Hpacucli\Bin\hpacucli.exe" "controller slot=%2 modify led=off"
)
echo %loop_i% %4
goto :eof
rem ****************** SERVERINFO **********************
:usage_serverinfo
echo Usage:
echo      %batchFile% serverinfo {server name}
echo.
echo      Parameter is required
echo Output:
echo      {line number} {serial number}:{asset tag}
echo.
echo      Line number will be zero (0) if called directly from command line. See listen command.
echo      Drive information consists of the following items, delimited by colons:
echo           Array Letter
echo           Port Number
echo           Box Identifier, e.g. 2E
echo           Bay Number
echo           Status, e.g. PredectiveFailure, Failed, Rebuilding, OK
echo           Drive Type, e.g. DataDrive
echo           Interface Type, e.g. SATA
echo           Size, e.g. 750GB
echo           Firmware Revision, e.g. HPGB
echo           Serial Number
echo           Model, e.g. ATA.GB0750C8047
echo           SATA NCQ Capable, True or False
echo           SATA NCQ Enabled, True or False
echo           PHY Count, usually 1
echo           PHY Transfer Rate, e.g. 1.5GBPS
goto :out_usage
:external_serverinfo
set result=""
wmic /node:"%1" systemenclosure get serialnumber,SMBIOSAssetTag /value | find "=" > %tempspec%%loop_i%.tmp
set result=
for /f "tokens=1,2 delims==" %%f in (%tempspec%%loop_i%.tmp) do (
    call :serverinfo_parse_%%f %%g
)
del %tempspec%%loop_i%.tmp
echo %loop_i% %result%
goto :eof
:serverinfo_parse_serialnumber
if "%1"=="" (set result={blank}) else set result=%1
goto :eof
:serverinfo_parse_SMBIOSAssetTag
if "%1"=="" (set result=%result%:{blank}) else set result=%result%:%1
goto :eof
rem ********************* shortcut **********************
:usage_shortcut
echo Usage:
echo      %batchFile% shortcut {server name} {bay number}
echo.
echo      Both parameters are required
echo Output:
echo      {line number} {serial number}:{asset tag} {slot} {drive information}
echo.
echo      Line number will be zero (0) if called directly from command line. See listen command.
echo      Drive information consists of the following items, delimited by colons:
echo           Array Letter
echo           Port Number
echo           Box Identifier, e.g. 2E
echo           Bay Number
echo           Status, e.g. PredectiveFailure, Failed, Rebuilding, OK
echo           Drive Type, e.g. DataDrive
echo           Interface Type, e.g. SATA
echo           Size, e.g. 750GB
echo           Firmware Revision, e.g. HPGB
echo           Serial Number
echo           Model, e.g. ATA.GB0750C8047
echo           SATA NCQ Capable, True or False
echo           SATA NCQ Enabled, True or False
echo           PHY Count, usually 1
echo           PHY Transfer Rate, e.g. 1.5GBPS
goto :out_usage
:external_shortcut
if "%~1"=="" goto :usage_shortcut
if "%~2"=="" goto :usage_shortcut
call :external_serverinfo %1 >nul
set shortcut_serverinfo=%result%
call :external_controller %1 "P700m" >nul
set shortcut_slot=%result%
call :external_finddrive %1 %shortcut_slot% %2 >nul
set shortcut_drivespec=%result%
call :external_driveinfo %1 %shortcut_slot% %shortcut_drivespec% %3 >nul
set result=%shortcut_serverinfo% %shortcut_slot% %result%
echo %loop_i% %result%
goto :eof
rem **************** LISTEN *******************************
rem ~~~~ Listen Usage ~~~~~
:usage_listen
echo %batchFile% listen [request file mask] [results file extension] [temp file spec]
echo     "request file mask" is a path+filespec that determines the location and filename to be processed.
echo         This defaults to \\transfer\transfer\^%username^%\hddhelper\*.req <&2
echo     "results file extension" is an additional extension that will be added to the request filename
echo         when returning results. ".results" is the default. For example, if "123.req" was the request
echo         file, 123.req.results would be the results file.
echo     "temp file spec" is a base filename for the temp files generated. This is mainly for internal use.
echo         The default is %batchFile%. If this argument has spaces results may be unpredictable
goto :out_usage
rem ~~~~ Listen Parameters ~~~~~
:external_listen
if "%~1"=="/?" goto :usage_listen
if "%~1"=="-?" goto :usage_listen
if "%~1"=="" (
    if "%ComputerName%"=="DB3TSCORP" (
        set listenMask=\\phx\services\transfer\europe\%username%\hddhelper\*.req
    ) else (
        set listenMask=\\transfer\transfer\%username%\hddhelper\*.req
    )
) else (
    set listenMask=%~1
)
if "%~2"=="" (
    set resultExt=results
) else (
    set resultExt=%~2
)
if "%~3"=="" (
    set tempSpec=%batchFile%
) else (
    set tempSpec=%~3
)
rem ~~~~ Listen Main ~~~~
set sleeplevel=100
set misscounter=0
echo Checking every 100ms for "%listenMask%"
rem ==infinite loop start
:check
if EXIST "%listenMask%" (
    set misscounter=0
    set sleeplevel=100
    for %%e in ("%listenMask%") do (
  set currentFile=%%~e
        echo Processing "!currentFile!" 1>&2
        del "!currentFile!.processing" 2>nul
        call :rename_wait "!currentFile!" "!currentFile!.processing" > nul
        start cmd /c %batchFile% processfile "!currentFile!.processing" ^> "!currentFile!.%resultExt%.processing"
        del "!currentFile!.%resultExt%" 2> nul
        call :rename_wait "!currentFile!.%resultExt%.processing" "!currentFile!.%resultExt%" > nul
 del "!currentFile!.complete" 2>nul
        call :rename_wait "!currentFile!.processing" "!currentFile!.complete" > nul
        echo Completed. See "!currentFile!.%resultExt%" 1>&2
    )
)   else if %misscounter%==1000 (
    if %sleeplevel% LSS 10000 (
        set /a sleeplevel=%sleeplevel% * 10
 echo Ratcheting down. Now checking every %sleeplevel%ms for "%listenmask%
        set misscounter=0
    )
) else (
    set /a misscounter=%misscounter%+1
)
sleep -m %sleeplevel%
goto :check
rem ==loop end
REM ******************* PROCESSFILE **************************
:usage_processfile
echo Usage:
goto :usage_out
:external_processfile
if "%~1"=="/?" goto :usage_processfile
if "%~1"=="-?" goto :usage_processfile
if "%~1"==""   goto :usage_processfile
if not defined resultExt set resultExt=results
if not defined tempspec set tempspec=%batchfile%
set loop_i=0
for /f "usebackq tokens=*" %%f in ("%~1") do (
    set /a loop_i=!loop_i!+1
    if "%%f"=="" (
        echo !loop_i! > %tempspec%!loop_i!.waiting
    ) else (
        rem ~ kick off a separate process for each line in the file ~
        start cmd /c "%batchFile%" %%f ^> %tempspec%!loop_i!.waiting
    )
)
rem ~~~~ compile the results ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
echo %loop_i% Processes started for "%~1". Waiting for results 1>&2
set result_count=%loop_i%
set loop_i=0
for /f "usebackq tokens=*" %%f in ("%~1") do (
    set /a loop_i=!loop_i!+1
    call :rename_wait %tempspec%!loop_i!.waiting %tempspec%!loop_i!.done
    type %tempspec%!loop_i!.done
    del %tempspec%!loop_i!.done
)
sleep -m 100
set resultExt=results
set tempSpec=temp
goto :eof
rem *************************  USAGE ***********************************************
:usage_
echo Usage:
echo %batchFile% [parameters]: same as %batchFile% listen [parameters]"
echo %batchFile% [command] [parameters]
echo %batchFile% /? : this help message
echo %batchFile% [command] /? : help message for a particular command
echo for "listen" command usage, try "%batchFile% listen /?"
echo commands:
echo     listen
echo     serverinfo
echo     controller
echo     driveinfo
echo     led
echo     shortcut
goto :out_usage
:out_usage
popd

No comments:

Post a Comment