[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

回复 15楼 的帖子

10/2008/10
这样的话,哪个是月哪个是日呢?
这个是必须知道的前提啊?
技术问题请到论坛发帖求助!

TOP

用个临时文件取日期
  1. @echo off
  2. set n=-1&set m=+1
  3. echo wscript.echo date>tmp.vbs
  4. for /f "tokens=1,2,3* delims=-" %%i in ('cscript /nologo tmp.vbs^&del tmp.vbs') do set "ymda=10%%k 10%%i 10%%j"
  5. :lp
  6. echo wscript.echo dateadd("d",%n%,date)>tmp.vbs
  7. for /f "tokens=1,2,3* delims=-" %%i in ('cscript /nologo tmp.vbs^&del tmp.vbs') do set "ymdb=10%%k 10%%i 10%%j"
  8. for  %%i in (%ymda%) do set %%i=%%i
  9. for  %%i in (%ymdb%) do if %%i gtr 1031 (set yyyy=%%i)else (
  10. if not defined %%i (set/a dd=%%i%m%,t+=2)else set mm=%%i)
  11. )
  12. if %t% gtr 3 set n=+1&set t=&set m=-1&goto lp
  13.    set yyyy=%yyyy:~-4%
  14.    set mm=%mm:~-2%
  15.    set dd=%dd:~-2%
  16.    set .y=%yyyy%
  17.    set .m=%mm%
  18.    set .d=%dd%
  19.    set/p str=请输入:
  20.    setlocal enabledelayedexpansion
  21. :lp1
  22.    set v=!str:~,1!
  23.      if not defined .%v% (
  24.        if not defined var (set var=!v!)else set var=!var!!v!
  25.         ) else (
  26.           call set var=!var!%%.%v%:~!_%v%!,1%%
  27.           set/a _!v!+=1
  28. )
  29. set str=!str:~1!
  30. if defined str goto lp1
  31. echo !var!
  32. pause
复制代码
1

评分人数

    • pusofalse: 精品,如果是用纯批解决就更完美了。PB + 8

TOP

回复 16楼 的帖子

sorry,刚刚脑子短路了。。。
因为我的代码是先获取一个yyyymmdd格式的标准格式的日期(所谓标准,即是别的机子上也是如此),所以没有考虑太过关于日/年/月格式该如何区分日、月的问题就说了出来。
依次看来,随风兄的代码算得上完美代码了,期待更多好代码的出现。
心绪平和,眼藏静谧。

TOP

回复 17楼 的帖子

VBS那里能知道个大概意思。lp1标签里的变量嵌套实在太经典了。
出这题的有一部分目的也在于熟悉“变量的嵌套”吧。
心绪平和,眼藏静谧。

TOP

这个问题用纯P 有点复杂了
因为毕竟要考虑日期格式的全面性 虽然有的格式并不会出现
就象 我开始问的  2008-01-03 也可以说是一月三号  也可以理解三月一号
我上面的代码 就是取得当天日期的前一天或后一天 有变化的判断为日
判断YYYY的方法是大于4位 余下是年
期待完善版本了

TOP

回复 20楼 的帖子

有变化的判断为日?
特意把日期改为10月1日后再运行,虽然也能正确输出。但“有变化的判断为日”这种说法是否不严谨?因为10月1日前一天是9月30日,月份也变化了。或许是我误解了。
------------------------------------------------------------------
明白了~只看到-1,没看到+1。

[ 本帖最后由 pusofalse 于 2008-10-21 23:49 编辑 ]
心绪平和,眼藏静谧。

TOP

还有个办法就是通过改变系统日期来实现判断 月或日。
技术问题请到论坛发帖求助!

TOP

恩  可以试 DATE 改
不知道这样行得通否?
  1. 发现有错误  修改
复制代码

