标题: [文本处理] [已解决]批处理wmic在for中识别有误的问题 [打印本页]
作者: lonron 时间: 2023-2-19 12:09 标题: [已解决]批处理wmic在for中识别有误的问题
本帖最后由 lonron 于 2023-5-8 10:20 编辑
- 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 截取所需的路径字段来实现这个目的。但是实际测试会出现如下回显结果。- 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
-
- C:\Users\[用户名]>echo cmd.exe
- 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
- 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脚本的- wmic process where name="wscript.exe"
复制代码
这段刚好屏蔽了cmd.exe的启动方式的信息,难怪结果只出现了一次。学习了,非常感谢!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |