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

[文本处理] [已解决]批处理wmic在for中识别有误的问题

[复制链接]
发表于 2023-2-19 12:09:03 | 显示全部楼层 |阅读模式
本帖最后由 lonron 于 2023-5-8 10:20 编辑
  1. for /f delims^=^"^ tokens^=2 %%i in ('wmic process where name^="cmd.exe" get commandline 2^>nul ^| find "test.bat"') do echo %%i
复制代码
原意是想通过定位 test.bat 所在文件位置,实现将该路径赋值给某个变量。
所以我想到的是利用 wmic 查找 test.bat 在进程中的信息,并用 for /f 截取所需的路径字段来实现这个目的。但是实际测试会出现如下回显结果。
  1. C:\Users\[用户名]>for /f delims^=^"^ tokens^=2 %i in ('wmic process where name^="cmd.exe" get commandline 2^>nul ^| find "test.bat"') do echo %i

  2. C:\Users\[用户名]>echo cmd.exe
  3. cmd.exe
复制代码
绿色部分实际应该是把 wmic process where name^="cmd.exe" get commandline 2^>nul ^| find "test.bat" 这段也当文本识别了,所以根据 for /f 的参数截取到了 cmd.exe(红色部分)。
这种情况该如何解决,或者有没有其他平替方式可以实现原意目的也行。

评分

参与人数 1PB +2 收起 理由
Batcher + 2 感谢给帖子标题标注[已解决]字样

查看全部评分

发表于 2023-2-19 12:55:43 | 显示全部楼层
如果只是实现目的,在for语句里面把结果赋值,加个goto跳出来不行吗
 楼主| 发表于 2023-2-19 13:01:34 | 显示全部楼层
回复 2# 77七


    是的,但是其实我更想知道为什么这么写会把in里面的命令当成文本去截取,是不是和wmic特殊的表达式有关系?
发表于 2023-2-19 13:58:10 | 显示全部楼层
本帖最后由 77七 于 2023-2-19 13:59 编辑

回复 3# lonron

我试验了一下,不是把in()内容当作文本处理,令tokens=1-2 ,查看第一个值。
   wmic命令后面加个 ^| find /v "wmic" 过滤一下,就正常了

评分

参与人数 1技术 +1 收起 理由
lonron + 1 感谢提供思路

查看全部评分

 楼主| 发表于 2023-2-19 14:41:06 | 显示全部楼层
回复 4# 77七


    不知道是否是当做文本处理,但是确实会多处理了一次in后面的命令本身,让我觉得这很奇怪,百思不得其解。不过你的方法确实可行,感谢分享思路。
发表于 2023-2-19 18:11:16 | 显示全部楼层
  1. for /f delims^=^"^ tokens^=2 %%i in ('wmic process where name^="cmd.exe" get commandline 2^>nul ^| find "test.bat"') do echo %%i
复制代码
这条命令执行时,会通过 cmd /c 启动一个CMD子进程
主进程是批处理本身的进程,其 CommandLine 的值为 cmd /c ""C:\Users\abc\test.bat" "
子进程是启动 wmic 的进程,其 CommandLine 的值为 cmd /c wmic process where name="cmd.exe" get commandline 2>nul | find "test.bat"
这两个 CommandLine 都包含 test.bat,用find过滤后就得到了1楼的两个结果。
事实上,for /f "delims=" %%i in ('set') do echo %%i 这条命令中, 如果 set 是外部命令,或者包含管道符,都会用 cmd /c 的方式启动一个子进程。

评分

参与人数 2技术 +2 收起 理由
lonron + 1 感谢解惑
77七 + 1 感谢分享

查看全部评分

 楼主| 发表于 2023-2-21 19:47:20 | 显示全部楼层
回复 6# WHY


   这么一想,之前试过一次识别vbs脚本的
  1. wmic process where name="wscript.exe"
复制代码
这段刚好屏蔽了cmd.exe的启动方式的信息,难怪结果只出现了一次。学习了,非常感谢!
您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2026-3-18 21:34 , Processed in 0.028778 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

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