Board logo

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

作者: lonron    时间: 2023-2-19 12:09     标题: [已解决]批处理wmic在for中识别有误的问题

本帖最后由 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(红色部分)。
这种情况该如何解决,或者有没有其他平替方式可以实现原意目的也行。
作者: 77七    时间: 2023-2-19 12:55

如果只是实现目的,在for语句里面把结果赋值,加个goto跳出来不行吗
作者: lonron    时间: 2023-2-19 13:01

回复 2# 77七


    是的,但是其实我更想知道为什么这么写会把in里面的命令当成文本去截取,是不是和wmic特殊的表达式有关系?
作者: 77七    时间: 2023-2-19 13:58

本帖最后由 77七 于 2023-2-19 13:59 编辑

回复 3# lonron

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

回复 4# 77七


    不知道是否是当做文本处理,但是确实会多处理了一次in后面的命令本身,让我觉得这很奇怪,百思不得其解。不过你的方法确实可行,感谢分享思路。
作者: WHY    时间: 2023-2-19 18:11

  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 的方式启动一个子进程。
作者: lonron    时间: 2023-2-21 19:47

回复 6# WHY


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




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