Board logo

标题: [数值计算] [已解决]批处理搭配curl命令如何实现:同步日期和时间到本地电脑? [打印本页]

作者: ygqiang    时间: 2016-7-19 12:54     标题: [已解决]批处理搭配curl命令如何实现:同步日期和时间到本地电脑?

本帖最后由 pcl_test 于 2016-7-19 14:00 编辑

[已解决]批处理,搭配curl命令,如何实现:年代、日期、时间,一起同步到本地电脑?
  1. @echo off&setlocal enabledelayedexpansion&cls
  2. echo 同步年代、日期、时间到本地电脑
  3. ::==============================================================
  4. for /f "tokens=2,3 delims= " %%a in ('curl time.nist.gov:13') do (
  5. set "riqi=%%a"
  6. set "hh=1%%b"
  7. set /a "h=(!hh:~0,3!%%100+8)%%24"
  8. echo !riqi!
  9. echo !h!!hh:~-6!
  10. 1pause
  11. echo !riqi!|date
  12. echo !h!!hh:~-6!|time
  13. )
  14. ::==============================================================
  15. echo 按任意键退出&pause>nul
  16. exit
  17. curl time.nist.gov:13>1.txt
复制代码

作者: pcl_test    时间: 2016-7-19 13:34

date %格式化后的日期%&time %格式化后的时间%
作者: ygqiang    时间: 2016-7-19 13:50

本帖最后由 pcl_test 于 2016-7-19 13:54 编辑

回复 2# pcl_test


    多谢。。搞定了。修改在顶楼
作者: pcl_test    时间: 2016-7-19 17:00

回复 3# ygqiang

如果同步发生在凌晨,你不需要解决日期的更替问题?
作者: ygqiang    时间: 2016-7-19 18:10

回复 4# pcl_test


    嗯?这个情况,是啥意思?没考虑到。
作者: pcl_test    时间: 2016-7-20 14:21

  1. /*&cls
  2. @echo off
  3. set "netpath=%systemroot%\Microsoft.NET\Framework"
  4. for /f "delims=" %%a in ('dir /ad /b "%netpath%\v?.*"') do (
  5. if exist "%netpath%\%%a\csc.exe" (
  6.     set "cscpath=%netpath%\%%a\csc.exe"
  7.     goto :0
  8. )
  9. )
  10. echo;未安装.Net Framework 2.0及其上版本组件或相关程序丢失&pause&exit
  11. :0
  12. if not exist $SetDateTime.exe ("%cscpath%" /out:$SetDateTime.exe "%~f0")
  13. echo;
  14. echo;手动运行$SetDateTime.exe
  15. ping -n 4 0 >nul&exit
  16. */
  17. using System;
  18. using System.Net;
  19. using System.Net.Sockets;
  20. using System.Text;
  21. using System.Text.RegularExpressions;
  22. using System.Diagnostics;
  23. using System.Threading;
  24. class SetDateTime
  25. {
  26.     private static byte[] result = new byte[512];
  27.     static void Main(string[] args)
  28.     {
  29.         IPAddress ip = IPAddress.Parse(Dns.GetHostAddresses("time.nist.gov")[0].ToString());
  30.         Socket clientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  31.         try
  32.         {
  33.             clientSocket.Connect(new IPEndPoint(ip, 13));
  34.         }
  35.         catch
  36.         {
  37.             Console.WriteLine("连接服务器失败,程序将自动退出!");
  38.             Thread.Sleep(3000);
  39.             return;
  40.         }
  41.         int receiveLength = clientSocket.Receive(result);
  42.         Match dtstr = Regex.Match(Encoding.ASCII.GetString(result, 0 ,receiveLength), @"\d+(-\d+){2}\s\d+(:\d+){2}");
  43.         DateTime dt = DateTime.ParseExact(dtstr.ToString(), "yy-MM-dd HH:mm:ss", System.Globalization.CultureInfo.CurrentCulture).AddHours(8);
  44.         Console.WriteLine("服务器当前日期时间为:{0}", dt.ToString());
  45.         Process proc = new Process();
  46.         proc.StartInfo.FileName = "cmd.exe";
  47.         proc.StartInfo.Arguments = "/c date "+dt.ToShortDateString().ToString()+"&time "+dt.ToLongTimeString().ToString();
  48.         proc.StartInfo.UseShellExecute = false;
  49.         proc.StartInfo.RedirectStandardError = true;
  50.         proc.Start();
  51.         string err = proc.StandardError.ReadToEnd();
  52.         Console.WriteLine(err != ""?err:"同步日期时间完成,请按任意键退出!");
  53.         Console.ReadKey(true);
  54.     }
  55. }
复制代码

作者: GNU    时间: 2016-7-20 14:51

如果条件允许的话,建议用系统自带的时间同步功能跟时间服务器之间保持时间同步。
也可以自己尝试搭建一个NTP服务器,将来找工作的时候说不定还是一个加分项。
企业里面一般不会采用你这样的脚本同步方案。
作者: ygqiang    时间: 2016-7-20 15:06

本帖最后由 ygqiang 于 2016-7-20 15:15 编辑

回复 6# pcl_test


    echo;手动运行$SetDateTime.exe
ping -n 8 0 >nul
start "" "$SetDateTime.exe"
ping -n 4 0 >nul&exit
作者: pcl_test    时间: 2016-7-20 15:11

回复 8# ygqiang

“手动”是告诉你批处理只是为了生成程序,以后直接运行程序即可
作者: ygqiang    时间: 2016-7-20 15:17

本帖最后由 ygqiang 于 2016-7-20 15:22 编辑

回复 9# pcl_test


    Console.WriteLine("连接服务器失败,程序将自动退出!");

Console.WriteLine(err != ""?err:"同步日期时间完成,请按任意键退出!");

Console.WriteLine("服务器当前日期时间为:{0}", dt.ToString());


多谢。这3个地方,如何去掉这种窗口提示信息。
需要的效果是:后台运行,后台静默同步。不显示任何窗口提示信息。
作者: pcl_test    时间: 2016-7-20 15:20

回复 10# ygqiang
Console.ReadKey(true);改为Thread.Sleep(3000);
作者: ygqiang    时间: 2016-7-20 15:23

回复 11# pcl_test


运行$SetDateTime.exe,
需要的效果是:后台运行,后台静默同步。不显示任何窗口提示信息。
作者: ygqiang    时间: 2016-7-20 16:42

回复 11# pcl_test

而且$SetDateTime.exe同步的时候,有时候几秒钟就同步成功。
也有很多时候,好几十秒也无法同步,提示连接服务器失败。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2