Split

后端 未结 9 1222
感情败类
感情败类 2020-11-29 12:37

Is there a way to split the %date% in a batch file (say, in 3 environment variables), but regardless of Regional Settings? Today\'s date would be 3/13/201

相关标签:
9条回答
  • 2020-11-29 13:09

    Four years have passed, but this question doesn't get old, and I think now there's a slightly better answer than using wmic (on win7 onwards).

    for /F "tokens=1,2,3 delims=_" %%i in ('PowerShell -Command "& {Get-Date -format "MM_dd_yyyy"}"') do (
        set MONTH=%%i
        set DAY=%%j
        set YEAR=%%k
    )
    echo %MONTH% %DAY% %YEAR%
    

    With powershell Get-Date you can fine-tune the format you want (short,long, numbers,names,etc..). In this example "MM_dd_yyyy" will get you a numeric date with leading zeros in case of single digit months or days

    0 讨论(0)
  • 2020-11-29 13:09

    I've reworked sashoalm's version to take care of the suppressed-leading-zero situation:

    @Echo OFF
    SETLOCAL
    If "%Date%A" LSS "A" (Set _NumTok=1-3) Else (Set _NumTok=2-4)
    :: Default Delimiter of TAB and Space are used
    For /F "TOKENS=2*" %%A In ('REG QUERY "HKCU\Control Panel\International" /v iDate') Do Set _iDate=%%B
    For /F "TOKENS=2*" %%A In ('REG QUERY "HKCU\Control Panel\International" /v sDate') Do Set _sDate=%%B
    IF %_iDate%==0 For /F "TOKENS=%_NumTok% DELIMS=%_sdate% " %%F In ("%Date%") Do CALL :procdate %%H %%F %%G
    IF %_iDate%==1 For /F "TOKENS=%_NumTok% DELIMS=%_sdate% " %%F In ("%Date%") Do CALL :procdate %%H %%G %%F
    IF %_iDate%==2 For /F "TOKENS=%_NumTok% DELIMS=%_sdate% " %%F In ("%Date%") Do CALL :procdate %%F %%G %%H
    endlocal&SET YYYYMMDD=%YYYYMMDD%
    GOTO :eof
    
    ::
    :: Date elements are supplied in Y,M,D order but may have a leading zero
    ::
    :procdate
    :: if single-digit day then 1%3 will be <100 else 2-digit
    IF 1%3 LSS 100 (SET YYYYMMDD=0%3) ELSE (SET YYYYMMDD=%3)
    :: if single-digit month then 1%2 will be <100 else 2-digit
    IF 1%2 LSS 100 (SET YYYYMMDD=0%2%YYYYMMDD%) ELSE (SET YYYYMMDD=%2%YYYYMMDD%)
    :: Similarly for the year - I've never seen a single-digit year
    IF 1%1 LSS 100 (SET YYYYMMDD=20%YYYYMMDD%) ELSE (SET YYYYMMDD=%1%YYYYMMDD%)
    GOTO :eof
    

    returning YYYYMMDD - substring at your will.

    Interestingly, inserting after SETLOCAL

    IF NOT "%1"=="" set date=%1
    

    will allow any date in the local sequence (without the dayname) to be decoded to YYYYMMDD (but be careful that 19xx dates provided with the yy form will appear as 20xx - easily compensated-for if you find it necessary)

    0 讨论(0)
  • 2020-11-29 13:09

    REG QUERY is not sufficient, if sShortDate was set to something like dd yy. Use REG ADD:

    @echo off &setlocal
    for /f "tokens=2*" %%a in ('reg query "HKCU\Control Panel\International" /v sShortDate^|find "REG_SZ"') do set "ssShortDate=%%b"
    reg add "HKCU\Control Panel\International" /f /v sShortDate /d "dd MM yyyy" >nul
    set "cdate=%date%"
    reg add "HKCU\Control Panel\International" /f /v sShortDate /d "%ssShortDate%" >nul
    for /f "tokens=1-3" %%i in ("%cdate%") do set "day=0%%i"&set "month=0%%j"&set "year=%%k"
    set "day=%day:~-2%"
    set "month=%month:~-2%"
    echo.%day%.%month%.%year%
    endlocal
    
    0 讨论(0)
提交回复
热议问题