Board logo

标题: [系统相关] [已解]批处理for语句获取wmic命令的结果给变量用if无法正确判断为指定值是什么原因 [打印本页]

作者: huyou96    时间: 2016-10-22 10:29     标题: [已解]批处理for语句获取wmic命令的结果给变量用if无法正确判断为指定值是什么原因

本帖最后由 pcl_test 于 2016-10-22 13:04 编辑

菜鸟问题,我写了很多测试语句,if括住的语句都没能正确“echo 中文”,请教各位大虾,我错在了哪里?
请问:正确的if语句该怎么写?
  1. for /f "delims=" %%l in ('wmic os get OSLanguage ^| findstr [0-9]') do (
  2. set language=%%l
  3. )
  4. echo %language%
  5. if %%language%% == 2052 (
  6. echo 中文
  7. )
  8. if "%%language%%" == 2052 (
  9. echo 中文
  10. )
  11. if %%language%% == "2052" (
  12. echo 中文
  13. )
  14. if "%%language%%" == "2052" (
  15. echo 中文
  16. )
  17. if %%language%% equ 2052 (
  18. echo 中文
  19. )
  20. if "%%language%%" equ 2052 (
  21. echo 中文
  22. )
  23. if %%language%% equ "2052" (
  24. echo 中文
  25. )
  26. if "%%language%%" equ "2052" (
  27. echo 中文
  28. )
  29. if !language! == 2052 (
  30. echo 中文
  31. )
  32. if "!language!" == 2052 (
  33. echo 中文
  34. )
  35. if !language! == "2052" (
  36. echo 中文
  37. )
  38. if "!language!" == "2052" (
  39. echo 中文
  40. )
  41. if !language! equ 2052 (
  42. echo 中文
  43. )
  44. if "!language!" equ 2052 (
  45. echo 中文
  46. )
  47. if !language! equ "2052" (
  48. echo 中文
  49. )
  50. if "!language!" equ "2052" (
  51. echo 中文
  52. )
复制代码

作者: huyou96    时间: 2016-10-22 12:05


看来我真的很菜,连基本if都搞不掂
作者: aa77dd@163.com    时间: 2016-10-22 12:10

回复 2# huyou96


WMIC 的输出中含有特殊字符, 下面用 set /a 的方式将其过滤[只适用于纯数字]
  1. @echo off
  2. for /f "delims=" %%l in ('wmic os get OSLanguage ^| findstr [0-9]') do (
  3.     set /a "language=%%l"
  4. )
  5. if "%language%" equ "2052" (
  6.     echo 中文
  7. )
  8. pause
  9. exit /b
复制代码

作者: 回家路上    时间: 2016-10-22 12:11

http://bbs.bathome.net/thread-31727-1-1.html
作者: huyou96    时间: 2016-10-22 12:23

本帖最后由 huyou96 于 2016-10-22 13:21 编辑

回复 3# aa77dd@163.com

太谢谢啦!昨蒙您指教,已深感受惠不浅,今日又一语道破指点迷津,令不才茅塞顿开,叩谢叩谢了!
(这个烦恼折磨得我一直以为if语句不会写了,转义字符乱用改来改去也得不到理想结果,闹得我特自卑特抓狂…… 好在大虾指点迷津,才知设置变量带个参数就会掉滤杂质不出错。太棒了。

呵呵,补充,我已经无法多给您评分了,昨天已经把我列兵的评分用尽了吧,我是真想再多多评分来答谢你啊!)
作者: 523066680    时间: 2016-10-22 13:02

回复 5# huyou96


    茅舍顿开 是个好词汇
作者: pcl_test    时间: 2016-10-22 13:11

  1. wmic os get OSLanguage /value|findstr "=2052\>" >nul&&echo;Y||echo;N
  2. pause
  3. for /f %%a in ('wmic os get OSLanguage /value^|find "="') do set %%a
  4. if "%OSLanguage%" equ "2052" (echo;Y) else echo;N
  5. pause
复制代码

作者: huyou96    时间: 2016-10-22 13:22

回复 6# 523066680
谢指正!已改。
作者: huyou96    时间: 2016-10-22 13:27

回复 7# pcl_test

