mirror of
https://github.com/Leonmmcoset/CMLeonOS.git
synced 2026-03-03 15:30:27 +00:00
拆分代码6
This commit is contained in:
185
shell/Commands/Script/LuaCommand.cs
Normal file
185
shell/Commands/Script/LuaCommand.cs
Normal file
@@ -0,0 +1,185 @@
|
||||
using System;
|
||||
using System.IO;
|
||||
using UniLua;
|
||||
|
||||
namespace CMLeonOS.Commands.Script
|
||||
{
|
||||
public static class LuaCommand
|
||||
{
|
||||
public static void ExecuteLuaScript(string args, CMLeonOS.FileSystem fileSystem, Shell shell, Action<string> showError, Action<string> showWarning)
|
||||
{
|
||||
string[] parts = args.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
|
||||
|
||||
if (parts.Length == 0)
|
||||
{
|
||||
showError("Error: Please specify Lua script file or use --shell for interactive mode");
|
||||
showError("Usage: lua <file> or lua --shell");
|
||||
return;
|
||||
}
|
||||
|
||||
if (parts.Length == 1 && parts[0] == "--shell")
|
||||
{
|
||||
EnterLuaShell(showError);
|
||||
return;
|
||||
}
|
||||
|
||||
string filePath = parts[0];
|
||||
string originalPath = filePath;
|
||||
|
||||
if (!filePath.StartsWith("0:\\") && !filePath.StartsWith("0:/"))
|
||||
{
|
||||
string currentDir = fileSystem.CurrentDirectory;
|
||||
if (currentDir == "/" || currentDir == "\\")
|
||||
{
|
||||
filePath = "0:\\" + filePath.TrimStart('/').TrimStart('\\');
|
||||
}
|
||||
else
|
||||
{
|
||||
filePath = Path.Combine(currentDir, filePath);
|
||||
}
|
||||
}
|
||||
|
||||
if (!File.Exists(filePath))
|
||||
{
|
||||
showError($"Error: File not found: {filePath}");
|
||||
return;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
string scriptContent = File.ReadAllText(filePath);
|
||||
|
||||
if (string.IsNullOrWhiteSpace(scriptContent))
|
||||
{
|
||||
showWarning("Script file is empty");
|
||||
return;
|
||||
}
|
||||
|
||||
ILuaState lua = LuaAPI.NewState();
|
||||
lua.L_OpenLibs();
|
||||
|
||||
UniLua.ThreadStatus loadResult = lua.L_LoadString(scriptContent);
|
||||
|
||||
if (loadResult == UniLua.ThreadStatus.LUA_OK)
|
||||
{
|
||||
UniLua.ThreadStatus callResult = lua.PCall(0, 0, 0);
|
||||
|
||||
if (callResult == UniLua.ThreadStatus.LUA_OK)
|
||||
{
|
||||
}
|
||||
else
|
||||
{
|
||||
string errorMsg = lua.ToString(-1);
|
||||
if (string.IsNullOrWhiteSpace(errorMsg))
|
||||
{
|
||||
showError($"Script execution error: Unknown error");
|
||||
}
|
||||
else
|
||||
{
|
||||
showError($"Script execution error: {errorMsg}");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
string errorMsg = lua.ToString(-1);
|
||||
if (string.IsNullOrWhiteSpace(errorMsg))
|
||||
{
|
||||
showError($"Script load error: Unknown error");
|
||||
}
|
||||
else
|
||||
{
|
||||
showError($"Script load error: {errorMsg}");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
showError($"Lua execution error: {ex.Message}");
|
||||
}
|
||||
}
|
||||
|
||||
private static void EnterLuaShell(Action<string> showError)
|
||||
{
|
||||
Console.WriteLine("====================================");
|
||||
Console.WriteLine(" Lua Interactive Shell");
|
||||
Console.WriteLine("====================================");
|
||||
Console.WriteLine("Type 'exit' or 'quit' to exit");
|
||||
Console.WriteLine();
|
||||
|
||||
ILuaState lua = LuaAPI.NewState();
|
||||
lua.L_OpenLibs();
|
||||
|
||||
while (true)
|
||||
{
|
||||
Console.Write("lua> ");
|
||||
string input = Console.ReadLine();
|
||||
|
||||
if (string.IsNullOrWhiteSpace(input))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
if (input.ToLower() == "exit" || input.ToLower() == "quit")
|
||||
{
|
||||
Console.WriteLine("Exiting Lua shell...");
|
||||
break;
|
||||
}
|
||||
|
||||
try
|
||||
{
|
||||
UniLua.ThreadStatus loadResult = lua.L_LoadString(input);
|
||||
|
||||
if (loadResult == UniLua.ThreadStatus.LUA_OK)
|
||||
{
|
||||
UniLua.ThreadStatus callResult = lua.PCall(0, 0, 0);
|
||||
|
||||
if (callResult == UniLua.ThreadStatus.LUA_OK)
|
||||
{
|
||||
int top = lua.GetTop();
|
||||
if (top > 0)
|
||||
{
|
||||
for (int i = 1; i <= top; i++)
|
||||
{
|
||||
string result = lua.ToString(i);
|
||||
if (!string.IsNullOrWhiteSpace(result))
|
||||
{
|
||||
Console.WriteLine(result);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
string errorMsg = lua.ToString(-1);
|
||||
if (string.IsNullOrWhiteSpace(errorMsg))
|
||||
{
|
||||
showError($"Execution error: Unknown error");
|
||||
}
|
||||
else
|
||||
{
|
||||
showError($"Execution error: {errorMsg}");
|
||||
}
|
||||
}
|
||||
}
|
||||
else
|
||||
{
|
||||
string errorMsg = lua.ToString(-1);
|
||||
if (string.IsNullOrWhiteSpace(errorMsg))
|
||||
{
|
||||
showError($"Load error: Unknown error");
|
||||
}
|
||||
else
|
||||
{
|
||||
showError($"Load error: {errorMsg}");
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (Exception ex)
|
||||
{
|
||||
showError($"Lua error: {ex.Message}");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user