Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Date 批处理文件-格式化日志记录的日期/时间_Date_Datetime_Batch File_Cmd_Timestamp - Fatal编程技术网

Date 批处理文件-格式化日志记录的日期/时间

Date 批处理文件-格式化日志记录的日期/时间,date,datetime,batch-file,cmd,timestamp,Date,Datetime,Batch File,Cmd,Timestamp,我编写了一个脚本,由任务调度器在每晚23:00执行,以使NAS01在NAS02上通电(如果尚未打开),执行一个GoodSync作业以备份NAS01,并在完成后关闭NAS02。剧本不好看,但它能完成任务。我遇到的问题是时间戳。我设置变量来设置日期和时间的格式,但是,这将只引用整个脚本中变量的时间戳。我如何保持格式,但能够得到它调用的每个点的日期和时间 从脚本中可以看到,日志文件名有日期/时间格式,日志文件中的日志记录有日期/时间格式。我的格式设置中发生了什么: 强制24小时时间 小时的前导空格替

我编写了一个脚本,由任务调度器在每晚23:00执行,以使NAS01在NAS02上通电(如果尚未打开),执行一个GoodSync作业以备份NAS01,并在完成后关闭NAS02。剧本不好看,但它能完成任务。我遇到的问题是时间戳。我设置变量来设置日期和时间的格式,但是,这将只引用整个脚本中变量的时间戳。我如何保持格式,但能够得到它调用的每个点的日期和时间

从脚本中可以看到,日志文件名有日期/时间格式,日志文件中的日志记录有日期/时间格式。我的格式设置中发生了什么:

  • 强制24小时时间
  • 小时的前导空格替换为“0”(即“6:30”变为“06:30”)
  • 对于文件名,Time-fomatting为HHMM;对于日志记录,Time-fomatting为HH:MM:SS
  • 文件名的日期格式为YYYYMMDD,日志记录的日期格式为YYYY/MM/DD
脚本:

@ECHO off
REM Change CMD window color and size.
color 37
mode 180,50

REM ### Set variables
SET IPADDRESS1=11.11.11.20
SET IPADDRESS2=10.0.3.1
SET HH=%time:~-11,2%
SET MM=%time:~-8,2%
SET SS=%time:~-5,2%
SET NAMETIMESTR=%HH: =0%%MM%
SET LOGTIMESTR=%HH: =0%:%MM%:%SS%
SET MYDATE=%DATE:~4,10%
SET NAMEDATESTR=%MYDATE:~6,4%%MYDATE:~0,2%%MYDATE:~3,2%
SET LOGDATESTR=%MYDATE:~6,4%/%MYDATE:~0,2%/%MYDATE:~3,2%
SET LOGFILE=C:\!SCRIPTS\logs\7xNAS02-GSync-%NAMEDATESTR%_%NAMETIMESTR%.txt


:START
    REM ### Checks IF 7xNAS02 is online. IF not, power it on.
    ECHO ################################################################################################################################ >> %LOGFILE%
    ECHO %LOGDATESTR% %LOGTIMESTR%  EXECUTING GSYNC SCRIPT >> %LOGFILE%
    ECHO ################################################################################################################################ >> %LOGFILE%
    ECHO.
    ECHO This is an automated script to backup the storage array on 7xNAS01 onto 7xNAS02.
    ECHO IF 7xNAS02 isn't powered on, the script will boot 7xNAS02, wait for it to come online,
    ECHO and then execute the "STORAGE" backup job in GoodSync.
    ECHO.
    ECHO %LOGDATESTR% %LOGTIMESTR%  Checking power status of 7xNAS02... >> %LOGFILE%
    ECHO Checking power status of 7xNAS02...
    ECHO.
    ping -n 1 %ipaddress1% | findstr TTL && GOTO ALREADY_ON
    ping -n 1 %ipaddress1% | findstr TTL || GOTO POWER_ON


:ALREADY_ON
    REM Sets variable to dictate that the server was already on before executing the script.
    ECHO.
    ECHO %LOGDATESTR% %LOGTIMESTR%  7xNAS02 is already powered on and available. >> %LOGFILE%
    ECHO 7xNAS02 is already powered on and available.
    ECHO.
    SET previously_off=1
    GOTO EXECUTE_BACKUP


:POWER_ON
    REM ### Powers on 7xNAS02
    ECHO %LOGDATESTR% %LOGTIMESTR%  7xNAS02 is offline. Powering on now. >> %LOGFILE%
    ECHO 7xNAS02 is offline. Powering on now.
    ECHO.
    SET previously_off=0
    PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\!SCRIPTS\7xNAS02-Power-On.ps1'" >> %LOGFILE%
    ECHO %LOGDATESTR% %LOGTIMESTR%  Pinging 7xNAS02 until it's available... >> %LOGFILE%
    ECHO Pinging 7xNAS02 until it's available...
    ECHO.
    GOTO CHECK_IF_READY