叩谢!学习学习。
但脚本的可读性还是觉得aa77dd大虾的更好些,
所以我实际判研注册表最后定位位置的批处理脚本最终还是采纳了他的那个。

作者: huyou96    时间: 2016-10-22 13:30

最近很多时候都在忙乎注册表,尤其在 HKEY_CLASSES_ROOT\CLSID 这个分支下忙乎,但系统既有中文版又有英文版,熟悉注册表的朋友都知道,中英文关于注册表的“根”用语是不同的,简体中文表述为“计算机”,繁体中文是“電腦”,英文是“Computer”。所以,虽然我的批处理脚本很简单仅有一条语句,原来却需要分成至少仨文件:ChsSysRegeditLastKey.bat、ChtSysRegeditLastKey.bat、EngSysRegeditLastKey.bat,运行时还要留神别一不小心把操作系统和应该运行的批处理给弄混了,你说闹心不闹心?很费神,根本达不到自动化的要求。

现在好了,只消一个批处理SetRegeditLastKey.bat就搞掂了。
原需仨部门跑腿办的,现一个部门就可办成,效率提高了啊。
在文件资源管理器里右击该批处理然后用管理员身份运行一下,
管你什么语言的系统都不会给搞错了,
再打开注册表编辑器时都会自动定位到如我所愿的地方啦,好哇讃啊。
谢谢aa77dd大虾惠助!

