• Cygwin/WSL专用函数wmicps:借助Windows WMIC组件从命令行获取某进程的命令行参数及其关联信息;


    wmicps() {
    	# 通过WMIC命令查询进程信息,以便方便地获取路径、命令行等参数,比tasklist提供的信息更加丰富
    	if [ $# -eq 0 ] || [[ "${*,,}" == "-h" || "${*,,}" == "--help" ]];then
    		echo "wmicps:通过WMIC命令查询进程信息(进程ID、可执行文件路径、命令行参数等)"
    		echo -e "\nUsage  :wmicps process-name"
    		echo -e "\nExample:wmicps 360chrome.exe"
    		echo -e "\t wmicps 360chrome"
    		return
    	fi
    	local psName="$1"
    	if [[ ! "$psName" =~ \.exe$ ]];then
    		local psName="$1.exe"
    	fi
    	#wmic process Where Name=\"${psName}\" get Name,ExecutionState,ExecutablePath,CommandLine,Status,ProcessId,UserModeTime,WindowsVersion /FORMAT:List|dos2unix -q|sed -r '/^[\s\t]*\r*\n*$/d'
    	#gsudo cmd /c wmic process Where Name=\"${psName}\" get Name,ExecutionState,ExecutablePath,CommandLine,Status,ProcessId,UserModeTime,WindowsVersion /FORMAT:List|dos2unix -q|sed -r '/^[\s\t]*\r*\n*$/d' #不使用超管权限的话有的进程信息拿不到
    	psInfo=$(gsudo cmd /c wmic process Where Name=\"${psName}\" get Name,ExecutionState,ExecutablePath,CommandLine,Status,ProcessId,UserModeTime,WindowsVersion /FORMAT:List|dos2unix -q|sed -r '/^[\s\t]*\r*\n*$/d')
    	echo "$psInfo"
    	#为每个可执行文件路径输出Cygwin窗口Ctrl+鼠标点击快速打开方式;
    	#exePaths=$(echo "$psInfo"|awk -F '=' '/ExecutablePath=/{print $2}')
    	mapfile -t exePaths<<<$(echo "$psInfo"|dos2unix -q|awk -F '=' '/ExecutablePath=/{print $2}') #这行使用mapfile为兼容路径包含空格的情况
    	[ ! -z "${exePaths[*]}" ] && for exe in "${exePaths[@]}";
    	do 	
    		local exePath=`cygpath -au "${exe//\\/\\\\}"|sed -r 's/([ \(\)])/\\\1/g'` #20220226注:带空格带括号时,即便转义,鼠标点击仍然失效,疑似mintty版本更新后自身的Bug
    		echo "$exePath"
    		dirname "$exePath"
    	done
    	local pid=$(echo "$psInfo"|awk -F '=' '/ProcessId=/{print $2;exit}')
    	if [ ! -z "$pid" ];then
    		#查询此进程是否有关联的Win32服务
    		#serviceInfo=$(gsudo cmd /c wmic service Where ProcessId=\"$pid\" Get Name,DisplayName,State,PathName,SystemName|dos2unix -q|sed -r '/^[\s\t]*\r*\n*$/d')
    		serviceInfo=$(gsudo cmd /c wmic service Where ProcessId=\"$pid\" Get Name,DisplayName,State,PathName,SystemName /FORMAT:List 2>/dev/null|dos2unix -q|sed -r '/^[\s\t]*\r*\n*$/d')
    		echo "$serviceInfo"|grep 'Running' &>/dev/null
    		if [ $? -eq 0 ];then
    			print_color 33 "\n$psName 有关联的Windows服务,具体信息如下:\n"
    			echo "$serviceInfo"
    			read -p "是否对服务进行操作?输入 \`stop\`停止服务,\`restart\`重启服务;直接回车退出:" opService
    			if [ ! -z "$opService" ];then
    				local serviceName=$(echo "$serviceInfo"|awk -F '=' '/Name=/{print $2;exit}')
    				case "$opService" in
    					"stop")
    					gsudo cmd /c "net stop $serviceName"
    					;;
    					"restart")
    					gsudo cmd /c 'net stop '"$serviceName"'&& net start '"$serviceName"
    					;;
    					*)
    					echo "Nothing To Do..."
    					;;
    				esac
    			fi
    		fi
    	fi
    }
    

    运行示例:


    它能间接实现的作用很丰富;
    举例比如:
    1、判断某个进程是独立进程还是由Windows服务启动的,并对服务进行操作(停止或重启);
    2、获取某个进程的完整命令行参数,定时监控某进程运行状况并保存到日志文件;
    3、获取某个进程的完整命令行参数,杀死并且带参数重启进程,比如带命令参数重启浏览器(在浏览器插件崩溃,但是打开了很多网页,又不想关闭这些网页的情况下很有用);

  • 相关阅读:
    使用eclipse阅读java源码
    找重复值
    mysql获取表中数据行数
    DBArtist之Oracle入门第2步: 了解Oracle的Database Control
    DBArtist之Oracle入门第1步: 如何安装Oracle 11g
    存储过程中使用事务和try catch
    Mysql设置auto_increment_increment和auto_increment_offset
    SQL SERVER性能优化综述
    Sql Server 2008R2 数据库发布与订阅
    无法修改SQL Server 服务名称
  • 原文地址:https://www.cnblogs.com/cnhack/p/15937835.html
Copyright © 2020-2023  润新知