:CHECK_IF_READY
    REM ### Continually pings 7xNAS02 until it is online.

    ping -n 1 %ipaddress1% | findstr TTL || GOTO CHECK_IF_READY
    ping -n 1 %ipaddress1% | findstr TTL && GOTO EXECUTE_BACKUP


:EXECUTE_BACKUP
    REM ### Executes GoodSync backup job, "STORAGE."
    ECHO %LOGDATESTR% %LOGTIMESTR%  Executing "STORAGE" backup job. >> %LOGFILE%
    ECHO Executing "STORAGE" backup job.
    ECHO.
    C:\"Program Files"\"Siber Systems"\Goodsync\gsync sync "STORAGE" >> %LOGFILE%
    IF %previously_off% == 0 (
        ECHO.
        ECHO %LOGDATESTR% %LOGTIMESTR%  Sync job done. Shutting down 7xNAS02... >> %LOGFILE%
        ECHO Sync job done. Shutting down 7xNAS02...
        shutdown /m \\7xNAS02 /s /f /d p:0:0 /c "Executed by 7xNAS02-GSync-Script on 7xNAS01."
        GOTO SHUTDOWNCHECK

    )
    IF %previously_off% == 1 (
        ECHO.
        ECHO %LOGDATESTR% %LOGTIMESTR%  Sync job done. 7xNAS02 will stay powered on. >> %LOGFILE%
        ECHO Sync job done. 7xNAS02 will stay powered on.
        ECHO.
    )
    GOTO END


:SHUTDOWNCHECK
    ping -n 5 %ipaddress1% >nul
    IF ERRORLEVEL 1 (
        REM ### 7xNAS02 has powered off.
        ECHO.
        ECHO %LOGDATESTR% %LOGTIMESTR%  7xNAS02 has powered off. >> %LOGFILE%
        ECHO 7xNAS02 has powered off.
        GOTO END
    )
    REM ### 7xNAS02 is still on. Looping to check IF the server has shut down.
    ECHO ...
    GOTO SHUTDOWNCHECK  


:END
    REM pause
    ECHO %LOGDATESTR% %LOGTIMESTR%  END OF SCRIPT >> %LOGFILE%
    exit
编辑:感谢@Mofi,更新的工作脚本如下

@ECHO off
REM Change CMD window color and size.
color 37
mode 180,50

REM ### Set variables
SET IPADDRESS1=11.11.11.20
SET IPADDRESS2=10.0.3.1
CALL :GETDATETIME
SET LOGFILE=C:\!SCRIPTS\logs\7xNAS02-GSync-%NAMEDATESTR%_%NAMETIMESTR%.txt


:START
    REM ### Checks IF 7xNAS02 is online. IF not, power it on.
    ECHO ################################################################################################################################ >> %LOGFILE%
    CALL :GETDATETIME
    ECHO %LOGDATESTR% %LOGTIMESTR%  EXECUTING GSYNC SCRIPT >> %LOGFILE%
    ECHO ################################################################################################################################ >> %LOGFILE%
    ECHO/
    ECHO This is an automated script to backup the storage array on 7xNAS01 onto 7xNAS02.
    ECHO IF 7xNAS02 isn't powered on, the script will boot 7xNAS02, wait for it to come online,
    ECHO and then execute the "STORAGE" backup job in GoodSync.
    ECHO/
    CALL :GETDATETIME
    ECHO %LOGDATESTR% %LOGTIMESTR%  Checking power status of 7xNAS02... >> %LOGFILE%
    ECHO Checking power status of 7xNAS02...
    ECHO/
    ping -n 1 %ipaddress1% | findstr TTL && GOTO ALREADY_ON
    ping -n 1 %ipaddress1% | findstr TTL || GOTO POWER_ON


:ALREADY_ON
    REM Sets variable to dictate that the server was already on before executing the script.
    ECHO/
    CALL :GETDATETIME
    ECHO %LOGDATESTR% %LOGTIMESTR%  7xNAS02 is already powered on and available. >> %LOGFILE%
    ECHO 7xNAS02 is already powered on and available.
    ECHO/
    SET previously_off=1
    GOTO EXECUTE_BACKUP


:POWER_ON
    REM ### Powers on 7xNAS02
    CALL :GETDATETIME
    ECHO %LOGDATESTR% %LOGTIMESTR%  7xNAS02 is offline. Powering on now. >> %LOGFILE%
    ECHO 7xNAS02 is offline. Powering on now.
    ECHO/
    SET previously_off=0
    PowerShell -NoProfile -ExecutionPolicy Bypass -Command "& 'C:\!SCRIPTS\7xNAS02-Power-On.ps1'" >> %LOGFILE%
    CALL :GETDATETIME
    ECHO %LOGDATESTR% %LOGTIMESTR%  Pinging 7xNAS02 until it's available... >> %LOGFILE%
    ECHO Pinging 7xNAS02 until it's available...
    ECHO/
    GOTO CHECK_IF_READY