[ 本帖最后由 terse 于 2008-10-22 02:26 编辑 ]

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (y1#0#1 y2#1#1 y3#2#1 y4#3#1 m1#5#1 m2#6#1 d1#8#1 d2#9#1) do (
  3.     for /f "tokens=1,2,3 delims=#" %%i in ("%%a") do set "%%i=!date:~%%j,%%k!"
  4. )
  5. set /p code=请输入格式:
  6. :lp
  7. set "a=!code:~,1!"&set "code=!code:~1!"
  8. set /a n+=1
  9. for %%i in (d m y) do (
  10.     if /i "%%i" equ "%a%" set /a .%%i+=1&call,set "_%n%=%%%%i!.%%i!%%"
  11. )
  12. if not defined _%n% set "_%n%=%a%"   
  13. if defined code goto lp
  14. for /l %%i in (1,1,%n%) do set /p=!_%%i!<nul
  15. pause>nul
复制代码
测试格式为d/m m-y y,d y-y
1

评分人数

***共同提高***

TOP

再来个通用版(不知道2000能用不)

  1. @echo off&setlocal enabledelayedexpansion
  2. set "d=%date%"
  3. :lp1
  4. set "a=!d:~,1!"&set "d=!d:~1!"
  5. for %%i in (0 1 2 3 4 5 6 7 8 9) do if "%%i" equ "%a%" set "str=!str!%a%"&goto next
  6. :next
  7. if defined d goto lp1
  8. set "com=reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate"
  9. for /f "skip=4 tokens=3" %%i in ('%com%') do set "ymd=%%i"
  10. set "ymd=%ymd:mm=m%"&set "ymd=!ymd:dd=d!"
  11. set "ymd=%ymd:m=mm%"&set "ymd=!ymd:d=dd!"
  12. :lp2
  13. set "a=!ymd:~,1!"&set "ymd=!ymd:~1!"
  14. for %%i in (y m d) do (
  15.     if /i "%%i" equ "%a%" (
  16.        set /a .%%i+=1&set "%%i!.%%i!=!str:~,1!"&set "str=!str:~1!"
  17.     )
  18. )
  19. if defined ymd goto lp2
  20. set /p code=请输入格式:
  21. :lp3
  22. set "a=!code:~,1!"&set "code=!code:~1!"&set "ok=a"
  23. for %%i in (y m d) do (
  24.     if /i "%%i" equ "%a%" set /a _%%i+=1&call,set /p=%%%%i!_%%i!%%<nul&set "ok="
  25. )
  26. if defined ok set /p=%a%<nul
  27. if defined code goto lp3
  28. pause>nul
复制代码

[ 本帖最后由 batman 于 2008-10-22 17:39 编辑 ]
1

评分人数

***共同提高***

TOP

回复 25楼 的帖子

Win2k没有reg.exe
^_^
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

贴出我的代码,可能存在通用性问题。希望大家测试并指出其中问题:
  1. @echo off&setlocal enabledelayedexpansion
  2. for /f %%a in ('wmic path win32_operatingsystem get localdatetime') do set "CurrentDate=%%a"
  3. rem 用wmic获取日期标准格式(yyyymmdd),代码、思路来自于论坛巡查BATCHER。
  4. rem 标准化获取当前日期:http://www.cn-dos.net/forum/viewthread.php?tid=41857&fpage=1&highlight=%2Bhat
  5. set "CurrentDate=%CurrentDate:~0,8%"
  6. set "Format=yyyymmdd"
  7. for %%a in (Y M D) do set "%%a=defined"
  8. for %%a in (4 2 2) do call :LOOP %%a
  9. set /p DateFormat=Input the format:
  10. :LP
  11. set "Char=%DateFormat:~,1%"
  12. if defined !Char! (
  13.    set /a !Char! += 1
  14.    <nul call call set /p=%%%%!Char!%%!Char!%%%%%%
  15.    ) else (
  16.    <nul set /p=!DateFormat:~,1!
  17. )
  18. set "DateFormat=!DateFormat:~1!"
  19. if defined DateFormat goto :LP
  20. pause>nul &exit /b
  21. :LOOP
  22. for /l %%a in (1 1 %1) do (
  23.      set "!Format:~,1!%%a=!CurrentDate:~,1!"
  24.      for %%i in (Format CurrentDate) do set "%%i=!%%i:~1!"
  25. )
复制代码