SetRegeditLastKey.bat
  1. for /f "delims=" %%l in ('wmic os get OSLanguage ^| findstr [0-9]') do (
  2. set /a "language=%%l"
  3. )
  4. if "%language%" equ "2052" (
  5. reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Applets\Regedit" /f /v LastKey /t REG_SZ /d "计算机\HKEY_CLASSES_ROOT\CLSID"
  6. )
  7. if "%language%" equ "1028" (
  8. reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Applets\Regedit" /f /v LastKey /t REG_SZ /d "電腦\HKEY_CLASSES_ROOT\CLSID"
  9. if "%language%" equ "1033" (
  10. reg add "HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Applets\Regedit" /f /v LastKey /t REG_SZ /d "Computer\HKEY_CLASSES_ROOT\CLSID"
复制代码

作者: huyou96    时间: 2016-10-22 14:37

另外谈一下我对批处理在Windows里能运用得更上层楼的点滴感悟,我猜,批处理脚本要完全“自动化”必须跟系统自带的“任务计划程序”Task Scheduler  相互配合才能如虎添翼

就简单拿上楼我贴的这个批处理小脚本来说吧,如果您用注册表编辑器不太频繁,也不干系统部署这个活,那注册表每次打开的定位对您而言不算什么大不了的事,但要频繁打开它们进行操作,肯定这样的批处理很有用了,但即便有用,还得我去每次鼠标右击它再多点一下快捷菜单才能运行它,如果能自动运行它该多好!试想,每次关闭注册表编辑器,肯定会当成一个系统事件,如若任务计划程序里设置为每次关闭注册表编辑器后即开始运行一下该批处理,那么就根本不用多操心去人工手动跑它了,它会适时自动运行!关键是我不明白“任务计划程序”里设置时该怎么设,具体该选哪个系统事件做触发器?这才是关键,而网络上关于“任务计划程序”Task Scheduler的系统事件触发器的资料又少之又少。所以,才没能发挥出批处理应该发挥的效用。姿势是力量,姿势是光明,而现在,是俩眼一抹黑丫。这是我的沉痛感受。如果有人能提供“任务计划程序”Task Scheduler 更详尽设置的技术资料,是指那种有真实内涵的厚料教程或资料,而不是简单讲几句入门的设置之类的,如果能提供出来,更如能带详尽应用设置的实例,那将感激不尽!

也拷贝一下今天在另外帖里的留言,也是谈到这个感受的,版主请别嫌我烦,我是想把这个想法讲清楚啊。之前留言如下:

用批处理添加计划任务,在指定的时间运行关机的命令即可。
bingxing8000 发表于 2013-4-17 17:36

请教一下“任务计划程序”里触发器如欲设置为发生事件时触发,我想要的事件是每次系统更新升级后,比如Windows10每次更新重启后在操作中心都会触发一个通知事件,这说明微软肯定是用任务计划程序来通知用户这条讯息的,我也想要这样,但苦于不知道Windows Update完成后的事件触发,设置时应该选取事件日志中的哪一条?有否关于任务计划程序触发器尤其是事件触发的详细教程或资料?Windows Update完成的事件触发应该选哪个事件的哪个日志和哪个源?请使用过“任务计划程序”和批处理文件相配合做过完全自动化的大虾指点一下迷津。谢谢!
作者: aa77dd@163.com    时间: 2016-10-22 14:38

回复 10# huyou96

在 Win7 中文 64位下测试, 那个 数据不用根, 直接以 \HKEY_CLASSES_ROOT 开头 或者 HKEY_CLASSES_ROOT 开头,

甚至是 @#$\HKEY_CLASSES_ROOT 这样开头(第一个 \ 前最多三个字符), 再次打开 regedit 时, 定位的位置都有效

另外, 根的名称可以变量化, 略许简化代码
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. set "root2052=计算机"
  4. set "root1028=電腦"
  5. set "root1033=Computer"
  6. for /f "delims=" %%l in ('wmic os get OSLanguage ^| findstr [0-9]') do (
  7.     for %%l in (%%l) do ^
  8. reg add "HKCU\SOFTWARE\Microsoft\Windows\CurrentVersion\Applets\Regedit" ^
  9. /f /v LastKey /t REG_SZ /d "!root%%l!\HKEY_CLASSES_ROOT\CLSID"
  10. )
  11. pause
  12. exit
复制代码

作者: huyou96    时间: 2016-10-22 14:48

本帖最后由 huyou96 于 2016-10-22 14:52 编辑

回复 12# aa77dd@163.com


谢谢!谢谢!语言都不够用来说感谢啦!
已采用!不愧是大虾,代码更简洁易读了,今后要是真有外包,接韩国的单用韩国操作系统、日本操作系统、法国操作系统。。。也可以在顶头位置正解设置语言了,太棒了,这样改后真是棒极了!讃!!!

受教了,原来那个键值不用跟系统原本的设置一致,不用“根”也不会乱,看来我是太执迷于微软的“本初”之心了。。。知道了,谢谢!
作者: Batcher    时间: 2016-10-22 15:20

任务计划可以使用schtasks命令,系统自带的命令行帮助文件ntcmds.chm里面既有讲解又有实例。
http://bbs.bathome.net/thread-3926-1-1.html

如果看完之后仍有疑问可以发帖大家再帮你。
作者: huyou96    时间: 2016-10-22 15:57

本帖最后由 huyou96 于 2016-10-22 16:14 编辑

回复 14# Batcher


谢谢!非常感谢!太棒了!我去看看。

补充:schtasks命令我已运用得非常熟练,熟之又熟。单那个命令是有限制的(如不配合XML设置文件的话),比如设置多个触发器则必须在图形界面设置或者用XML设置才行。

我所困惑的不是运用命令去设置任务,而在设置任务时那些系统事件触发的触发器该如何设置,对此我俩眼一抹黑,而我最急需的资料正是这个资料。(简单的系统登录后、启动后、各种定时触发的触发器等等就都不要了,这些个我早烂熟在心了,就是由操作系统的系统事件来触发的触发器(或者像微软系统自带的那些个自定义的触发器),这方面我啥也不懂也根本不通,查找过网上几无所获,没有找到关于这方面的更详尽资料或教程。)如有这方面的资料,请提供,不尽感谢!
作者: wskwfkbdn    时间: 2016-10-23 14:12

看了下输出结果,是包含了一个回车符,对于回车符 使用set进行变量赋值会取消回车符的,另外2552后面是几个空格符,这种情况 你不要当初字符串去判断,if %language% equ 2052 这样判断就可以啦。
  1. @ECHO OFF
  2. for /f "delims=" %%l in ('wmic os get OSLanguage ^| findstr [0-9]') do set "language=%%l"
  3. ECHO."%language%"
  4. if %language% equ 2052 (echo 中文)
  5. pause
复制代码

作者: huyou96    时间: 2016-10-23 14:25

回复 16# wskwfkbdn
谢谢!说在了要害上,非常准确。承教啦!




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