当前位置: 首页 > 面试题库 >

在shell脚本中解析wmic的输出

步建茗
2023-03-14
问题内容

我试图解析WMIC的输出,然后获取PID。

我的脚本如下:

@echo off

setLocal enableExtensions enableDelayedExpansion

FOR /F "tokens=1* delims=" %%A IN ('"wmic process where(name="java.exe") get ProcessID,commandline| FINDSTR /v "CommandLine" | FINDSTR "TestServer""') DO (
     set "line=%%A"
     @REM echo "%%A"
     for /F "tokens=* delims= " %%C in ("%%A") do (
         echo "%%C"
         echo "%%D"
  )
)

输出如下:

"java  com.test.TestServer                                       7560       "
"%D"
"java  com.test.TestServer                                       7380       "
"%D"

我的目标是获取进程ID。

我已经尝试过将空间作为FOR循环中的delims。然而没有运气。

所以我的问题是如何格式化WMIC的列并获取列?


问题答案:

WMIC使用SQL语法的子集。通过将LIKE运算符与%通配符一起使用,可以在功能上将FINDSTR测试放在WMIC
WHERE子句中。由于它在批处理脚本中,因此%需要加倍。

由于WMIC输出中不再需要CommandLine值,因此解析出ProcessID更加容易。我添加了SessionID以便在末尾放置一个未使用的值,以便更轻松地解析该值,而不必担心FOR
/ F在将WMIC Unicode输出转换为ANSI时以某种方式引入的不必要的回车符。

@echo off
setlocal
set "pid="
for /f "skip=1" %%A in (
  'wmic process where "name='java.exe' and commandline like '%%TestServer%%' and not commandline like '%%CommandLine%%'" get processid^, sessionid'
) do if not defined pid set "pid=%%A"

编辑以回应评论中的问题

WMIC Unicode的FOR / F转换还引入了不需要的行,这些行看起来为空,但实际上包含一个回车符。在上面的代码中,我假设您期望一行,因此我使用IF
DEFINED有效地忽略了多余的尾随“空白”行。

如果期望多个值,则需要另一种方法。额外的FOR /
F循环将删除不需要的回车符,因此这些行实际上变为空行,因此将被忽略。根据您的评论,您似乎不再需要忽略包含“ CommandLine”的命令行。

我不知道您需要使用这些值做什么,因此下面的代码只是回显每个值。我使用SKIP = 1来代替通过FINDSTR传递结果以避免标题行。

@echo off
for /f "skip=1" %%A in (
  'wmic process where "name='java.exe' and commandline like '%%TestServer%%'" get processid'
) do for /f %%B in ("%%A") do echo %%B


 类似资料:
  • 问题内容: 我想将参数传递给它。 我已经习惯了这样做,,....但我要开始对其进行命名 问题答案: 有很多方法可以解析sh中的参数。Getopt很好。这是一个简单的脚本,可以手动解析内容: 运行示例如下: 请注意,由于脚本eval是由用户构造的字符串,因此它甚至不具有强大的鲁棒性,也没有向安全漏洞开放。它仅是作为一种可能的做事方式的示例。一种更简单的方法是要求用户在环境中传递数据。在bourne

  • 问题内容: 关于这种事情有很多问题,但让我们想象一下,我们的目标是安装了getopt和getopts的通用Linux系统(不是我们将使用其中任何一种,但它们似乎很流行) 如何同时解析长参数(–example | –example简单选项)和短参数(-e | -esimple-example | -e简单示例) 问题答案: 您想使用多头和空头期权。工作代码示例: 注意,是先前定义的功能(未显示)。

  • 问题内容: 我正在尝试将外壳程序脚本中的JSON对象解析为数组。 例如:Amanda,25岁,[http://mywebsite.com] JSON看起来像: 我不想使用任何库,最好是可以使用正则表达式或grep。我已经做好了: 这给了我“名字”:“阿曼达”。我可以为文件中的每一行循环执行此操作,然后将其添加到数组中,但是我只需要右侧而不是整行。 问题答案: 如果您确实无法使用适当的JSON解析器

  • 问题内容: 在Jenkinsfile Groovy脚本阶段,假设我要发出一个Linux命令来输出字符串的行和列,并想要在特定行的输出中获取第n列。这样的命令的一个示例是“ ls -al”。所以我这样做正确吗? 但是,如何获取本质上为$ {COL [4]}的值,该值是“ ls -al”命令的第五列,即目录大小? 谢谢! 问题答案: 您在示例中显示的bash脚本不会返回正确的目录大小。它将以递归方式返

  • 问题内容: 我正在尝试提取git分支并在我的Jenkinsfile中提交信息,如下所示: 我想以后像这样打印它: 我没有得到真正的价值,而是这样: 我做错了什么,如何正确获取需要的值? 编辑:不,建议的重复项不是答案,因为我知道用于检索所需信息的shell命令。我的问题是信息传递给我的方式,而不是。 问题答案: 这个完整的管道对您有用吗?使用管道插件2.4为我工作。

  • 问题内容: 我正在研究一个Java程序,该程序在JUnit测试中调用多个Shell脚本(因此,除了。和E之外没有输出),这些脚本可操纵文件和SQL表,然后将所述表中的数据与其期望值进行比较。一切都在理论上可行,但是我遇到了一个阶段性错误,其中一种类型的测试按预期工作,而另一种类型的测试在十分钟超时后失败。我将问题隔离为Shell脚本之一,但是我没有编写此脚本,因此无法以任何方式进行更改。解决此问题