[ 本帖最后由 pusofalse 于 2008-10-22 17:43 编辑 ]
心绪平和,眼藏静谧。

TOP

  先从注册表获得日期格式,把它保存到一个文件,再设置日期格式为yyyy-mm-dd,然后再交由主体程序按输入的格式去输出,最后恢复原先的日期格式。这样可不管原系统是什么日期格式了(3句语句可解决)。这样应该可行吧?可惜 按输入的格式去输出 我理解错了。

[ 本帖最后由 shqf 于 2008-10-22 19:57 编辑 ]

TOP

只能显示三种格式:1.用空格隔开的格式,例如mm dd yyyy;2.用/隔开的格式,例如:dd/mm/yyy;3.用-隔开的格式,例如:yyyy-dd-mm
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=%date%"
  3. for /f "delims=0123456789-/" %%i in ("%str%") do set var=!str:%%i=!
  4. for /f "tokens=1-3 delims=-" %%i in ("%var%") do (
  5.     if "%%j" neq "" (
  6.        set yyyy=%%i&set mm=%%j&set dd=%%k
  7.     ) else (
  8.        for /f "tokens=1-3 delims=/" %%a in ("%var%") do (set mm=%%a&set dd=%%b&set yyyy=%%c)
  9.     )
  10. )
  11. set /p input=请输入:
  12. for /f "tokens=1-3" %%i in ("%input%") do if "%%j" neq "" call,echo %%%%i%% %%%%j%% %%%%k%%
  13. for /f "tokens=1-3 delims=-" %%i in ("%input%") do if "%%j" neq "" call,echo %%%%i%%-%%%%j%%-%%%%k%%
  14. for /f "tokens=1-3 delims=/" %%i in ("%input%") do if "%%j" neq "" call,echo %%%%i%%/%%%%j%%/%%%%k%%
  15. pause>nul
复制代码
(*^_^*)

TOP

真的很难!
不过还是做出来了,纯批的,适用多种情况

  1. @echo off&setlocal enabledelayedexpansion
  2. set n=1
  3. for /f "tokens=2 delims=:" %%a in ('echo^;^|date') do (set str!n!=%%a&set/a n+=1)
  4. set str2=!str2:~2,-2!
  5. for %%a in (!str1!) do (set var=%%a
  6.         if "!var:-=!" neq "!var!" set fen=-&set str=%%a
  7.         if "!var:/=!" neq "!var!" set fen=/&set str=%%a
  8. )
  9. set n=3
  10. for %%a in (!str2:%fen%^= !) do (set str!n!=%%a&set/a n+=1)
  11. set n=3
  12. if not defined str4 for %%a in (0 1 2) do (set str!n!=!str2:~%%a,1!&set/a n+=1)
  13. set n=3
  14. for %%a in (!str:%fen%^= !) do (
  15.         for %%b in (str!n!) do (
  16.                 set !%%b!=%%a&set/a n+=1
  17.         )
  18. )
  19. for %%a in ("年 月 日" "yyyy mm dd" "yy mm dd") do (
  20.         for /f "tokens=1,2,3" %%b in (%%a) do (
  21.                 if defined %%b (
  22.                 for /f "tokens=1,2,3" %%e in ("!%%b! !%%c! !%%d!") do (
  23. endlocal&setlocal enabledelayedexpansion
  24.                         set #y=%%e
  25.                         set #m=%%f
  26.                         set #d=%%g
  27.                 ))
  28.         )
  29. )
  30. :loop
  31. set in=
  32. set str=
  33. set/p in=输入日期格式:
  34. for %%a in (y m d) do (set in=!in:%%a=" "%%a" "!)
  35. set/a .y=0,.m=0,.d=0
  36. for %%a in ("!in!") do (
  37.         if defined #%%~a (
  38.                 for %%b in (!.%%~a!) do (
  39.                         set str=!str!!#%%~a:~%%b,1!
  40.                 )
  41.                 set/a .%%~a+=1
  42.         ) else (set str=!str!%%~a)
  43. )
  44. echo 分解:"!in!"
  45. echo 处理结果:!str!
  46. goto :loop
复制代码

TOP

返回列表