【问题标题】:How to update %time% variable in Batch Script如何在批处理脚本中更新 %time% 变量
【发布时间】:2015-07-24 11:32:04
【问题描述】:

我有一个用于备份数据库的批处理脚本。我将脚本启动的 %time% 回显,然后将其结束的 %time% 回显到日志文件。尽管脚本需要 5 分钟来备份我们的数据库,但结束时间与开始时间相同。

@echo off

:: Credentials preconfigured for backup-operator
net use y: \\172.16.104.201\Backups

:: Date in format YYYY.MM.DD
set DATESTAMP=%DATE:~-4%.%DATE:~3,2%.%DATE:~0,2%
set LOCAL_DIR=F:\Backups\
set EXTERN_DIR=Y:\DB3\

:: Output all to txt
>"%LOCAL_DIR%SQLBackups-%DATESTAMP%.txt" (
     echo.
     echo ------------------------------------------------------------------------------
     echo -- Starting SQL Backups %date% %time% --
     echo ------------------------------------------------------------------------------
     echo.

    :: Backup and Copy loop
    setlocal enabledelayedexpansion 
    for %%i in (
        DB1 
        DB2
        DB3
        DB4 etc...
    ) do (
        set DATABASENAME=%%i
        set BACKUPFILENAME=!LOCAL_DIR!!DATABASENAME!-!DATESTAMP!.bak
         echo.
         echo ------------------------------------------------------------------------------
         echo -- Backing Up Database !DATABASENAME! to local--
         echo ------------------------------------------------------------------------------
         echo.
        sqlcmd -E -S DB3 -d master -Q "BACKUP DATABASE [!DATABASENAME!] TO DISK = '!BACKUPFILENAME!' WITH DESCRIPTION = 'Full backup [!DATABASENAME!]', CHECKSUM, INIT, COMPRESSION"
         echo.
         echo.
         echo -- Copying !DATABASENAME! Backup to external--
        robocopy !LOCAL_DIR! !EXTERN_DIR! !DATABASENAME!-!DATESTAMP!.bak
         echo.
         echo -- !DATABASENAME! End --
         echo.
         echo.
    )
    endlocal

    :: Delete files older than -d days from local
    forfiles -p %LOCAL_DIR% -s -m *.bak -d "-180" /C "cmd /c echo @path & del @path""
    forfiles -p %LOCAL_DIR% -s -m *.txt -d "-180" /C "cmd /c echo @path & del @path""
     echo.
     echo.
     echo -- Script Complete %date% %time% --
     echo.
)
robocopy %LOCAL_DIR% %EXTERN_DIR% "SQLBackups-%DATESTAMP%.txt"
net use y: /delete

【问题讨论】:

  • 使用!date!!time!,因为你在括号中并且已经设置了延迟扩展。

标签: windows batch-file scripting cmd command-prompt


【解决方案1】:

您必须在@echo off 下方添加Setlocal EnableDelayedExpansion 并使用!time! 而不是%time% 访问时间。应该是这样的。

【讨论】:

  • 延迟扩展已设置但不用于日期和时间:)
  • 哦,你是对的。所以只需将%time 替换为!time!
【解决方案2】:

易变的变量是不可靠的。任何程序、用户或安装都可以杀死它们。使用行之有效的方法。

for /f "Delims=" %A in ('time /t') do Set MyTime=%A

一种适用于所有计算机的方法。

【讨论】:

  • 您的回答没有解决发布的问题。另外,恐怕我不明白您所说的“易失性变量不可靠”是什么意思。每天都有大量程序使用 CD、DATE、TIME、RANDOM、ERRORLEVEL 等变量,没有一个问题......
猜你喜欢
  • 2017-02-12
  • 2011-02-10
  • 2012-01-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多