:CHECK_IF_READY
    REM ### Continually pings 7xNAS02 until it is online.

    ping -n 1 %ipaddress1% | findstr TTL || GOTO CHECK_IF_READY
    ping -n 1 %ipaddress1% | findstr TTL && GOTO EXECUTE_BACKUP


:EXECUTE_BACKUP
    REM ### Executes GoodSync backup job, "STORAGE."
    CALL :GETDATETIME
    ECHO %LOGDATESTR% %LOGTIMESTR%  Executing "STORAGE" backup job. >> %LOGFILE%
    ECHO Executing "STORAGE" backup job.
    ECHO/
    C:\"Program Files"\"Siber Systems"\Goodsync\gsync sync "STORAGE" >> %LOGFILE%
    IF %previously_off% == 0 (
        ECHO/
        CALL :GETDATETIME
        ECHO %LOGDATESTR% %LOGTIMESTR%  Sync job done. Shutting down 7xNAS02... >> %LOGFILE%
        ECHO Sync job done. Shutting down 7xNAS02...
        shutdown /m \\7xNAS02 /s /f /d p:0:0 /c "Executed by 7xNAS02-GSync-Script on 7xNAS01."
        GOTO SHUTDOWNCHECK

    )
    IF %previously_off% == 1 (
        ECHO/
        CALL :GETDATETIME
        ECHO %LOGDATESTR% %LOGTIMESTR%  Sync job done. 7xNAS02 will stay powered on. >> %LOGFILE%
        ECHO Sync job done. 7xNAS02 will stay powered on.
        ECHO/
    )
    GOTO END


:SHUTDOWNCHECK
    ping -n 5 %ipaddress1% >nul
    IF ERRORLEVEL 1 (
        REM ### 7xNAS02 has powered off.
        ECHO/
        CALL :GETDATETIME
        ECHO %LOGDATESTR% %LOGTIMESTR%  7xNAS02 has powered off. >> %LOGFILE%
        ECHO 7xNAS02 has powered off.
        GOTO END
    )
    REM ### 7xNAS02 is still on. Looping to check IF the server has shut down.
    ECHO ...
    GOTO SHUTDOWNCHECK  


:END
    REM pause
    CALL :GETDATETIME
    ECHO %LOGDATESTR% %LOGTIMESTR%  END OF SCRIPT >> %LOGFILE%
    exit


:GETDATETIME
    SET "HH=%time:~-11,2%"
    SET "MM=%time:~-8,2%"
    SET "SS=%time:~-5,2%"
    SET "NAMETIMESTR=%HH: =0%%MM%"
    SET "LOGTIMESTR=%HH: =0%:%MM%:%SS%"
    SET "MYDATE=%DATE:~4,10%"
    SET "NAMEDATESTR=%MYDATE:~6,4%%MYDATE:~0,2%%MYDATE:~3,2%"
    SET "LOGDATESTR=%MYDATE:~6,4%/%MYDATE:~0,2%/%MYDATE:~3,2%"
    GOTO :EOF

使用依赖于区域但访问速度更快的
日期
时间
环境变量的一个简单解决方案是使用子例程

在最后一个命令
exit
之后,将以下行追加到批处理文件的末尾:

:GetDateTime
SET "HH=%time:~-11,2%"
SET "MM=%time:~-8,2%"
SET "SS=%time:~-5,2%"
SET "NAMETIMESTR=%HH: =0%%MM%"
SET "LOGTIMESTR=%HH: =0%:%MM%:%SS%"
SET "MYDATE=%DATE:~4,10%"
SET "NAMEDATESTR=%MYDATE:~6,4%%MYDATE:~0,2%%MYDATE:~3,2%"
SET "LOGDATESTR=%MYDATE:~6,4%/%MYDATE:~0,2%/%MYDATE:~3,2%"
GOTO :EOF
这是子例程
GetDateTime
。并删除批处理文件顶部的行,这些行也设置了这些环境变量

在每行上方使用
LOGDATESTR
LOGTIMESTR
插入行:

CALL :GetDateTime
在命令提示窗口中运行
call/?
,了解有关此方法的详细信息,以在批处理文件中嵌入批处理文件并将其作为子例程调用


还有一个提示:建议使用
echo/
而不是
echo。
,请参阅DosTips论坛主题:

谢谢!这正是我所需要的,我感谢大家对“回声”的关注。我测试并确认了它的工作原理。