【问题标题】:Cannot use escape character in batch stript不能在批处理脚本中使用转义字符
【发布时间】:2022-01-08 21:29:35
【问题描述】:

我的批处理脚本中有以下行,并尝试在日期之间使用点(“.”)而不是连字符(“-”)。但是,虽然以下工作(使用“-”):

Set TODAY=%date:~4,2%-%date:~7,2%-%date:~10,4%

当我改为点(“.”)时,它不起作用:

Set TODAY=%date:~4,2%.%date:~7,2%.%date:~10,4%

我在点之前尝试了几个转义字符,例如\.,但不起作用。有什么想法吗?

更新:这是使用TODAY 变量的行:

rar a -r -ep1 %backup%\"%name%_%today%" %folder%

更新:这是我使用的代码:

@echo off

setlocal

REM Specify the folder to compress below:

REM --------------------- Folder to compress -----------------------------------
set dir="D:\project\my-project\"
set name=my-project
set backup="D:\backup\project\"
set folder="D:\dev\project\my-project"
REM If you don't want to include the folder in backup file, add "\" at the end of the directory in folder param

REM ----------------------------------------------------------------------------
REM Path to WinRAR executable in Program Files. Change if location is different
REM ---------------------- WinRAR Directory ------------------------------------
set path="C:\Progra~2\WinRAR\WinRAR.Exe";%path%
REM ----------------------------------------------------------------------------

REM change working dir to dir specified above
cd %dir%

REM Replace space in hour with zero if it's less than 10
SET hr=%time:~0,2%
IF %hr% lss 10 SET hr=0%hr:~1,1%

REM This sets the date like this: mm-dd-yr-hhmmssss (includes 1/100 secs)
Set TODAY=%date:~10,4%-%date:~7,2%-%date:~4,2%_%hr%%time:~3,2%^%time:~6,2%%time:~9,2%

echo Folder to compress in *.RAR format:
echo %folder%
echo.
echo.

echo Compress all files in dir and subdirs into a single archive
echo.
echo.

echo Today's date and time will be added to the base filename

rar a -r -ep1 %backup%\"%name%_%today%" %folder%

pause
goto eof
endlocal

echo.
echo "Task Completed"
echo.

REM --------------------------- exit -----------------------------------------
:end
EXIT /B 0

【问题讨论】:

    标签: batch-file


    【解决方案1】:

    如果您在命令提示符处输入 echo %date% 时当前报告的日期字符串是 dd.MM.yyyy 并且您希望它是 yyyy.MM.dd,那么应该执行以下操作:

    @Set "TODAY=%DATE%"
    @Set "TODAY=%TODAY:~-4%%TODAY:~-8,4%%TODAY:~-10,2%"
    @Echo %TODAY%
    

    然而,正如我已经在我的 cmets 中所述,现在都被错误地删除了,尽管其中没有任何内容是无益或粗鲁的,这只能保证在任何报告日期的计算机上都可以工作以dd<separator>MM<separator>yyyy 结尾的格式。要以适用于任何现代计算机的格式获取日期,您需要获得内置程序或实用程序的帮助。 Gerhard 提供了一种使用 powershell.exe 的方法,所以这里是使用 WMIC.exe 的方法:

    @For /F "Delims==" %%G In ('"(Set strDate) 2>NUL"') Do @Set "%%G="
    @For /F "EOL=L" %%G In (
        '%SystemRoot%\System32\wbem\WMIC.exe OS Get LocalDateTime 2^>NUL'
    ) Do @For %%H In (%%~nG) Do @Set "strDateTime=%%H"
    @If Not Defined strDateTime GoTo :EOF
    @Set "strDate=%strDateTime:~,4%.%strDateTime:~4,2%.%strDateTime:~6,2%"
    @Echo %strDate%
    

    [编辑/]

    如果您的代码更改了日期格式并将新字符串定义为 %TODAY%,就像在您的第一个示例命令行中一样:

    Set TODAY=%date:~4,2%-%date:~7,2%-%date:~10,4%
    

    并且您想稍后在脚本中将连字符更改为句点,然后您可以使用:

    Echo %TODAY:-=.%
    

    或重新定义该变量值字符串:

    Set "TODAY=%TODAY:-=.%"
    

    [EDIT2 /]

    调整您的最新编辑,(删除所有臃肿),以及我上面的初始代码,以合并您所需的 TIME 字符串并使用像这样的格式,yyyy.MM.dd_hh.mm.ss.##,其中##是百分之一秒,(向下取整)

    @Echo Off
    SetLocal EnableExtensions
    
    Set "dir=D:\project\my-project"
    Set "name=my-project"
    Set "backup=D:\backup\project"
    Set "folder=D:\dev\project\my-project"
    Set "RarPath=C:\Program Files\WinRAR"
    
    CD /D "%dir%" 2>NUL || Exit /B 1
    
    Set "}="
    For /F "EOL=L" %%G In ('%SystemRoot%\System32\wbem\WMIC.exe OS Get LocalDateTime 2^>NUL') Do For /F %%H In ("%%G") Do Set "}=%%H"
    If Not Defined } Exit /B 1
    
    %RarPath%\rar.exe a -ep1 -r "%backup%\%name%_%}:~,4%.%}:~4,2%.%}:~6,2%_%}:~8,2%.%}:~10,2%.%}:~12,5%" "%folder%"
    Pause
    Exit /B 0
    

    【讨论】:

      【解决方案2】:

      我决定添加一个新答案,因为根据您最近的编辑,您没有必要尝试将日期格式重新创建为变量。您需要做的就是阅读并理解您正在使用的rar.exe 命令行实用程序的可用选项。这些可通过使用其-? 选项获得。例如rar.exe -?.

      根据该信息,您只需使用其-ag 选项:

      rar.exe a -agYYYY.MM.DD -ep1 "%backup%\%name%_" "%folder%"
      

      上面的示例假定您没有在分配给%folder% 的字符串末尾添加反斜杠或文件掩码。

      如果您在%folder% 字符串值的末尾分配了反斜杠或文件掩码,那么您将使用:

      rar.exe a -agYYYY.MM.DD -ep1 -r "%backup%\%name%_" "%folder%"
      

      [编辑/]

      要合并时间,就像您最近提交的一样,(但不是毫无意义和不必要的百分之一秒),只需扩展 -ag 选项字符串:

      rar.exe a -agMM.DD.YYYY_HHMMSS -ep1 -r "%backup%\%name%_" "%folder%"
      

      【讨论】:

        【解决方案3】:

        尝试格式化%date% 变量根本不可靠。将其迁移到具有不同区域设置的另一台电脑后,或者如果您的日期格式发生任何变化,您最终会得到损坏的结果。

        更好的解决方案是简单地使用powershell 为您格式化结果。

        @echo off
        for /f %%i in ('powershell get-date -format "yyyy.mm.dd"') do set "today=%%i"
        echo %today%
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-04-05
          • 1970-01-01
          • 2014-10-21
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多