Board logo

标题: [文本处理] 关于查找最新的补丁时间的bat处理,日期类型如何排序【已经解决】 [打印本页]

作者: raddison    时间: 2017-11-3 17:59     标题: 关于查找最新的补丁时间的bat处理,日期类型如何排序【已经解决】

本帖最后由 raddison 于 2017-11-4 14:30 编辑

C:\Users\Administrator>wmic qfe list full  | find "InstalledOn"
InstalledOn=1/25/2013
InstalledOn=1/25/2013
InstalledOn=1/25/2013
InstalledOn=1/25/2013
InstalledOn=1/25/2013
InstalledOn=1/25/2013
InstalledOn=4/23/2013
InstalledOn=4/23/2013
InstalledOn=5/14/2017
InstalledOn=8/27/2014
InstalledOn=11/21/2010

比如上述得到的结果,我怎么实现得到 最新的那一条排序(InstalledOn=5/14/2017),到第一位呢?

@echo off
for /f "tokens=2 delims==" %%a in ('wmic qfe list full  ^| find "InstalledOn"') do (
  echo %%a
)
set Today=%t%

pause

我初步的想法是,首先得补充上面的日期格式,比如之前的月份,只有一位数,那就得将前面补0 ,第二位的同样也补0 ,然后进行sort 。
请大师们,指导下,如何实现。
作者: /zhqsystem/zhq    时间: 2017-11-3 21:39

for /f "delims=" %%a in (' wmic qfe get InstalledOn /value')do (
for /f "tokens=1,* delims==" %%a in ("%%a")do (
  for /f "tokens=1,2,* delims=/" %%c in ("%%b")do (
   set "%%ayyyy=00%%e"
   set "%%amm=00%%c"
   set "%%add=00%%d"
   set "#%%a=!%%ayyyy:~-4!/!%%amm:~-2!/!%%add:~-2!"
   set "_!#%%a!=%%b"
   set "$!%%ayyyy:~-4!/!%%amm:~-2!/!%%add:~-2!=!#%%a!"
  )
)
)
for /f "tokens=1,* delims==" %%a in ('set _')do set "提取值=%%b"&&set "%%a="
echo,!提取值!
作者: WHY    时间: 2017-11-3 22:29

  1. PowerShell -c "gwmi Win32_QuickFixEngineering | Sort InstalledOn -Des | ForEach{'InstalledOn='+$_.InstalledOn.ToString('M/d/yyyy')}"
复制代码

作者: WHY    时间: 2017-11-3 22:39

本帖最后由 WHY 于 2017-11-4 16:50 编辑
  1. @echo off & setlocal enabledelayedexpansion
  2. if "%~1" == "1" (
  3.     for /f "tokens=1-3 delims=/" %%i in ('wmic qfe get InstalledOn^| findstr [0-9]') do (
  4.         set /a MM=%%i+100, dd=%%j+100
  5.         for /f %%k in ("%%k") do echo;%%k!MM!!dd! %%i/%%j/%%k
  6.     )
  7. ) else (
  8.     for /f "tokens=2" %%i in ('"%~f0" 1 ^| sort /r') do echo;InstalledOn=%%i
  9.     pause
  10. )
复制代码

作者: raddison    时间: 2017-11-4 10:32

回复 3# WHY
你这个很办法最直接,另外的哥们提供的办法是通过文本处理的方式,手法也很高超。

目前还有其他的步骤继续完成:
PowerShell -c "gwmi Win32_QuickFixEngineering | Sort InstalledOn -Des | ForEach{+$_.InstalledOn.ToString('yyyyMMdd')}"

比如下面,我仅仅列出最新的补丁日期,那么我还想知道距离执行脚本时候当前时间,隔了多少天,这个是日期比较的问题,大师们,麻烦再教教我。辛苦大家。


@echo off
PowerShell -c "gwmi Win32_QuickFixEngineering | Sort InstalledOn -Des | ForEach{+$_.InstalledOn.ToString('yyyyMMdd')}"  > a.txt
set /p lastday= < a.txt
echo %lastday%
del a.txt

pause
作者: raddison    时间: 2017-11-4 10:44

还有个问题,当PowerShell -c "gwmi Win32_QuickFixEngineering | Sort InstalledOn -Des | ForEach{+$_.InstalledOn.ToString('yyyyMMdd')}" 的日期格式 换成 yyyy-MM-dd的时候,执行时候回报错:

数字常量无效: 2017-07-04
作者: zaqmlp    时间: 2017-11-4 12:00

回复 6# raddison

当然的,删减代码中的字符也要符合语法才行
作者: raddison    时间: 2017-11-4 14:29

@echo off
PowerShell -c "gwmi Win32_QuickFixEngineering | Sort InstalledOn -Des | ForEach{+$_.InstalledOn.ToString('yyyyMMdd')}"  > a.txt
set /p num= < a.txt
del a.txt
set num2=%date:~,10%
set num2=%date:/=%
set y=%num:~,4%
set m=%num:~4,2%
set d=%num:~6,2%
set a=dateserial(%y%,%m%,%d%)
set y2=%num2:~,4%
set m2=%num2:~4,2%
set d2=%num2:~6,2%
set b=dateserial(%y2%,%m2%,%d2%)
echo wscript.echo datediff("d",%a%,%b%)>t.vbs
for /f %%r  in ('cscript /nologo t.vbs') do echo  %%r
del t.vbs
pause
作者: raddison    时间: 2017-11-4 14:29

完整解决我的需求了,谢谢大家,谢谢各位大佬们!
作者: WHY    时间: 2017-11-4 16:38

回复 8# raddison


    如果只是需要最新安装的补丁时间与现在的时间差,没必要写那么复杂
  1. PowerShell -c "$D=(gwmi Win32_QuickFixEngineering|Sort InstalledOn)[-1].InstalledOn;((Get-Date)-$D).Days"
复制代码

作者: raddison    时间: 2017-11-7 22:24

回复 10# WHY

佩服!




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