找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 29961|回复: 10

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

[复制链接]
发表于 2017-11-3 17:59:06 | 显示全部楼层 |阅读模式
本帖最后由 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 。
请大师们,指导下,如何实现。
发表于 2017-11-3 21:39:19 | 显示全部楼层
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,!提取值!
发表于 2017-11-3 22:29:51 | 显示全部楼层
  1. PowerShell -c "gwmi Win32_QuickFixEngineering | Sort InstalledOn -Des | ForEach{'InstalledOn='+$_.InstalledOn.ToString('M/d/yyyy')}"
复制代码

评分

参与人数 1技术 +1 收起 理由
raddison + 1 采纳

查看全部评分

发表于 2017-11-3 22:39:44 | 显示全部楼层
本帖最后由 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. )
复制代码
 楼主| 发表于 2017-11-4 10:32:31 | 显示全部楼层
回复 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
 楼主| 发表于 2017-11-4 10:44:51 | 显示全部楼层
还有个问题,当PowerShell -c "gwmi Win32_QuickFixEngineering | Sort InstalledOn -Des | ForEach{+$_.InstalledOn.ToString('yyyyMMdd')}" 的日期格式 换成 yyyy-MM-dd的时候,执行时候回报错:

数字常量无效: 2017-07-04
发表于 2017-11-4 12:00:23 | 显示全部楼层
回复 6# raddison

当然的,删减代码中的字符也要符合语法才行
 楼主| 发表于 2017-11-4 14:29:27 | 显示全部楼层
@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
 楼主| 发表于 2017-11-4 14:29:57 | 显示全部楼层
完整解决我的需求了,谢谢大家,谢谢各位大佬们!
发表于 2017-11-4 16:38:05 | 显示全部楼层
回复 8# raddison


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

评分

参与人数 1技术 +1 收起 理由
raddison + 1 牛逼

查看全部评分

 楼主| 发表于 2017-11-7 22:24:03 | 显示全部楼层
回复 10# WHY

佩服!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-18 00:17 , Processed in 0.023084 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表