Windows batch file script to shutdown/reboot computers async - from a CSV file list.

@echo off
setlocal

:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: Machine List Shutdown/Reboot
::
:: Remotely Restart or Shutdown multiple computers from a file/csv
::
:: For help...
:: C:\> FastShutdown.cmd /help
::
:: Gastone Canali
:: version 2.2 31/03/2016
::
:: https://gallery.technet.microsoft.com/Shutdown-Ultra-rapido-per-a26bdbfc
:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:: set some variables
call :_init_vars  "%*"

:: Time_Out period before shutdown T_O xxx seconds.
set /A "T_O=600"

:: T_O in Minutes, only for the message
set /A "min=%T_O% / 60"

:: Message
set MSG="Shutting down Windows automatically %min% minutes from now..."

call :_SHUTDOWN_from_list "c:\pc\listPCs.txt"

goto :_END

::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: PROCEDURES
::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::

:_init_vars
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    :: VARIABLES
    ::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    echo.|set /p a="%~1"|findstr   /R /c:"/?" /c:"/help$" /C:"/h$" 1>nul 2>nul && goto :_HELP

    :: script path
    set ScrPathTmp=%~dp0

    :: Remove the last character  c:\scrip\path\  then  c:\scrip\path
    set ScrPath=%ScrPathTmp:~0,-1%

    :: set path
    set path=%ScrPath%;%ScrPath%\bin;%path%

    :: script name
    set filename=%~n0
    set logfile="%ScrPath%\log\_%filename%.txt"
    set accodaLOG=^>^> %logfile% 2^>^&1

    :: Wait time between one compute to another
    set "waittime=1"

    :: ping number
    :: If using pc name, set the value to 2
    set "pingnum=2"

    :: Time in milliseconds to wait for a reply for each packet sent.
    set "pingwait=15"

    :: make dir for log files
    if not exist "%ScrPath%\log\" mkdir "%ScrPath%\log"  >NUL  2>&1

    goto :eof

:_SHUTDOWN_from_list
    rem list %~1
    for /f "eol=;" %%c in ('type "%~1"') do (
        call :_SHUTDOWN %%c
        call :_WAIT %waittime%
    )
    goto :eof

:_SHUTDOWN_ABORT_from_list
    rem list %~1
    for /f "eol=;" %%c in ('type "%~1"') do (
        call :_SHUTDOWN_ABORT %%c
        call :_WAIT %waittime%
    )
    goto :eof

:_REBOOT_from_list
    rem list %~1
    for /f "eol=;" %%c in ('type "%~1"') do (
        call :_REBOOT %%c
        call :_WAIT %waittime%
    )
    goto :eof

:_SHUTDOWN
    title %1
    echo >%temp%\%1.cmd @echo off
    echo>>%temp%\%1.cmd title=%1
    echo>>%temp%\%1.cmd ping %1 -4 -n %pingnum% -w %pingwait%^|find  "TTL=" ^>nul ^&^& (echo alivee ^&^& goto :_FAI)
    echo>>%temp%\%1.cmd goto :_END
    echo>>%temp%\%1.cmd :_FAI
    echo>>%temp%\%1.cmd echo ALIVE  %1 - shutdown!!
    echo>>%temp%\%1.cmd title Switched On %1 in Shutdown!!
    echo>>%temp%\%1.cmd color A0
    echo>>%temp%\%1.cmd shutdown -s -f -t %T_O% -c %MSG% -m %1   ^>"%temp%\%1.log"  2^>^&1
    echo>>%temp%\%1.cmd echo %1 ALIVE, shutdown sent... at %time%  %date% ^>"%temp%\%1.log"  2^>^&1
    echo>>%temp%\%1.cmd :_END
    echo>>%temp%\%1.cmd exit
    start c:\windows\system32\cmd.exe /c "%temp%\%1.cmd"
    goto :eof

:_SHUTDOWN_ABORT
    title=%1
    echo pc interrompo lo shutdown %1   %accodaLOG%
    echo >%temp%\%1.cmd @echo off
    echo>>%temp%\%1.cmd title=%1
    echo>>%temp%\%1.cmd ping %1 -4 -n 2^|find  "TTL=" ^>nul ^&^& (echo alive ^&^& goto :_FAI)
    echo>>%temp%\%1.cmd goto :_END
    echo>>%temp%\%1.cmd :_FAI
    echo>>%temp%\%1.cmd echo ALIVE  %1 - ABORT shutdown!!
    echo>>%temp%\%1.cmd shutdown -a -m %1   ^>"%temp%\%1.log"  2^>^&1
    echo>>%temp%\%1.cmd echo %1 rem pause>>"%temp%\%1.log"
    echo>>%temp%\%1.cmd :_END
    echo>>%temp%\%1.cmd exit
    start c:\windows\system32\cmd.exe /c "%temp%\%1.cmd"
    goto :eof

:_REBOOT
    title %1
    echo >%temp%\%1.cmd @echo off
    echo>>%temp%\%1.cmd title=%1
    echo>>%temp%\%1.cmd ping %1 -4 -n %pingnum% -w %pingwait%^|find  "TTL=" ^>nul ^&^& (echo Switched On ^&^& goto :_FAI)
    echo>>%temp%\%1.cmd goto :_END
    echo>>%temp%\%1.cmd :_FAI
    echo>>%temp%\%1.cmd echo ALIVE  %1 - Ti riavvio!!
    echo>>%temp%\%1.cmd title Switched On %1 in reboot!!
    echo>>%temp%\%1.cmd color A0
    echo>>%temp%\%1.cmd shutdown -r -f -t %T_O% -c %MSG% -m %1   ^>"%temp%\%1.log"  2^>^&1
    echo>>%temp%\%1.cmd echo %1 ALIVE, Reboot sent... at %time%  %date% ^>"%temp%\%1.log"  2^>^&1
    echo>>%temp%\%1.cmd :_END
    echo>>%temp%\%1.cmd exit
    start c:\windows\system32\cmd.exe /c "%temp%\%1.cmd"
    goto :eof

:_WAIT
    if +%1+==++ goto :eof
    ping 127.0.0.1 -n %~1 1>nul  2>nul
    goto :eof

:_HELP
    echo Help
    echo shutdown/reboot list of machines
    echo.
    echo.
    echo Ex. Single Pc
    echo call :_SHUTDOWN 30.202.x.y
    echo Abort shutdown (if is in time ...) :_SHUTDOWN_ABORT
    echo call :_SHUTDOWN_ABORT 30.202.x.y
    echo Spegnimento da lista
    echo call :_SHUTDOWN_from_list "c:\pc\listPCs.txt"
    echo Abort shutdown form list
    echo call :_SHUTDOWN_ABORT_from_list  "c:\pc\listPCs.txt"
    echo reboot only PC0001
    echo call :_REBOOT PC0001
    echo Reboot all computers in the list
    echo call :_REBOOT_from_list "c:\pc\listPCs.txt"
    timeout 10

:_END

:_EOF