feat: 初始提交——一键运行快捷轮盘工具(WPF + C#)

This commit is contained in:
2026-08-30 15:44:15 +08:00
commit 2081a938bf
63 changed files with 4214 additions and 0 deletions
@@ -0,0 +1,64 @@
using System.Diagnostics;
using System.IO;
namespace OneClickRun.Services;
/// <summary>定位 PowerShell 7pwsh.exe)并构造脚本启动参数</summary>
public static class PowerShellLocator
{
/// <summary>依次从 PATH、标准安装目录查找 pwsh.exe</summary>
public static string? Find()
{
var pathVar = Environment.GetEnvironmentVariable("PATH") ?? string.Empty;
foreach (var dir in pathVar.Split(';', StringSplitOptions.RemoveEmptyEntries))
{
var candidate = Path.Combine(dir.Trim(), "pwsh.exe");
if (File.Exists(candidate)) return candidate;
}
var programFiles = Environment.GetFolderPath(Environment.SpecialFolder.ProgramFiles);
var localAppData = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
string[] candidates =
{
Path.Combine(programFiles, "PowerShell", "7", "pwsh.exe"),
Path.Combine(localAppData, "Programs", "PowerShell", "7", "pwsh.exe"),
};
foreach (var c in candidates)
if (File.Exists(c)) return c;
return null;
}
public static string? GetVersion(string? pwshPath)
{
if (string.IsNullOrEmpty(pwshPath) || !File.Exists(pwshPath)) return null;
try
{
using var process = Process.Start(new ProcessStartInfo
{
FileName = pwshPath,
Arguments = "-NoProfile -Command \"$PSVersionTable.PSVersion.ToString()\"",
UseShellExecute = false,
RedirectStandardOutput = true,
RedirectStandardError = true,
CreateNoWindow = true,
});
if (process == null) return null;
var output = process.StandardOutput.ReadToEnd();
process.WaitForExit(5000);
return string.IsNullOrWhiteSpace(output) ? null : output.Trim();
}
catch (Exception ex)
{
Logger.Warn($"获取 PowerShell 版本失败: {ex.Message}");
return null;
}
}
/// <summary>构造 pwsh 启动参数(脚本路径加引号,兼容含空格路径)</summary>
public static string BuildScriptArguments(string scriptPath, string? extraArgs)
{
var quoted = "\"" + scriptPath + "\"";
return string.IsNullOrWhiteSpace(extraArgs)
? $"-NoProfile -ExecutionPolicy Bypass -File {quoted}"
: $"-NoProfile -ExecutionPolicy Bypass -File {quoted} {extraArgs.Trim()}";
}
}