Shell 如何查找运行特定进程的用户列表

Shell 如何查找运行特定进程的用户列表,shell,batch-file,csv,Shell,Batch File,Csv,我必须向执行特定流程的多个用户发送消息: 如何查找用户名列表,例如执行图像“chrome.exe”,然后向这些用户发送消息。 上述所有活动必须保存在bat文件中 提前谢谢你 试试这个: @echo off for /f "tokens=8" %%i in ('tasklist /fi "imagename eq chrome.exe" /fo table /nh /v') do echo %%i 请注意,如果图像名称包含空格,代码可能有缺陷,但我无法在普通批处理文件中找到完美的解决方案 说明:

我必须向执行特定流程的多个用户发送消息: 如何查找用户名列表,例如执行图像“chrome.exe”,然后向这些用户发送消息。 上述所有活动必须保存在bat文件中 提前谢谢你

试试这个:

@echo off
for /f "tokens=8" %%i in ('tasklist /fi "imagename eq chrome.exe" /fo table /nh /v') do echo %%i
请注意,如果图像名称包含空格,代码可能有缺陷,但我无法在普通批处理文件中找到完美的解决方案

说明:

试试这个:

@echo off
for /f "tokens=8" %%i in ('tasklist /fi "imagename eq chrome.exe" /fo table /nh /v') do echo %%i
请注意,如果图像名称包含空格,代码可能有缺陷,但我无法在普通批处理文件中找到完美的解决方案

说明:


根据对xmcp答案的评论,我稍微扩展了代码:

@echo off 
setlocal enabledelayedexpansion 
for /f "delims=" %%x in ('tasklist /fi "imagename eq firefox.exe" /fo csv /nh /v') do ( 
  set line=%%x 
  set line=!line:","="@"! 
  for /f "tokens=7 delims=@" %%a in (!line!) do echo %%~a 
)

它替换字段分隔符(
“,”
),而不触及数字中的逗号(在某些本地化中),并使用不同的分隔符解析结果字符串。缺点:它会减慢速度(理论上,我认为没有人会注意到)

根据对xmcp答案的评论,我稍微扩展了代码:

@echo off 
setlocal enabledelayedexpansion 
for /f "delims=" %%x in ('tasklist /fi "imagename eq firefox.exe" /fo csv /nh /v') do ( 
  set line=%%x 
  set line=!line:","="@"! 
  for /f "tokens=7 delims=@" %%a in (!line!) do echo %%~a 
)
它替换字段分隔符(
“,”
),而不触及数字中的逗号(在某些本地化中),并使用不同的分隔符解析结果字符串。缺点:它会减慢速度(理论上,我认为没有人会注意到)

显示了检索进程及其所属用户名称的完美命令。但是,如果数据中出现额外的空白,他们的解决方案将失败

为使其更安全,请使用
tasklist
命令的输出格式,通过
for/F
循环以整行/整行捕获其输出,并通过标准
for
循环提取单列/单元格项:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem/*捕获无标题的CSV格式输出`tasklist`返回以下列:
rem`“映像名”、“PID”、“会话名”、“会话#”、“内存使用情况”、“状态”、“用户名”、“CPU时间”、“窗口标题”`:*/
对于/F“delims=”%%L in('
任务列表/FI“ImageName eq Chrome.exe”/FI“状态eq Running”/V/NH/FO CSV
""做"(
rem//初始化列计数器:
设置/A“CNT=0”
rem/*使用标准“for”循环枚举列,这与引用有关;
请注意逗号“,”是“cmd”中的标准分隔符:*/
对于%%I in(%%L)do(
rem//删除周围引号后存储项目:
设置“项=%%~I”
rem/*保存项目周围的引号,供以后使用
如果不匹配,rem将从(未加引号的)消息中筛选出来:*/
设置“测试=%%I”
rem//增量列计数器:
设置/A CNT+=1
rem//切换延迟扩展以不丢失感叹号:
setlocal EnableDelayedExpansion
rem/*如果未找到匹配项,将显示以下消息:
rem`INFO:没有运行符合指定条件的任务。`;
rem由于不包含引号,因此以下条件失败:*/
如果不是“!ITEM!”==“!TEST!”(
rem//第7列包含用户名:
如果!CNT!eq 7回显(!项!
)
端部
)
)
端部
退出/B
这只是回显当前正在运行名为
Chrome.exe
的进程的每个用户的名称。要向他们发送消息,您可以使用该命令而不是
echo

如果CSV数据包含全局通配符
*
,则此方法不起作用;此类字符不应出现在图像、会话和名称中;虽然它们可能出现在窗口标题中,但无论如何,它们都会出现在
任务列表
输出中的用户名之后。

显示了对r的完美命令etrieve进程及其所属用户的名称。但是,如果数据中出现额外的空格,他们的解决方案将失败

为使其更安全,请使用
tasklist
命令的输出格式,通过
for/F
循环以整行/整行捕获其输出,并通过标准
for
循环提取单列/单元格项:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem/*捕获不带标题的CSV格式输出;`tasklist`返回以下列:
rem`“映像名”、“PID”、“会话名”、“会话#”、“内存使用情况”、“状态”、“用户名”、“CPU时间”、“窗口标题”`:*/
对于/F“delims=”%%L in('
任务列表/FI“ImageName eq Chrome.exe”/FI“状态eq Running”/V/NH/FO CSV
""做"(
rem//初始化列计数器:
设置/A“CNT=0”
rem/*使用标准“for”循环枚举列,这与引用有关;
请注意逗号“,”是“cmd”中的标准分隔符:*/
对于%%I in(%%L)do(
rem//删除周围引号后存储项目:
设置“项=%%~I”
rem/*保存项目周围的引号,供以后使用
如果不匹配,rem将从(未加引号的)消息中筛选出来:*/
设置“测试=%%I”
rem//增量列计数器:
设置/A CNT+=1
rem//切换延迟扩展以不丢失感叹号:
setlocal EnableDelayedExpansion
rem/*如果未找到匹配项,将显示以下消息:
rem`INFO:没有运行符合指定条件的任务。`;
rem由于不包含引号,因此以下条件失败:*/
如果不是“!ITEM!”==“!TEST!”(
rem//第7列包含用户名:
如果!CNT!eq 7回显(!项!
)
端部
)
)
端部
退出/B
这只是回显当前正在运行名为
Chrome.exe
的进程的每个用户的名称。要向他们发送消息,您可以使用该命令而不是
echo

如果CSV数据包含全局通配符,则此方法不起作用