Dividere %data% in un file batch, indipendentemente dalle Impostazioni internazionali

C’è un modo per dividere il %date% in un file batch (ad esempio, in 3 variabili di ambiente), ma indipendentemente dalle Impostazioni internazionali? La data di oggi sarebbe 3/13/2013 per NOI, ma con le mie Impostazioni internazionali è 13.3.2013il delimitatore è cambiato e l’ordine.

Questa è un’ottima domanda. Stavo pensando di delimitazione dei numeri, ma che non avrebbe funzionato… ho bisogno di pensare a questo.
Grazie. Sto cercando su Internet proprio ora credo di aver trovato qualcosa, ma non mi piace come si usa REG QUERY. forums.techguy.org/dos-other/…
Penso che ci siano due modi si può fare questo. 1. Si può fare cumuli di sottostringhe e controlli incrociati di loro per determinare come visualizzare o 2. È possibile in qualche modo accedere alle impostazioni internazionali e passare da lì.
Ahah! Guardare qui!
Un piccolo problema minore è che WMIC non è incluso con XP Home…

OriginaleL’autore sashoalm | 2013-03-13

10 Replies
  1. 4

    Si può fare utilizzando wmic (ma WMIC non è incluso con XP Home):

    @ECHO OFF
    :: Check WMIC is available
    WMIC.EXE Alias /? >NUL 2>&1 || GOTO s_error
    
    :: Use WMIC to retrieve date and time
    FOR /F "skip=1 tokens=1-6" %%G IN ('WMIC Path Win32_LocalTime Get Day^,Hour^,Minute^,Month^,Second^,Year /Format:table') DO (
       IF "%%~L"=="" goto s_done
          Set _yyyy=%%L
          Set _mm=00%%J
          Set _dd=00%%G
          Set _hour=00%%H
          SET _minute=00%%I
    )
    :s_done
    
    :: Pad digits with leading zeros
          Set _mm=%_mm:~-2%
          Set _dd=%_dd:~-2%
          Set _hour=%_hour:~-2%
          Set _minute=%_minute:~-2%
    
    :: Display the date/time in ISO 8601 format:
    Set _isodate=%_yyyy%-%_mm%-%_dd% %_hour%:%_minute%
    Echo %_isodate%
    
    GOTO:EOF
    
    :s_error
    Echo GetDate.cmd
    Echo Displays date and time independent of OS Locale, Language or date format.
    Echo Requires Windows XP Professional, Vista or Windows 7
    Echo.
    Echo Returns 6 environment variables containing isodate,Year,Month,Day,hour and minute.
    

    E si può fare da l’analisi della data di comando alla ricerca di ciò che il formato della data corrente è necessario per essere.

    Il primo link indica, potrebbe essere necessario modificare il codice nella seconda, su Win7, per gestire un paio di rughe intorno di data breve/lunga data forma.

    Grazie per il link per “l’analisi della data di comando” (robvanderwoude.com/amb_datetime.php)

    OriginaleL’autore azhrei

  2. 3

    Sono passati quattro anni, ma questa domanda non ottiene vecchio, e credo che ora ci sia un po ‘ migliore risposta rispetto all’utilizzo di wmic (su win7 in poi).

    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%
    

    Con powershell Get-Date è possibile regolare il formato desiderato (corto,lungo, numeri,nomi,ecc..). In questo esempio “Hh_mm” ti numerico data con zeri iniziali in caso di singola cifra mesi o giorni

    Così pulito. molto utile.

    OriginaleL’autore Federico Destefanis

  3. 2

    Ho rielaborato sashoalm‘s versione di prendersi cura della soppressa-leading-zero situazione:

    @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
    

    ritorno AAAAMMGG – sottostringa.

    È interessante notare che, dopo l’inserimento di SETLOCAL

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

    permetterà a qualsiasi data nel locale sequenza (senza dayname) per essere decodificati per AAAAMMGG (ma attenzione che 19xx date fornito con l’aa forma apparirà come 20xx – facilmente compensato per se è necessario)

    Questo non funziona, se l’utente imposta il formato della data nel pannello di controllo di windows, per esempio, dd yy (uscita dal tuo codice è: 13130).
    Qual è la soppressa-leading-zero situazione?
    @mfm4aa Perché dd yy è un formato thay è possibile impostare, ma non ha senso.
    @sashoalm Il formato utilizzare per l’ %data% variabile è il formato di data breve. Control Panel>Region and Language>Additional Settings>Date tab – si può inserire il formato che verranno segnalati. Se si immette d poi il numero del giorno è mostrato come una sola cifra per 1..9. Se si immette dd quindi un leading-zero sarà aggiunto per 1..9. Idem per mese con m contro mm. Diverse persone utilizzano formati diversi…
    Questo perché mm aa è anche un formato senza dubbio uno dei tanti – che è possibile impostare, ma non ha senso

    OriginaleL’autore Magoo

  4. 2

    Provare questo: Set_date.cm

    @echo off&goto :start
    :Set_Date DateEnv [Date] or [/p="Prompt for Date: "] [/r]
    echo.
    echo.Usage: Set_Date.cmd DateEnv [Date] or [/p="Prompt for Date: "]
    echo.Populates date variables labeled: 'DateEnv_???', see below
    echo.Accepted date formats:
    echo.        m-d-y, m/d/y, yyyymmdd, dd-Mon-yy or 7 digit julian date
    echo.        If "%%date%%" is passed as the 2nd arg it will be interpreted
    echo.        according to the current regional date setting ie. day dd/mm/yyyy
    echo.        If /r is passed then the date contained in the DateEnv variable
    echo.        and/or the [Date] argument will be interpreted in regional format
    echo.        The /r option should be placed at the end of the list if used
    echo.        The /r option should only be used if date input is not included
    echo.        in one of the default listed formats or unexpected consequences...
    echo.
    echo.DateEnv, if passed alone may be a valid defined date variable or if
    echo.undefined then todays date will be used to populate the variables
    echo.Two digit years input 'XX' are interpreted as the year '20XX'
    echo.Valid dates must be in the year 1601 or greater for the validity check
    echo.Returns 0 in errorlevel if the date is valid, else non-zero
    echo.
    echo.If DateEnv is valid or if [Date] is passed DateEnv_??? will be set to:
    echo.DateEnv_mdy will be set to mm-dd-yyyy
    echo.DateEnv_ymd will be set to yyyymmdd
    echo.DateEnv_y.m.d will be set to yyyy.mm.dd
    echo.DateEnv_dte will be set to the current active regional date format
    echo.DateEnv_jul will be set to the 7 digit Julian date
    echo.DateEnv_dow will be set to day of week, ie. Monday, Tuesday, etc.
    echo.DateEnv_vrb will be set to Verbose Date, ie. Saturday, August 20th, 2011
    echo.DateEnv_dd will be set to the 2 digit day
    echo.DateEnv_mm will be set to the 2 digit month
    echo.DateEnv_yyyy will be set to the 4 digit year
    echo.DateEnv_month will be set to the month, ie. February or December
    echo.DateEnv_mon will be set to the 3 letter month, ie. Jan or Aug
    echo.
    echo.DateEnv itself will not be changed regardless if its a valid date or not
    echo.Also formats yyyymmdd or 7 digit julian date input to desired output
    echo.Example: Set_Date today "%%date%%" or Set_Date newyear99 01-Jan-99
    echo.
    echo.Finally:
    echo.If DateEnv is not defined and there is no second argument then %%date%% in
    echo.the current regional format will be used to populate the variables
    echo.If /p is passed as 2nd argument then quoted 3rd argument will prompt for date
    echo.
    echo.Examples:
    echo.         set "AprilsFools=4/1/1"
    echo.         set_date AprilFools
    echo.         echo Aprils fools date for 2001 in Julian format is: %%AprilFools_jul%%
    echo.         echo Aprils fools date in 2001 was on a %AprilFools_dow% ^(Sunday^)
    echo.         Set_Date birthday /p="Enter your birth date: "
    echo.         ECHO You were born on a %%birthday_dow%%
    echo.         set "today="
    echo.         Set_Date today
    echo.         echo today is %%today_dte%% or %%today_jul%% in Julian format
    echo.
    echo.If the '/p' option is used then the _GetString.cmd routine must be in the PATH
    echo.         or else set/p routine will ask for date with no validity checking
    exit /b 1
    
    :start
    set "jul="&set "Format="&set "Sep="&set "reg="
    if "%~1"=="" exit /b 255
    if /i "%~1" equ "/?" goto :Set_Date Syntax
    SetLocal EnableDelayedExpansion
    echo %*|find /i "/r">nul
    if %errorlevel% equ 0 set/a reg=1&if /i "%~1" equ "/r" shift
    if defined %~1 (call set jul=%%%~1%%) else (
      if "%~2"=="" set "jul=%date%"
    )
    if not "%~2"=="" (
      if /i "%~2" neq "/r" (
        set "jul=%~2"&set "args=%~3"
      )
    ) else (if not defined %~1 set/a reg=1)
    call :RegDateFmt Format Separator yy mm dd jul
    if %errorlevel% neq 0 goto :BadDate
    if /i "%~2" equ "%date%" set/a reg=1
    if defined reg (
      set "jul=!mm!-!dd!-!yy!"
    )
    if /i "%jul%" equ "/p" (
      call :_GetString.cmd "%args%" jul /d
      if !errorlevel! gtr 0 goto :BadDate
    ) else if /i "%jul:~0,1%" gtr "9" (
      if defined args set "jul=%jul% %args%"
      set "jul=!jul:* =!"
    ) else if /i "%jul:~3,1%" gtr "9" (
      set "Mon=%jul:~3,3%"
      call :month_convert Mon
      if !errorlevel! gtr 0 goto :BadDate
      set "jul=!Mon!-%jul:~0,2%-%jul:~-2%"
    )
    set mdy=%jul:/=%
    set mdy=%mdy:-=%
    if /i %mdy% equ %jul% (
      call :strlen %mdy%
      if /i !errorlevel! equ 7 ( 
        call :date_cvt mdy /j
      ) else (call :date_cvt jul /j)
    ) else (call :date_cvt jul /j)
    if /i %errorlevel% equ 0 (
      set/a mdy=%jul%
      set/a dow=%jul% %% 7&call :set_day dow
    ) else (goto :BadDate)
    call :date_cvt mdy /j
    set "vrb=%mdy%"
    call :format_verbose vrb dow month
    set/a ymd=%errorlevel%
    set "mon=%month:~0,3%"
    set/a dte=%ymd%
    call :setRegDate dte Format Separator dow mon
    if /i %errorlevel% gtr 0 goto :BadDate
    Endlocal&(
      call set "%~1_mdy=%mdy%"&call set "%~1_ymd=%ymd%"&call set "%~1_jul=%jul%"
      call set "%~1_vrb=%vrb%"&call set "%~1_dow=%dow%"&call set "%~1_dd=%ymd:~-2%"
      call set "%~1_mm=%mdy:~0,2%"&call set "%~1_yyyy=%ymd:~0,4%"
      call set "%~1_mon=%mon%"&call set "%~1_yy=%ymd:~2,2%"&call set "%~1_dte=%dte%"
      call set "%~1_y.m.d=%ymd:~0,4%.%mdy:~0,2%.%ymd:~-2%"&call set "%~1_month=%month%"
      exit /b 0
    )
    :BadDate
    Endlocal&(
      call set "%~1_mdy="&call set "%~1_ymd="&call set "%~1_dte="&call set "%~1_jul="
      call set "%~1_vrb="&call set "%~1_dow="&call set "%~1_vrb="&call set "%~1_y.m.d="
      call set "%~1_month="
    )&exit /b %errorlevel%
    
    ::**********************************::
    ::*******||  SUBROUTINES   ||*******::
    ::**********************************::
    
    :set_day
    SetLocal&call set/a tkn=%%%~1%%+1
    for /f "tokens=%tkn%" %%a in ("Monday Tuesday Wednesday Thursday Friday Saturday Sunday") do (
      set "dayofwk=%%a"
    )
    EndLocal&call set %~1=%dayofwk%&exit /b 1
    
    :Date_Cvt DateEnv [/Julian] Date_env is converted
    if "%~1"=="" exit /b 1
    SetLocal&call set "mdy=%%%~1%%"
    set ech=&set "arg="
    if not "%~2"=="" (set arg=%~2&set arg=!arg:~0,2!)
    xcopy /d:%mdy% /h /l "%~f0" "%~f0\">nul 2>&1
    if /i %errorlevel% equ 0 (
      for /f "tokens=1-3 delims=/- " %%a in ("%mdy%") do (
        set m=%%a&set d=%%b&set "y=%%c"
        if /i 1!m! lss 20 set "m=0!m!"
        if /i 1!d! lss 20 set "d=0!d!"
        if /i 1!y! lss 20 set "y=0!y!"
        if /i !y! lss 80 (set y=20!y!) else (if !y! lss 100 set y=19!y!)
        set "mdy=!m!-!d!-!y!"
      )
    ) else (
      set /a rc=1
      for /f "tokens=1-3 delims=0123456789" %%a in ("%mdy%") do set "rc=%%a"
      if /i !rc! neq 1 set /a err=2&goto :end
      call :strlen %mdy%
      if /i !errorlevel! gtr 8 set /a err=3&goto :end
    )
    set "mdy=%mdy:/=-%"
    set "ymd=%mdy:-=%"
    if %ymd%==%mdy% (
      call :strlen %ymd%
      set /a err=!errorlevel!
      if /i !err! equ 7 if /i "%arg%" equ "/j" (
        call :gdate %ymd%
        set /a ymd=!errorlevel!
        set /a err=8&set "arg="
      )
      if /i !err! neq 8 goto :end
      set mdy=!ymd:~4,2!-!ymd:~6,2!-!ymd:~0,4!&set "ech=!mdy!"
    ) else (
      set ymd=%ymd:~4,4%%ymd:~0,4%&set "ech=!ymd!"
    )
    xcopy /d:%mdy% /h /l "%~f0" "%~f0\">nul 2>&1
    set /a err=%errorlevel%
    if /i %err% neq 0 (set ech=)
    if /i %err% equ 0 if /i "%arg%" equ "/j" (
      call :jdate %ymd%
      set /a ech=!errorlevel!
    )
    :end
    EndLocal&call set "%~1=%ech%"&exit /b %err%
    
    :Strlen Returns length of string in errorlevel
    setlocal&set "#=%*"
    if not defined # exit /b 0
    set/a len=0
    :loop
    set/a len+=1
    set "#=!#:~1!"&if not defined # endlocal&exit/b %len%
    goto :loop
    
    :jdate
    SetLocal
    set "yyyymmdd=%~1"
    set "yyyy=%yyyymmdd:~0,4%"
    set "mm=%yyyymmdd:~4,2%"
    set "dd=%yyyymmdd:~6,2%"
    if %mm:~0,1% equ 0 set "mm=%mm:~1%"
    if %dd:~0,1% equ 0 set "dd=%dd:~1%"
    set /a Month1=(%mm%-14)/12
    set /a Year1=%yyyy%+4800
    set /a JDate=1461*(%Year1%+%Month1%)/4+367*(%mm%-2-12*%Month1%)^
                 /12-(3*((%Year1%+%Month1%+100)/100))/4+%dd%-32075
    EndLocal&exit /b %JDate%
    
    :gdate
    SetLocal
    set /a p      = %1 + 68569
    set /a q      = 4 * %p% /146097
    set /a r      = %p% - ( 146097 * %q% +3 ) /4
    set /a s      = 4000 * ( %r% + 1 ) /1461001
    set /a t      = %r% - 1461 * %s% /4 + 31
    set /a u      = 80 * %t% /2447
    set /a v      = %u% /11
    set /a GYear  = 100 * ( %q% - 49 ) + %s% + %v%
    set /a GMonth = %u% + 2 - 12 * %v%
    set /a GDay   = %t% - 2447 * %u% /80
    if /i 1%GMonth% lss 20 set "GMonth=0%GMonth%"
    if /i 1%GDay%   lss 20 set "GDay=0%GDay%"
    set "GDate=%GYear%%GMonth%%GDay%"
    EndLocal&exit /b %GDate%
    
    :Format_Verbose M/D/Y dayofweek to verbose date
    SetLocal&call set "dte=%%%~1%%"
    set "dow=%%%~2%%"
    set "st="
    set "day=%dte:~3,2%"
    set "mon=%dte:~0,2%"
    set "year=%dte:~6,4%"
    set "ymd=%year%%mon%%day%"
    set "dy=%day:~1%"
    if %day:~0,1% equ 0 set "day=%day:~1%"
    if %mon:~0,1% equ 0 set "mon=%mon:~1%"
    set months=January February March April May June^
     July August September October November December
    for /f "tokens=%mon%" %%a in ("%months%") do set "month=%%a"
    if /i %dy% equ 0 set "st=th"
    if /i %dy% gtr 3 set "st=th"
    if /i %day% geq 11 if /i %day% leq 13 set "st=th"
    if defined st goto :end
    set/a rst=%day% %% 10
    for /f "tokens=%rst%" %%s in ("st nd rd") do set "st=%%s"
    :end
    set "dow=%dow%, %month% %day%%st%, %year%"
    EndLocal&call set %~1=%dow%&call set %~3=%month%&exit /b %ymd%
    
    :_GetString.cmd
    set p0=%0&set "p0=!p0:~1!"
    if not exist _GetString.cmd (
      call :checkpath %p0%
      if !errorlevel! neq 0 (
        set/p %~2="%~1"
        exit/b 0
      )
    )
    call _GetString.cmd "%~1" %~2 %~3
    exit/b %errorlevel%
    
    :checkpath
    if exist "%~$PATH:1" exit/b 0
    exit/b 1
    
    :RegDateFmt Format Separator y m d dte
    if "%~2"=="" exit/b 1
    setlocal EnabledelayedExpansion
    set "Day="&set "Mon="&set "dte="
    if not "%~6"=="" set "dte=!%~6!"
    if not defined dte set "dte=%date%"
    for /f "tokens=2 delims=:" %%A in ('date^<nul') do set Format=%%A&goto :next
    :next
    set "Format=%Format: =%"
    for %%A in (/- . ,) do (
      echo %Format%|find "%%A">nul&if !errorlevel! equ 0 set "Separator=%%A"
    )
    if /i %Format:~0,1% gtr 9 set "Day=Day "
    for /f "skip=1 tokens=2-4 delims=(-)" %%a in ('date^<nul') do (
      set "Format=%Day%%%a%Separator%%%b%Separator%%%c"
      for /f "tokens=1-3 delims=.-/" %%d in ("%dte:* =%") do (
        set %%a=%%d&set %%b=%%e&set "%%c=%%f"
        echo !yy:~3!|find "ECHO">nul
        if /i "!errorlevel!" neq "0" set "Format=!Format:yy=yyyy!"
        if /i "!mm:~0,1!" gtr "9" (
          set "Format=!Format:mm=Mon!"
          call :month_convert mm
          if /i "!errorlevel!" neq "0" endlocal&exit/b 1
        )
      )
    )
    endlocal&(
      call set "%~1=%Format%"
      call set "%~2=%Separator%"
      if not "%~3"=="" call set "%~3=%yy%"
      if not "%~4"=="" call set "%~4=%mm%"
      if not "%~5"=="" call set "%~5=%dd%"
    )&exit/b 0
    
    :month_convert
    set "months=Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec"
    call set "month=%%%~1%%"
    set/a mnum=0
    for %%m in (%months%) do set/a mnum+=1&if /i %month% equ %%m call set "%~1=!mnum!"&exit /b 0
    exit/b 1
    
    :setRegDate dte format sep dow mon
    setlocal EnableDelayedExpansion
    if /i "%~5"=="" exit/b 1
    set mon=!%~5!&set dow=!%~4!&set "dow=!dow:~0,3! "
    set sep=!%~3!&set "format=!%~2!"&set "dte=!%~1!"
    set yyyy=%dte:~0,4%&set yy=%dte:~2,2%&set mm=%dte:~4,2%&set "dd=%dte:~-2%"
    set "toks=2-4"
    echo %format%|find " ">nul
    if %errorlevel% equ 1 set "dow="& set "toks=1-3"
    for /f "tokens=%toks% delims=%sep% " %%a in ("%format%") do (
      set "dte=%dow%!%%a!%sep%!%%b!%sep%!%%c!"
    )
    endlocal&call set "%~1=%dte%"&exit/b 0 
    

    OriginaleL’autore Carl

  5. 1

    Ho trovato questo in http://forums.techguy.org/dos-other/837046-solved-date-format-bat-file.html

    Ho rielaborato un po ‘ effettivamente dividere in 3 variabili di ambiente.

    L’aspetto negativo è che è necessario interrogare il registro di sistema, probabilmente per scoprire l’ordine del giorno, del mese e dell’anno.

    @Echo Off
    Set _Date=%date%
    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% " %%B In ("%_Date%") Do Set _fdate=%%D%%B%%C
    IF %_iDate%==1 For /F "TOKENS=%_NumTok% DELIMS=%_sDate% " %%B In ("%_Date%") Do Set _fdate=%%D%%C%%B
    IF %_iDate%==2 For /F "TOKENS=%_NumTok% DELIMS=%_sDate% " %%B In ("%_Date%") Do Set _fdate=%%B%%C%%D
    Set _Month=%_fdate:~4,2%
    Set _Day=%_fdate:~6,2%
    Set _Year=%_fdate:~0,4%
    Echo _Year=%_Year%
    Echo _Month=%_Month%
    Echo _Day=%_Day%
    

    OriginaleL’autore sashoalm

  6. 1

    REG QUERY non è sufficiente, se sShortDate è stato impostato come dd yy. Utilizzare 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
    
    Non c’è modo di ottenere una data valida senza binari esterni (ad es. wmic, robocopy) in batch, ma impostare il registro di sistema da soli. Il date e dircomandi non sempre mostra sShortDatedal registro di sistema internazionale di impostazioni.

    OriginaleL’autore Endoro

  7. 1

    Ho un suggerimento aggiuntivo con robocopy:

    @echo off &setlocal enabledelayedexpansion
    set "day="
    for /f "tokens=3,4,8skip=4delims=: " %%i in ('robocopy') do if not defined day (
        set "month=%%i"
        set "day=0%%j"
        set "year=%%k"
    )
    set /a cnt=0
    for %%i in (Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec) do (
        set /a cnt+=1
        if "%%i"=="%month%" set "month=0!cnt!"
    )
    set "day=%day:~-2%"
    set "month=%month:~-2%"
    echo.%day%.%month%.%year%
    endlocal
    

    OriginaleL’autore Endoro

  8. 0

    Di seguito vi è una pura Batch soluzione che basta usare il comando DATE e %DATA% variabile, quindi funziona su qualsiasi versione di Windows. Per fare questo programma davvero universale, basta aggiungere il nome del giorno e il mese di parti indicate dalla seconda linea di comando DATE in altre lingue, racchiuso in barre. Per esempio, supponiamo che in tedesco la parte del giorno è mostrato come TT, in modo che solo bisogno di modificare questo valore: set DayNames=/dd/tt/ anche al fine di poter utilizzare questo programma in lingua tedesca di Windows (oltre a tutte le lingue che utilizzano GG per la parte del giorno).

    @echo off
    setlocal EnableDelayedExpansion
    
    rem GetStdDate.bat: Get date in standard format independently of Regional Settings
    rem Antonio Perez Ayala
    
    rem Set Day and Month names shown by second line of DATE command, enclosed in slashes (add any missing language):
    set DayNames=/dd/
    set MonthNames=/mm/
    
    rem Get date NAMES from second line of date COMMAND, enclosed in parentheses
    for /F "skip=1 tokens=2 delims=()" %%n in ('date ^< NUL') do (
       rem Separate and store date names
       for /F "tokens=1-3 delims=/-.:" %%a in ("%%n") do (
          set one=%%a& set two=%%b& set three=%%c
          rem Get date VALUES from %date% VARIABLE
          for /F "tokens=1-3 delims=/-.:" %%x in ("%date%") do (
             rem Assign date values to date names
             set %%a=%%x& set %%b=%%y& set %%c=%%z
          )
       )
    )
    
    rem Identify locale date format and assemble StdDate=YYYY/MM/DD
    if "!DayNames:/%one%/=!" neq "%DayNames%" (
       rem Locale format is DD/MM/YYYY
       set StdDate=!%three%!/!%two%!/!%one%!
    ) else if "!MonthNames:/%one%/=!" neq "%MonthNames%" (
       rem Locale format is MM/DD/YYYY
       set StdDate=!%three%!/!%one%!/!%two%!
    ) else (
       rem Locale format is YYYY/MM/DD
       set StdDate=!%one%!/!%two%!/!%three%!
    )
    
    echo Standard date: %StdDate%
    
    Grazie per la risposta. Potresti descrivere il tuo approccio un po’, però? Per esempio, utilizzando le utility esterne, etc.
    Si prega di impostare il formato della data nel pannello di controllo di windows per dd yy e si vedrà, questo non funziona (uscita: Standard date: 13 03//). Ogni utente può impostare il formato della data a ciò che egli vuole. Il date comando dipende da che impostazione, anche per il reindirizzamento).
    Beh, è nearly opere. Non funziona in default situazione in cui un dayname è presente in %data%. Né funziona correttamente come un formato universale in cui il formato dell’anno è yy non yyyy o mese m non mm o il giorno d non dd Per esempio la routine del risultato “13/3/12” significa 2013/03/12 o 2012/3/13 se interpretato da un umano? Ora ciascuno di questi problemi POSSONO essere risolti – per esempio, for/f "tokens=1-4"...%date%... dovrebbe assegnare il quarto metavariable solo se un nomegiorno (& presumibilmente il primo) e il leading-zero potrebbe essere applicata con un po ‘ di matematica/sottostringhe

    OriginaleL’autore Aacini

  9. 0

    Questa funzione dovrebbe funzionare su tutte le regioni.

    Osservazioni:

    Restituisce il mese in formato testo per MMM regioni

    @echo off
      call :GetDateIntl year month day 
      echo/Using GetDateIntl you get: %year%-%month%-%day%
    goto:eof
    
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    :GetDateIntl yy mm dd [/A]
    :: Returns the current date on any machine with regional-independent settings
    :: Arguments:
    ::   yy = variable name for the year output
    ::   mm = variable name for the month output
    ::   dd = variable name for the day output
    ::   /A = OPTIONAL, removes leading 0 on days/months smaller than 10 (example: 01 becomes 1)
    :: Remarks:
    ::  Will return month in text format in regions with MMM month
    ::
    SETLOCAL ENABLEEXTENSIONS
    if "%date%A" LSS "A" (set toks=1-3) else (set toks=2-4)
    for /f "tokens=2-4 delims=(-)" %%a in ('echo:^|date') do (
      for /f "tokens=%toks% delims=.-/" %%i in ('date/t') do (
        set '%%a'=%%i
        set '%%b'=%%j
        set '%%c'=%%k
      )
    )
    if /I "%'yy'%"=="" set "'yy'=%'aa'%"
    if /I "%'yy'%"=="" ( set "'yy'=%'jj'%" & set "'dd'=%'tt'%" )
    if %'yy'% LSS 100 set 'yy'=20%'yy'%
    endlocal&set %1=%'yy'%&set %4 %2=%'mm'%&set %4 %3=%'dd'%&goto :EOF
    :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
    
    Se questo non funziona nel sistema, si prega di dire a me l’uscita di eco:|data, così posso aggiornare il codice. Grazie!

    OriginaleL’autore cyberponk

  10. -3

    Ciao si potrebbe utilizzare la stringa di cambiare per fare questo, come:
    echo %date:~1,2% per ottenere “01”
    e si può ottenere ciò che si desidera.

    Si prega di ri-leggere la domanda, e anche leggere Risposta.
    Inoltre, si può sempre cancellare la tua risposta, in modo da non ingombrare le cose.
    In realtà non cancellarlo, mi hai aiutato a capire come dividere il giorno e il mese da %data%

    OriginaleL’autore junyu

Lascia un commento