mirror of
https://github.com/fofolee/uTools-quickcommand.git
synced 2025-12-15 07:05:21 +08:00
win自动化分类添加进程管理、注册表管理、服务管理、软件管理和系统工具
This commit is contained in:
281
plugin/lib/csharp/process.cs
Normal file
281
plugin/lib/csharp/process.cs
Normal file
@@ -0,0 +1,281 @@
|
||||
using System;
|
||||
using System.Diagnostics;
|
||||
using System.Text;
|
||||
using System.Runtime.InteropServices;
|
||||
using System.Collections.Generic;
|
||||
using System.IO;
|
||||
|
||||
public class ProcessManager
|
||||
{
|
||||
[DllImport("kernel32.dll")]
|
||||
private static extern IntPtr OpenProcess(uint dwDesiredAccess, bool bInheritHandle, uint dwProcessId);
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
private static extern bool CloseHandle(IntPtr hObject);
|
||||
|
||||
[DllImport("kernel32.dll")]
|
||||
private static extern bool TerminateProcess(IntPtr hProcess, uint uExitCode);
|
||||
|
||||
private const uint PROCESS_TERMINATE = 0x0001;
|
||||
private const uint PROCESS_QUERY_INFORMATION = 0x0400;
|
||||
|
||||
public static void Main(string[] args)
|
||||
{
|
||||
if (args.Length == 0 || args[0] == "-h" || args[0] == "--help")
|
||||
{
|
||||
ShowHelp();
|
||||
return;
|
||||
}
|
||||
|
||||
string type = GetArgumentValue(args, "-type");
|
||||
if (string.IsNullOrEmpty(type))
|
||||
{
|
||||
Console.Error.WriteLine("Error: 必须指定操作类型 (-type)");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
switch (type.ToLower())
|
||||
{
|
||||
case "list":
|
||||
ListProcesses();
|
||||
break;
|
||||
case "kill":
|
||||
string target = GetArgumentValue(args, "-target");
|
||||
if (string.IsNullOrEmpty(target))
|
||||
{
|
||||
Console.Error.WriteLine("Error: 必须指定目标进程 (-target)");
|
||||
return;
|
||||
}
|
||||
KillProcess(target);
|
||||
break;
|
||||
case "start":
|
||||
string path = GetArgumentValue(args, "-path");
|
||||
string arguments = GetArgumentValue(args, "-args");
|
||||
if (arguments == null)
|
||||
{
|
||||
arguments = "";
|
||||
}
|
||||
StartProcess(path, arguments);
|
||||
break;
|
||||
default:
|
||||
Console.Error.WriteLine("Error: 不支持的操作类型");
|
||||
break;
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.Error.WriteLine(string.Format("Error: {0}", ex.Message));
|
||||
}
|
||||
}
|
||||
|
||||
private static void ListProcesses()
|
||||
{
|
||||
Console.Write("[");
|
||||
Process[] processes = Process.GetProcesses();
|
||||
bool first = true;
|
||||
foreach (Process proc in processes)
|
||||
{
|
||||
try
|
||||
{
|
||||
string processPath = "";
|
||||
DateTime startTime = DateTime.MinValue;
|
||||
TimeSpan cpuTime = TimeSpan.Zero;
|
||||
long memorySize = 0;
|
||||
int threadCount = 0;
|
||||
ProcessPriorityClass priority = ProcessPriorityClass.Normal;
|
||||
string description = "";
|
||||
string company = "";
|
||||
string version = "";
|
||||
|
||||
try
|
||||
{
|
||||
if (proc.MainModule != null)
|
||||
{
|
||||
processPath = proc.MainModule.FileName;
|
||||
}
|
||||
else
|
||||
{
|
||||
processPath = "";
|
||||
}
|
||||
startTime = proc.StartTime;
|
||||
cpuTime = proc.TotalProcessorTime;
|
||||
memorySize = proc.WorkingSet64;
|
||||
threadCount = proc.Threads.Count;
|
||||
priority = proc.PriorityClass;
|
||||
|
||||
// 获取文件版本信息
|
||||
if (!string.IsNullOrEmpty(processPath) && File.Exists(processPath))
|
||||
{
|
||||
var versionInfo = FileVersionInfo.GetVersionInfo(processPath);
|
||||
description = versionInfo.FileDescription;
|
||||
if (description == null) description = "";
|
||||
company = versionInfo.CompanyName;
|
||||
if (company == null) company = "";
|
||||
version = versionInfo.FileVersion;
|
||||
if (version == null) version = "";
|
||||
}
|
||||
}
|
||||
catch { }
|
||||
|
||||
if (!first)
|
||||
{
|
||||
Console.Write(",");
|
||||
}
|
||||
first = false;
|
||||
|
||||
Console.Write(string.Format(
|
||||
"{{" +
|
||||
"\"id\": {0}," +
|
||||
"\"name\": \"{1}\"," +
|
||||
"\"title\": \"{2}\"," +
|
||||
"\"path\": \"{3}\"," +
|
||||
"\"startTime\": \"{4}\"," +
|
||||
"\"cpuTime\": \"{5}\"," +
|
||||
"\"memory\": {6}," +
|
||||
"\"threads\": {7}," +
|
||||
"\"priority\": \"{8}\"," +
|
||||
"\"description\": \"{9}\"," +
|
||||
"\"company\": \"{10}\"," +
|
||||
"\"version\": \"{11}\"" +
|
||||
"}}",
|
||||
proc.Id,
|
||||
proc.ProcessName,
|
||||
proc.MainWindowTitle.Replace("\"", "\\\""),
|
||||
processPath.Replace("\\", "\\\\").Replace("\"", "\\\""),
|
||||
startTime.ToString("yyyy-MM-dd HH:mm:ss"),
|
||||
cpuTime.ToString(),
|
||||
memorySize,
|
||||
threadCount,
|
||||
priority.ToString(),
|
||||
description.Replace("\"", "\\\""),
|
||||
company.Replace("\"", "\\\""),
|
||||
version.Replace("\"", "\\\"")
|
||||
));
|
||||
}
|
||||
catch { }
|
||||
}
|
||||
Console.Write("]");
|
||||
}
|
||||
|
||||
private static void KillProcess(string target)
|
||||
{
|
||||
int pid;
|
||||
if (int.TryParse(target, out pid))
|
||||
{
|
||||
KillProcessById(pid);
|
||||
}
|
||||
else
|
||||
{
|
||||
KillProcessByName(target);
|
||||
}
|
||||
}
|
||||
|
||||
private static void KillProcessById(int pid)
|
||||
{
|
||||
Process proc = Process.GetProcessById(pid);
|
||||
try
|
||||
{
|
||||
proc.Kill();
|
||||
Console.WriteLine(string.Format("成功终止进程: {0} (PID: {1})", proc.ProcessName, pid));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
throw new Exception(string.Format("无法终止进程: {0}", ex.Message));
|
||||
}
|
||||
}
|
||||
|
||||
private static void KillProcessByName(string name)
|
||||
{
|
||||
Process[] processes = Process.GetProcessesByName(name);
|
||||
if (processes.Length == 0)
|
||||
{
|
||||
throw new Exception("找不到指定的进程");
|
||||
}
|
||||
|
||||
foreach (Process proc in processes)
|
||||
{
|
||||
try
|
||||
{
|
||||
proc.Kill();
|
||||
Console.WriteLine(string.Format("成功终止进程: {0} (PID: {1})", name, proc.Id));
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
Console.Error.WriteLine(string.Format("无法终止进程: {0} (PID: {1}) - {2}",
|
||||
name, proc.Id, ex.Message));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private static void StartProcess(string path, string args)
|
||||
{
|
||||
ProcessStartInfo startInfo = new ProcessStartInfo
|
||||
{
|
||||
FileName = path,
|
||||
Arguments = args,
|
||||
UseShellExecute = true
|
||||
};
|
||||
|
||||
Process proc = Process.Start(startInfo);
|
||||
Console.WriteLine(string.Format("已启动进程: {0} (PID: {1})", path, proc.Id));
|
||||
}
|
||||
|
||||
private static void ShowHelp()
|
||||
{
|
||||
string help = @"
|
||||
进程管理工具使用说明
|
||||
================
|
||||
|
||||
基本语法:
|
||||
process.exe -type <操作类型> [参数...]
|
||||
|
||||
操作类型:
|
||||
--------
|
||||
1. list - 列出所有进程
|
||||
示例: process.exe -type list
|
||||
|
||||
2. kill - 终止进程
|
||||
参数:
|
||||
-target <PID或进程名> 要终止的进程ID或名称
|
||||
示例:
|
||||
process.exe -type kill -target notepad
|
||||
process.exe -type kill -target 1234
|
||||
|
||||
3. start - 启动进程
|
||||
参数:
|
||||
-path <程序路径> 要启动的程序路径
|
||||
-args <参数> 启动参数(可选)
|
||||
示例:
|
||||
process.exe -type start -path ""c:\windows\notepad.exe""
|
||||
process.exe -type start -path ""c:\program.exe"" -args ""-param value""
|
||||
|
||||
返回值:
|
||||
------
|
||||
list操作返回JSON格式的进程信息:
|
||||
{""id"": 进程ID, ""name"": ""进程名"", ""title"": ""窗口标题"", ""path"": ""进程路径"",
|
||||
""startTime"": ""启动时间"", ""cpuTime"": ""CPU时间"", ""memory"": 内存使用量,
|
||||
""threads"": 线程数, ""priority"": ""优先级"", ""description"": ""描述"",
|
||||
""company"": ""公司"", ""version"": ""版本""}
|
||||
|
||||
注意事项:
|
||||
--------
|
||||
1. 终止进程可能需要管理员权限
|
||||
2. 进程名称不需要包含.exe后缀
|
||||
";
|
||||
Console.WriteLine(help);
|
||||
}
|
||||
|
||||
private static string GetArgumentValue(string[] args, string key)
|
||||
{
|
||||
for (int i = 0; i < args.Length - 1; i++)
|
||||
{
|
||||
if (args[i].Equals(key, StringComparison.OrdinalIgnoreCase))
|
||||
{
|
||||
return args[i + 1];
|
||||
}
|
||||
}
|
||||
return null;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user