[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文本处理] [已解决]批处理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(红色部分)。
这种情况该如何解决,或者有没有其他平替方式可以实现原意目的也行。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

回复 6# WHY


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

TOP

  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

评分人数

TOP

回复 4# 77七


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

TOP

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

回复 3# lonron

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

评分人数

    • lonron: 感谢提供思路技术 + 1
bat小白,请多指教!谢谢!

TOP

回复 2# 77七


    是的,但是其实我更想知道为什么这么写会把in里面的命令当成文本去截取,是不是和wmic特殊的表达式有关系?

TOP

如果只是实现目的,在for语句里面把结果赋值,加个goto跳出来不行吗
bat小白,请多指教!谢谢!

TOP

返回列表