mirror of
https://github.com/Leonmmcoset/CMLeonOS.git
synced 2026-03-03 03:27:01 +00:00
Branswe更新&环境变量
This commit is contained in:
456
Branswe.cs
456
Branswe.cs
@@ -18,20 +18,20 @@ using Console = System.Console;
|
|||||||
using Sys = Cosmos.System;
|
using Sys = Cosmos.System;
|
||||||
|
|
||||||
public static class Branswe
|
public static class Branswe
|
||||||
|
//Branswe<77><65>ѭMIT<49><54><EFBFBD><EFBFBD>֤<EFBFBD><D6A4>
|
||||||
{
|
{
|
||||||
private static string varlib = "";
|
private static string varlib = "";
|
||||||
private static string geted = "";
|
private static string geted = "";
|
||||||
private static string runlib = "";
|
|
||||||
private static string methods = "";
|
private static string methods = "";
|
||||||
public static void Run(string Code)
|
public static void Run(string Code)
|
||||||
{
|
{
|
||||||
//<2F><>ʼ<EFBFBD><CABC>
|
//<2F><>ʼ<EFBFBD><CABC>
|
||||||
string[] codelines = Code.Split("\n");
|
string[] codelines = Code.Split("\n");
|
||||||
int Codelength = codelines.Length;
|
long Codelength = codelines.Length;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
for (int coderun = 0; coderun < Codelength; coderun++)
|
for (long coderun = 0; coderun < Codelength; coderun++)
|
||||||
{
|
{
|
||||||
string line = codelines[coderun];
|
string line = codelines[coderun];
|
||||||
|
|
||||||
@@ -45,23 +45,114 @@ public static class Branswe
|
|||||||
switch (line.Split(" ")[0])
|
switch (line.Split(" ")[0])
|
||||||
{
|
{
|
||||||
case "method":
|
case "method":
|
||||||
// 与CMLeonOS不兼容,删除此功能
|
{
|
||||||
Console.WriteLine("Error: method command is not compatible with CMLeonOS");
|
string rest = line.Substring(6).Trim();
|
||||||
break;
|
int arrowIndex = rest.IndexOf("<<");
|
||||||
|
|
||||||
|
string varPart = rest.Substring(0, arrowIndex).Trim();
|
||||||
|
string codePart = rest.Substring(arrowIndex + 2).Trim();
|
||||||
|
|
||||||
|
// <20><> <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
||||||
|
// <20><><EFBFBD> varPart <20>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ֵ
|
||||||
|
if (!varPart.Contains(" "))
|
||||||
|
{
|
||||||
|
Branswe.Run("ref getvar " + varPart);
|
||||||
|
if (!string.IsNullOrEmpty(geted)) varPart = geted;
|
||||||
|
}
|
||||||
|
|
||||||
|
// <20><><EFBFBD> codePart <20>DZ<EFBFBD><C7B1><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ȡ<EFBFBD><C8A1>ֵ
|
||||||
|
if (!codePart.Contains(" "))
|
||||||
|
{
|
||||||
|
Branswe.Run("ref getvar " + codePart);
|
||||||
|
if (!string.IsNullOrEmpty(geted)) codePart = geted;
|
||||||
|
}
|
||||||
|
|
||||||
|
methods += "\uE001" + varPart + "\uE002" + codePart;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
case "diskfile":
|
case "diskfile":
|
||||||
// 与CMLeonOS不兼容,删除此功能
|
{
|
||||||
Console.WriteLine("Error: diskfile command is not compatible with CMLeonOS");
|
switch (line.Split(" ")[1])
|
||||||
|
{
|
||||||
|
/*case "read":
|
||||||
|
{
|
||||||
|
Branswe.Run("ref getvar " + line.Split(" ", 5)[2]);
|
||||||
|
var get0 = geted;
|
||||||
|
switch (line.Split(" ")[3])
|
||||||
|
{
|
||||||
|
case "to":
|
||||||
|
{
|
||||||
|
Branswe.Run("ref getvar " + line.Split(" ", 5)[4]);
|
||||||
|
var get1 = geted;
|
||||||
|
Branswe.Run("var(text) " + get1 + " = " + VFSManager.GetFile(get0));
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}*/
|
||||||
|
case "reg":
|
||||||
|
{
|
||||||
|
VFSBase vfs = new CosmosVFS();
|
||||||
|
VFSManager.RegisterVFS(vfs);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "create":
|
||||||
|
{
|
||||||
|
switch (line.Split(" ")[2])
|
||||||
|
{
|
||||||
|
case "file":
|
||||||
|
{
|
||||||
|
Branswe.Run("ref getvar " + line.Split(" ", 4)[3]);
|
||||||
|
var get = geted;
|
||||||
|
VFSManager.CreateFile(get);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "dir":
|
||||||
|
{
|
||||||
|
Branswe.Run("ref getvar " + line.Split(" ", 4)[3]);
|
||||||
|
var get = geted;
|
||||||
|
VFSManager.CreateDirectory(get);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "write":
|
||||||
|
{
|
||||||
|
Branswe.Run("ref getvar " + line.Split(" ", 5)[2]);
|
||||||
|
var get0 = geted;
|
||||||
|
switch (line.Split(" ", 5)[3])
|
||||||
|
{
|
||||||
|
case "to":
|
||||||
|
{
|
||||||
|
Branswe.Run("ref getvar " + line.Split(" ", 5)[4]);
|
||||||
|
var get1 = geted;
|
||||||
|
File.WriteAllText(get0, get1);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
case "rstr": //rstr=Read String To Run
|
case "rstr": //rstr=Read String To Run
|
||||||
// 与CMLeonOS不兼容,删除此功能
|
{
|
||||||
Console.WriteLine("Error: rstr command is not compatible with CMLeonOS");
|
var parts = line.Split(" ", 2);
|
||||||
break;
|
Branswe.Run("ref getvar " + parts[1]);
|
||||||
|
var code = geted;
|
||||||
|
for (long i = 0; i < code.Split("\\n").Length; i++)
|
||||||
|
{
|
||||||
|
Branswe.Run(code.Split("\\n")[i]);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "var()":
|
case "var()":
|
||||||
{
|
{
|
||||||
var parts = line.Split(" ", 4);
|
var parts = line.Split(" ", 4);
|
||||||
@@ -92,40 +183,40 @@ public static class Branswe
|
|||||||
case "=+":
|
case "=+":
|
||||||
{
|
{
|
||||||
Branswe.Run("ref getvar " + parts[1]);
|
Branswe.Run("ref getvar " + parts[1]);
|
||||||
int wc0 = int.Parse(geted);
|
long wc0 = long.Parse(geted);
|
||||||
Branswe.Run("ref getvar " + parts[3]);
|
Branswe.Run("ref getvar " + parts[3]);
|
||||||
int wc1 = int.Parse(geted);
|
long wc1 = long.Parse(geted);
|
||||||
int calced = wc0 + wc1;
|
long calced = wc0 + wc1;
|
||||||
Branswe.Run("var(text) " + parts[1] + " = " + calced);
|
Branswe.Run("var(text) " + parts[1] + " = " + calced);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "=-":
|
case "=-":
|
||||||
{
|
{
|
||||||
Branswe.Run("ref getvar " + parts[1]);
|
Branswe.Run("ref getvar " + parts[1]);
|
||||||
int wc0 = int.Parse(geted);
|
long wc0 = long.Parse(geted);
|
||||||
Branswe.Run("ref getvar " + parts[3]);
|
Branswe.Run("ref getvar " + parts[3]);
|
||||||
int wc1 = int.Parse(geted);
|
long wc1 = long.Parse(geted);
|
||||||
int calced = wc0 - wc1;
|
long calced = wc0 - wc1;
|
||||||
Branswe.Run("var(text) " + parts[1] + " = " + calced);
|
Branswe.Run("var(text) " + parts[1] + " = " + calced);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "=*":
|
case "=*":
|
||||||
{
|
{
|
||||||
Branswe.Run("ref getvar " + parts[1]);
|
Branswe.Run("ref getvar " + parts[1]);
|
||||||
int wc0 = int.Parse(geted);
|
long wc0 = long.Parse(geted);
|
||||||
Branswe.Run("ref getvar " + parts[3]);
|
Branswe.Run("ref getvar " + parts[3]);
|
||||||
int wc1 = int.Parse(geted);
|
long wc1 = long.Parse(geted);
|
||||||
int calced = wc0 * wc1;
|
long calced = wc0 * wc1;
|
||||||
Branswe.Run("var(text) " + parts[1] + " = " + calced);
|
Branswe.Run("var(text) " + parts[1] + " = " + calced);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "=/":
|
case "=/":
|
||||||
{
|
{
|
||||||
Branswe.Run("ref getvar " + parts[1]);
|
Branswe.Run("ref getvar " + parts[1]);
|
||||||
int wc0 = int.Parse(geted);
|
long wc0 = long.Parse(geted);
|
||||||
Branswe.Run("ref getvar " + parts[3]);
|
Branswe.Run("ref getvar " + parts[3]);
|
||||||
int wc1 = int.Parse(geted);
|
long wc1 = long.Parse(geted);
|
||||||
int calced = wc0 / wc1;
|
long calced = wc0 / wc1;
|
||||||
Branswe.Run("var(text) " + parts[1] + " = " + calced);
|
Branswe.Run("var(text) " + parts[1] + " = " + calced);
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -170,63 +261,35 @@ public static class Branswe
|
|||||||
switch (parts[1])
|
switch (parts[1])
|
||||||
{
|
{
|
||||||
case "mousex":
|
case "mousex":
|
||||||
// 与CMLeonOS不兼容,删除此功能
|
Branswe.Run("var(text) [] = " + MouseManager.X);
|
||||||
Console.WriteLine("Error: mousex command is not compatible with CMLeonOS");
|
break;
|
||||||
break;
|
|
||||||
case "mousey":
|
case "mousey":
|
||||||
// 与CMLeonOS不兼容,删除此功能
|
Branswe.Run("var(text) [] = " + MouseManager.Y);
|
||||||
Console.WriteLine("Error: mousey command is not compatible with CMLeonOS");
|
break;
|
||||||
break;
|
|
||||||
case "screenx":
|
case "screenx":
|
||||||
// 与CMLeonOS不兼容,删除此功能
|
Branswe.Run("var(text) [] = " + Console.WindowWidth);
|
||||||
Console.WriteLine("Error: screenx command is not compatible with CMLeonOS");
|
break;
|
||||||
break;
|
|
||||||
case "screeny":
|
case "screeny":
|
||||||
// 与CMLeonOS不兼容,删除此功能
|
Branswe.Run("var(text) [] = " + Console.WindowHeight);
|
||||||
Console.WriteLine("Error: screeny command is not compatible with CMLeonOS");
|
break;
|
||||||
break;
|
|
||||||
case "concolour-b":
|
case "concolour-b":
|
||||||
// 与CMLeonOS不兼容,删除此功能
|
Branswe.Run("var(text) [] = " + Console.BackgroundColor);
|
||||||
Console.WriteLine("Error: concolour-b command is not compatible with CMLeonOS");
|
break;
|
||||||
break;
|
|
||||||
case "concolour-f":
|
case "concolour-f":
|
||||||
// 与CMLeonOS不兼容,删除此功能
|
Branswe.Run("var(text) [] = " + Console.ForegroundColor);
|
||||||
Console.WriteLine("Error: concolour-f command is not compatible with CMLeonOS");
|
break;
|
||||||
break;
|
|
||||||
case "getalldisks":
|
case "getalldisks":
|
||||||
{
|
{
|
||||||
|
|
||||||
Branswe.Run("var(text) [] = " + VFSManager.GetDisks().ToArray());
|
Branswe.Run("var(text) [] = " + VFSManager.GetDisks().ToArray());
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "to":
|
|
||||||
{
|
|
||||||
switch (parts[2])
|
|
||||||
{
|
|
||||||
case "raw":
|
|
||||||
{
|
|
||||||
Branswe.Run("ref getvar " + parts[3]);
|
|
||||||
Branswe.Run("var(text) [] = " + byte.Parse(geted).ToString());
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
/*case "int":
|
|
||||||
{
|
|
||||||
int.Parse(parts[3]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "long":
|
|
||||||
{
|
|
||||||
long.Parse(parts[3]);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "decimal":
|
|
||||||
{
|
|
||||||
decimal.Parse(parts[3]);
|
|
||||||
break;
|
|
||||||
}*/
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
case "getvar":
|
case "getvar":
|
||||||
{
|
{
|
||||||
@@ -277,14 +340,9 @@ public static class Branswe
|
|||||||
case "sleep":
|
case "sleep":
|
||||||
{
|
{
|
||||||
Branswe.Run("ref getvar " + line.Split(" ")[1]);
|
Branswe.Run("ref getvar " + line.Split(" ")[1]);
|
||||||
Thread.Sleep(TimeSpan.FromMilliseconds(long.Parse(geted)));//<2F><><EFBFBD><EFBFBD>C# Threading<6E><67>Sleep
|
Thread.Sleep(TimeSpan.FromMilliseconds(long.Parse(geted))); //<2F><><EFBFBD><EFBFBD>C# Threading<6E><67>Sleep
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*case "if":
|
|
||||||
{
|
|
||||||
if ()
|
|
||||||
break;
|
|
||||||
}*/
|
|
||||||
case "loop":
|
case "loop":
|
||||||
{
|
{
|
||||||
var parts = line.Split(" ");
|
var parts = line.Split(" ");
|
||||||
@@ -297,22 +355,31 @@ public static class Branswe
|
|||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "canvas":
|
|
||||||
// 与CMLeonOS不兼容,删除此功能
|
|
||||||
Console.WriteLine("Error: canvas command is not compatible with CMLeonOS");
|
|
||||||
break;
|
|
||||||
case "end":
|
case "end":
|
||||||
{
|
{
|
||||||
throw new Exception("\uE001");
|
throw new Exception("\uE001");
|
||||||
}
|
}
|
||||||
/*case "graphics":
|
|
||||||
// 与CMLeonOS不兼容,删除此功能
|
|
||||||
Console.WriteLine("Error: graphics command is not compatible with CMLeonOS");
|
|
||||||
break;*/
|
|
||||||
case "power":
|
case "power":
|
||||||
// 与CMLeonOS不兼容,删除此功能
|
{
|
||||||
Console.WriteLine("Error: power command is not compatible with CMLeonOS");
|
switch (line.Split(" ")[1])
|
||||||
break;
|
{
|
||||||
|
case "off":
|
||||||
|
{
|
||||||
|
ACPI.Shutdown();
|
||||||
|
CPU.Halt();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
case "reboot":
|
||||||
|
{
|
||||||
|
ACPI.Reboot();
|
||||||
|
CPU.Reboot();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
case "decide":
|
case "decide":
|
||||||
{
|
{
|
||||||
var parts = line.Split(" ");
|
var parts = line.Split(" ");
|
||||||
@@ -445,57 +512,37 @@ public static class Branswe
|
|||||||
Console.Clear();
|
Console.Clear();
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
/*case "conchange":
|
|
||||||
{
|
|
||||||
switch (line.Split(" ")[1])
|
|
||||||
{
|
|
||||||
case "bgcolor":
|
|
||||||
{
|
|
||||||
Console.BackgroundColor = Color.FromArgb(int.Parse(line.Split(" ")[2]));
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}*/
|
|
||||||
default:
|
default:
|
||||||
{
|
{
|
||||||
var methodEntries = methods.Split('\uE001', StringSplitOptions.RemoveEmptyEntries);
|
var methodEntries = methods.Split('\uE001', StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
|
||||||
for (int i = 0; i < methodEntries.Length; i++)
|
for (long i = 0; i < methodEntries.Length; i++)
|
||||||
{
|
{
|
||||||
var parts = methodEntries[i].Split('\uE002');
|
var parts = methodEntries[i].Split('\uE002');
|
||||||
if (parts.Length < 2) continue;
|
if (parts.Length < 2) continue;
|
||||||
|
|
||||||
string varPart = parts[0].Trim(); // "a c b"
|
string varPart = parts[0]; //keep spaces as is
|
||||||
string codeTemplate = parts[1].Trim(); // "d"
|
string codeTemplate = parts[1]; //keep spaces
|
||||||
|
|
||||||
// 1. <20>ƶϷ<C6B6><CFB7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD> varPart <20>ĵ<EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
var firstToken = varPart.Split(' ')[0];
|
var firstToken = varPart.Split(' ')[0];
|
||||||
Branswe.Run("ref getvar " + firstToken);
|
Branswe.Run("ref getvar " + firstToken);
|
||||||
string methodName = geted.TrimEnd('(').Trim(); // "print(" <20><> "print"
|
string methodName = geted; //no .TrimEnd('(').Trim()
|
||||||
|
|
||||||
// 2. <20><><EFBFBD><EFBFBD>Ƿ<EFBFBD>ƥ<EFBFBD><C6A5>
|
|
||||||
if (line.StartsWith(methodName))
|
if (line.StartsWith(methodName))
|
||||||
{
|
{
|
||||||
// 3. <20><>ȡ<EFBFBD><C8A1><EFBFBD><EFBFBD>
|
string args = line.Substring(methodName.Length); //keep spaces
|
||||||
string args = line.Substring(methodName.Length).Trim();
|
Branswe.Run("ref getvar " + args);
|
||||||
if (args.StartsWith("(") && args.EndsWith(")"))
|
string argValue = geted; //value may contain spaces
|
||||||
{
|
|
||||||
args = args.Substring(1, args.Length - 2);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4. <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>մ<EFBFBD><D5B4><EFBFBD>
|
|
||||||
string finalCode = codeTemplate;
|
string finalCode = codeTemplate;
|
||||||
var varTokens = varPart.Split(' ', StringSplitOptions.RemoveEmptyEntries);
|
var varTokens = varPart.Split(' ', StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
|
||||||
// <20>ȴ<EFBFBD><C8B4><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>滻
|
for (long j = 1; j < varTokens.Length; j++)
|
||||||
for (int j = 1; j < varTokens.Length; j++) // <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>һ<EFBFBD><D2BB><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
|
|
||||||
{
|
{
|
||||||
var token = varTokens[j];
|
var token = varTokens[j];
|
||||||
if (token == "[]")
|
if (token == "[]")
|
||||||
{
|
{
|
||||||
// varPart <20>е<EFBFBD> [] <20>Ѿ<EFBFBD><D1BE><EFBFBD> args ʹ<><CAB9><EFBFBD><EFBFBD>
|
finalCode = finalCode.Replace("[]", argValue);
|
||||||
// codeTemplate <20>п<EFBFBD><D0BF><EFBFBD>Ҳ<EFBFBD><D2B2> []<5D><><EFBFBD><EFBFBD>Ҫ<EFBFBD>滻
|
|
||||||
finalCode = finalCode.Replace("[]", args);
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -504,179 +551,12 @@ public static class Branswe
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// 5. ִ<><D6B4>
|
|
||||||
Branswe.Run(finalCode);
|
Branswe.Run(finalCode);
|
||||||
return;
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// û<><C3BB>ƥ<EFBFBD><C6A5>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>ִ<EFBFBD><D6B4>
|
|
||||||
Branswe.Run(line);
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
case "cat":
|
|
||||||
{
|
|
||||||
// 与CMLeonOS兼容,支持cat命令
|
|
||||||
var parts = line.Split(" ", 2);
|
|
||||||
if (parts.Length < 2)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Error: Please specify file name");
|
|
||||||
Console.WriteLine("Usage: cat <filename>");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
string filePath = parts[1];
|
|
||||||
if (!File.Exists(filePath))
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Error: File not found: {filePath}");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
string content = File.ReadAllText(filePath);
|
|
||||||
Console.WriteLine(content);
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Error reading file: {ex.Message}");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "echo":
|
|
||||||
{
|
|
||||||
// 与CMLeonOS兼容,支持echo命令
|
|
||||||
var parts = line.Split(" ", 2);
|
|
||||||
if (parts.Length < 2)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Error: Please specify text");
|
|
||||||
Console.WriteLine("Usage: echo <text>");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
File.WriteAllText(parts[1], parts[0]);
|
|
||||||
Console.WriteLine("Text written successfully.");
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Error writing file: {ex.Message}");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "ls":
|
|
||||||
{
|
|
||||||
// 与CMLeonOS兼容,支持ls命令
|
|
||||||
var parts = line.Split(" ", 2);
|
|
||||||
string dirPath = parts.Length >= 2 ? parts[1] : "";
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
if (Directory.Exists(dirPath))
|
|
||||||
{
|
|
||||||
var files = Directory.GetFiles(dirPath);
|
|
||||||
var dirs = Directory.GetDirectories(dirPath);
|
|
||||||
|
|
||||||
foreach (var file in files)
|
|
||||||
{
|
|
||||||
Console.WriteLine($" {file}");
|
|
||||||
}
|
|
||||||
foreach (var dir in dirs)
|
|
||||||
{
|
|
||||||
Console.WriteLine($" [{dir}]/");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Error: Directory not found: {dirPath}");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Error listing directory: {ex.Message}");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "pwd":
|
|
||||||
{
|
|
||||||
// 与CMLeonOS兼容,支持pwd命令
|
|
||||||
Console.WriteLine("0:\\");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "mkdir":
|
|
||||||
{
|
|
||||||
// 与CMLeonOS兼容,支持mkdir命令
|
|
||||||
var parts = line.Split(" ", 2);
|
|
||||||
if (parts.Length < 2)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Error: Please specify directory name");
|
|
||||||
Console.WriteLine("Usage: mkdir <dirname>");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Directory.CreateDirectory(parts[1]);
|
|
||||||
Console.WriteLine($"Directory created: {parts[1]}");
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Error creating directory: {ex.Message}");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "rm":
|
|
||||||
{
|
|
||||||
// 与CMLeonOS兼容,支持rm命令
|
|
||||||
var parts = line.Split(" ", 2);
|
|
||||||
if (parts.Length < 2)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Error: Please specify file name");
|
|
||||||
Console.WriteLine("Usage: rm <filename>");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
string filePath = parts[1];
|
|
||||||
try
|
|
||||||
{
|
|
||||||
File.Delete(filePath);
|
|
||||||
Console.WriteLine($"File deleted: {filePath}");
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Error deleting file: {ex.Message}");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
case "rmdir":
|
|
||||||
{
|
|
||||||
// 与CMLeonOS兼容,支持rmdir命令
|
|
||||||
var parts = line.Split(" ", 2);
|
|
||||||
if (parts.Length < 2)
|
|
||||||
{
|
|
||||||
Console.WriteLine("Error: Please specify directory name");
|
|
||||||
Console.WriteLine("Usage: rmdir <dirname>");
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
|
||||||
Directory.Delete(parts[1]);
|
|
||||||
Console.WriteLine($"Directory deleted: {parts[1]}");
|
|
||||||
}
|
|
||||||
catch (Exception ex)
|
|
||||||
{
|
|
||||||
Console.WriteLine($"Error deleting directory: {ex.Message}");
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
// default:
|
|
||||||
// {
|
|
||||||
// // û<><C3BB>ƥ<EFBFBD><C6A5>ķ<EFBFBD><C4B7><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>ֱ<EFBFBD><D6B1>ִ<EFBFBD><D6B4>
|
|
||||||
// Branswe.Run(line);
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
277
Branswe.md
277
Branswe.md
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## 简介
|
## 简介
|
||||||
|
|
||||||
Branswe是一种简单的编程语言,用于CMLeonOS系统中进行脚本编写和自动化操作。它提供了基本的控制台操作、变量管理、条件判断等功能。
|
Branswe是一种简单的编程语言,用于CMLeonOS系统中进行脚本编写和自动化操作。它提供了基本的控制台操作、变量管理、条件判断、循环、文件系统操作等功能。
|
||||||
|
|
||||||
## 基本语法
|
## 基本语法
|
||||||
|
|
||||||
@@ -18,28 +18,46 @@ Branswe是一种简单的编程语言,用于CMLeonOS系统中进行脚本编
|
|||||||
|
|
||||||
## 变量操作
|
## 变量操作
|
||||||
|
|
||||||
### 定义变量
|
|
||||||
```
|
|
||||||
var() 变量名 = 值
|
|
||||||
```
|
|
||||||
|
|
||||||
### 定义文本变量
|
### 定义文本变量
|
||||||
```
|
```
|
||||||
var(text) 变量名 = 文本内容
|
var(text) 变量名 = 值
|
||||||
```
|
```
|
||||||
|
|
||||||
### 显示变量
|
### 变量赋值
|
||||||
|
```
|
||||||
|
var() 变量名 = 变量2
|
||||||
|
```
|
||||||
|
|
||||||
|
### 变量删除
|
||||||
|
```
|
||||||
|
var() 变量名 rm
|
||||||
|
```
|
||||||
|
|
||||||
|
### 变量运算
|
||||||
|
```
|
||||||
|
var() 变量名 =+ 变量2
|
||||||
|
var() 变量名 =- 变量2
|
||||||
|
var() 变量名 =* 变量2
|
||||||
|
var() 变量名 =/ 变量2
|
||||||
|
```
|
||||||
|
|
||||||
|
### 获取变量值
|
||||||
|
```
|
||||||
|
ref getvar 变量名
|
||||||
|
```
|
||||||
|
|
||||||
|
## 控制台操作
|
||||||
|
|
||||||
|
### 显示文本(不换行)
|
||||||
```
|
```
|
||||||
conshow 变量名
|
conshow 变量名
|
||||||
```
|
```
|
||||||
|
|
||||||
### 显示变量列表
|
### 显示文本(换行)
|
||||||
```
|
```
|
||||||
conshowl
|
conshowl 变量名
|
||||||
```
|
```
|
||||||
|
|
||||||
## 控制台操作
|
|
||||||
|
|
||||||
### 清屏
|
### 清屏
|
||||||
```
|
```
|
||||||
concls
|
concls
|
||||||
@@ -47,133 +65,163 @@ concls
|
|||||||
|
|
||||||
### 输入
|
### 输入
|
||||||
```
|
```
|
||||||
coninput 提示文本
|
coninput 变量名
|
||||||
```
|
```
|
||||||
|
|
||||||
### 显示文本
|
### 蜂鸣
|
||||||
```
|
```
|
||||||
conshow 文本内容
|
conbeep
|
||||||
|
```
|
||||||
|
|
||||||
|
## 系统引用
|
||||||
|
|
||||||
|
### 鼠标位置
|
||||||
|
```
|
||||||
|
ref mousex
|
||||||
|
ref mousey
|
||||||
|
```
|
||||||
|
|
||||||
|
### 屏幕尺寸
|
||||||
|
```
|
||||||
|
ref screenx
|
||||||
|
ref screeny
|
||||||
|
```
|
||||||
|
|
||||||
|
### 控制台颜色
|
||||||
|
```
|
||||||
|
ref concolour-b
|
||||||
|
ref concolour-f
|
||||||
|
```
|
||||||
|
|
||||||
|
### 磁盘信息
|
||||||
|
```
|
||||||
|
ref getalldisks
|
||||||
```
|
```
|
||||||
|
|
||||||
## 条件判断
|
## 条件判断
|
||||||
|
|
||||||
|
### decide语句
|
||||||
|
```
|
||||||
|
decide 变量1 操作符 变量2
|
||||||
|
```
|
||||||
|
|
||||||
|
支持的操作符:
|
||||||
|
- `==` 等于
|
||||||
|
- `!=` 不等于
|
||||||
|
- `>` 大于
|
||||||
|
- `<` 小于
|
||||||
|
- `>=` 大于等于
|
||||||
|
- `<=` 小于等于
|
||||||
|
|
||||||
### if语句
|
### if语句
|
||||||
```
|
```
|
||||||
if 条件
|
if 条件 then 真代码 else 假代码
|
||||||
then
|
|
||||||
条件为真时执行的代码
|
|
||||||
else
|
|
||||||
条件为假时执行的代码
|
|
||||||
end
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 示例
|
### 示例
|
||||||
```
|
```
|
||||||
if hello == world
|
var(text) num1 = 10
|
||||||
then
|
var(text) num2 = 20
|
||||||
conshow match
|
decide num1 == num2
|
||||||
else
|
if [] then conshow match else conshow no match
|
||||||
conshow no match
|
|
||||||
end
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 循环
|
## 循环
|
||||||
|
|
||||||
### loop语句
|
### loop语句
|
||||||
```
|
```
|
||||||
loop 次数
|
loop << 变量名
|
||||||
循环体代码
|
|
||||||
end
|
|
||||||
```
|
```
|
||||||
|
|
||||||
|
执行变量中的代码,无限循环。
|
||||||
|
|
||||||
### 示例
|
### 示例
|
||||||
```
|
```
|
||||||
loop 5
|
var(text) code = conshow hello
|
||||||
conshow count: i
|
loop << code
|
||||||
var(text) count = i
|
|
||||||
conshow count: count
|
|
||||||
end
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 字符串操作
|
## 字符串操作
|
||||||
|
|
||||||
### 读取字符串
|
### 读取字符串并执行
|
||||||
```
|
```
|
||||||
rstr 变量名
|
rstr 变量名
|
||||||
```
|
```
|
||||||
|
|
||||||
|
执行变量中存储的代码(支持\n换行)。
|
||||||
|
|
||||||
### 示例
|
### 示例
|
||||||
```
|
```
|
||||||
var() myString = Hello, World!
|
var(text) mycode = conshow hello\nconshow world
|
||||||
rstr myString
|
rstr mycode
|
||||||
conshow myString
|
|
||||||
```
|
```
|
||||||
|
|
||||||
## 数学运算
|
## 文件系统操作
|
||||||
|
|
||||||
### 加法
|
### 注册VFS
|
||||||
```
|
```
|
||||||
var(text) result = num1
|
diskfile reg
|
||||||
var(text) num1 = 10
|
|
||||||
var(text) num2 = 20
|
|
||||||
rstr result + num1 + num2
|
|
||||||
conshow result
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 减法
|
### 创建文件
|
||||||
```
|
```
|
||||||
var(text) result = num1
|
diskfile create file 路径
|
||||||
var(text) num1 = 10
|
|
||||||
var(text) num2 = 20
|
|
||||||
rstr result + num1 - num2
|
|
||||||
conshow result
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 乘法
|
### 创建目录
|
||||||
```
|
```
|
||||||
var(text) result = num1
|
diskfile create dir 路径
|
||||||
var(text) num1 = 10
|
|
||||||
var(text) num2 = 20
|
|
||||||
rstr result + num1 * num2
|
|
||||||
conshow result
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 除法
|
### 写入文件
|
||||||
```
|
```
|
||||||
var(text) result = num1
|
diskfile write 内容 to 路径
|
||||||
var(text) num1 = 10
|
```
|
||||||
var(text) num2 = 20
|
|
||||||
rstr result + num1 / num2
|
### 示例
|
||||||
conshow result
|
```
|
||||||
|
diskfile reg
|
||||||
|
diskfile create file /test.txt
|
||||||
|
var(text) content = Hello, World!
|
||||||
|
diskfile write content to /test.txt
|
||||||
```
|
```
|
||||||
|
|
||||||
## 系统功能
|
## 系统功能
|
||||||
|
|
||||||
### 扬声器
|
|
||||||
```
|
|
||||||
conbeep
|
|
||||||
```
|
|
||||||
|
|
||||||
### 睡眠
|
### 睡眠
|
||||||
```
|
```
|
||||||
sleep 毫秒数
|
sleep 变量名
|
||||||
```
|
```
|
||||||
|
|
||||||
### 获取磁盘信息
|
### 电源管理
|
||||||
```
|
```
|
||||||
getalldisks
|
power off
|
||||||
|
power reboot
|
||||||
|
```
|
||||||
|
|
||||||
|
### 结束程序
|
||||||
|
```
|
||||||
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
## 方法定义
|
## 方法定义
|
||||||
|
|
||||||
### 定义方法
|
### 定义方法
|
||||||
```
|
```
|
||||||
method 方法名 << 参数名 >> 代码
|
method 变量部分 << 代码部分
|
||||||
|
```
|
||||||
|
|
||||||
|
### 调用方法
|
||||||
|
```
|
||||||
|
方法名 参数
|
||||||
```
|
```
|
||||||
|
|
||||||
### 示例
|
### 示例
|
||||||
```
|
```
|
||||||
method print << name >> conshow name
|
var(text) printname = print
|
||||||
|
var(text) myname = Leon
|
||||||
|
method printname [] << conshow []
|
||||||
|
printname myname
|
||||||
```
|
```
|
||||||
|
|
||||||
## 完整示例
|
## 完整示例
|
||||||
@@ -181,83 +229,72 @@ method print << name >> conshow name
|
|||||||
### 示例1:Hello World
|
### 示例1:Hello World
|
||||||
```
|
```
|
||||||
# 简单的Hello World程序
|
# 简单的Hello World程序
|
||||||
conshow hello
|
|
||||||
var(text) hello = Hello, Branswe!
|
var(text) hello = Hello, Branswe!
|
||||||
conshow hello
|
conshow hello
|
||||||
```
|
```
|
||||||
|
|
||||||
### 示例2:变量操作
|
### 示例2:变量操作
|
||||||
```
|
```
|
||||||
# 变量定义和显示
|
# 变量定义和运算
|
||||||
var() name = LeonOS
|
var(text) num1 = 10
|
||||||
var(text) greeting = Hello, name!
|
var(text) num2 = 20
|
||||||
conshow greeting
|
var() num1 =+ num2
|
||||||
|
conshowl num1
|
||||||
```
|
```
|
||||||
|
|
||||||
### 示例3:条件判断
|
### 示例3:条件判断
|
||||||
```
|
```
|
||||||
# 条件判断示例
|
# 条件判断示例
|
||||||
if greeting == Hello, name!
|
var(text) a = 10
|
||||||
then
|
var(text) b = 20
|
||||||
conshow match
|
decide a < b
|
||||||
else
|
if [] then conshow a is smaller else conshow a is larger
|
||||||
conshow no match
|
|
||||||
end
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 示例4:循环
|
### 示例4:循环
|
||||||
```
|
```
|
||||||
# 循环示例
|
# 循环示例
|
||||||
loop 5
|
var(text) code = conshow loop\nsleep 1000
|
||||||
conshow count: i
|
loop << code
|
||||||
var(text) count = i
|
|
||||||
conshow count: count
|
|
||||||
end
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 示例5:数学运算
|
### 示例5:文件操作
|
||||||
```
|
```
|
||||||
# 数学运算示例
|
# 文件操作示例
|
||||||
var(text) result = 10
|
diskfile reg
|
||||||
var(text) num1 = 5
|
diskfile create file /test.txt
|
||||||
var(text) num2 = 3
|
var(text) content = Hello, File System!
|
||||||
rstr result + num1 * num2
|
diskfile write content to /test.txt
|
||||||
conshow result
|
|
||||||
```
|
```
|
||||||
|
|
||||||
### 示例6:系统功能
|
### 示例6:系统功能
|
||||||
```
|
```
|
||||||
# 系统功能示例
|
# 系统功能示例
|
||||||
conbeep
|
conbeep
|
||||||
sleep 1000
|
var(text) wait = 1000
|
||||||
getalldisks
|
sleep wait
|
||||||
|
ref mousex
|
||||||
|
conshowl []
|
||||||
```
|
```
|
||||||
|
|
||||||
## 与CMLeonOS的集成
|
### 示例7:自定义方法
|
||||||
|
|
||||||
### 在CMLeonOS中使用
|
|
||||||
```
|
```
|
||||||
branswe example.bran
|
# 自定义方法示例
|
||||||
|
var(text) greet = greet
|
||||||
|
var(text) name = Leon
|
||||||
|
method greet [] << conshow Hello, []!
|
||||||
|
greet name
|
||||||
```
|
```
|
||||||
|
|
||||||
### 支持的命令
|
|
||||||
- `cat` - 显示文件内容
|
|
||||||
- `echo` - 写入文件
|
|
||||||
- `ls` - 列出目录
|
|
||||||
- `pwd` - 显示当前目录
|
|
||||||
- `mkdir` - 创建目录
|
|
||||||
- `rm` - 删除文件
|
|
||||||
- `rmdir` - 删除目录
|
|
||||||
|
|
||||||
## 注意事项
|
## 注意事项
|
||||||
|
|
||||||
1. **大小写敏感**:命令和变量名区分大小写
|
1. **大小写敏感**:命令和变量名区分大小写
|
||||||
2. **空格处理**:参数之间用空格分隔
|
2. **空格处理**:参数之间用空格分隔
|
||||||
3. **错误处理**:不支持的命令会显示错误消息
|
3. **变量存储**:所有变量都作为文本存储,运算时会自动转换
|
||||||
4. **注释支持**:使用#号添加注释
|
4. **注释支持**:使用#号添加注释
|
||||||
5. **变量作用域**:变量在整个脚本中有效
|
5. **变量作用域**:变量在整个脚本中有效
|
||||||
6. **条件嵌套**:支持多层条件判断
|
6. **无限循环**:loop命令会无限循环,需要使用end或其他方式退出
|
||||||
7. **循环嵌套**:支持多层循环
|
7. **文件系统**:使用diskfile前需要先执行diskfile reg注册VFS
|
||||||
|
|
||||||
## 最佳实践
|
## 最佳实践
|
||||||
|
|
||||||
@@ -275,8 +312,16 @@ branswe example.bran
|
|||||||
|
|
||||||
## 更新日志
|
## 更新日志
|
||||||
|
|
||||||
|
### 版本2.0
|
||||||
|
- 更新了所有命令的实际语法
|
||||||
|
- 添加了文件系统操作支持
|
||||||
|
- 添加了系统引用命令
|
||||||
|
- 添加了电源管理功能
|
||||||
|
- 添加了自定义方法功能
|
||||||
|
- 修正了条件判断和循环的语法
|
||||||
|
- 完善了变量操作命令
|
||||||
|
|
||||||
### 版本1.0
|
### 版本1.0
|
||||||
- 初始版本
|
- 初始版本
|
||||||
- 添加了CMLeonOS兼容性支持
|
- 添加了CMLeonOS兼容性支持
|
||||||
- 完善了错误处理
|
- 完善了错误处理
|
||||||
- 添加了文件操作支持
|
|
||||||
|
|||||||
172
EnvironmentVariableManager.cs
Normal file
172
EnvironmentVariableManager.cs
Normal file
@@ -0,0 +1,172 @@
|
|||||||
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
using System.IO;
|
||||||
|
|
||||||
|
namespace CMLeonOS
|
||||||
|
{
|
||||||
|
public class EnvironmentVariableManager
|
||||||
|
{
|
||||||
|
private static EnvironmentVariableManager instance;
|
||||||
|
private string envFilePath = @"0:\system\env.dat";
|
||||||
|
private Dictionary<string, string> environmentVariables;
|
||||||
|
|
||||||
|
private EnvironmentVariableManager()
|
||||||
|
{
|
||||||
|
environmentVariables = new Dictionary<string, string>();
|
||||||
|
LoadEnvironmentVariables();
|
||||||
|
}
|
||||||
|
|
||||||
|
public static EnvironmentVariableManager Instance
|
||||||
|
{
|
||||||
|
get
|
||||||
|
{
|
||||||
|
if (instance == null)
|
||||||
|
{
|
||||||
|
instance = new EnvironmentVariableManager();
|
||||||
|
}
|
||||||
|
return instance;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void LoadEnvironmentVariables()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
if (File.Exists(envFilePath))
|
||||||
|
{
|
||||||
|
string[] lines = File.ReadAllLines(envFilePath);
|
||||||
|
foreach (string line in lines)
|
||||||
|
{
|
||||||
|
if (!string.IsNullOrWhiteSpace(line) && line.Contains("="))
|
||||||
|
{
|
||||||
|
int equalIndex = line.IndexOf('=');
|
||||||
|
string varName = line.Substring(0, equalIndex).Trim();
|
||||||
|
string varValue = line.Substring(equalIndex + 1).Trim();
|
||||||
|
environmentVariables[varName] = varValue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Error loading environment variables: {ex.Message}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
private void SaveEnvironmentVariables()
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Saving environment variables to: {envFilePath}");
|
||||||
|
Console.WriteLine($"Variables to save: {environmentVariables.Count}");
|
||||||
|
|
||||||
|
// 构建文件内容
|
||||||
|
string content = "";
|
||||||
|
foreach (var kvp in environmentVariables)
|
||||||
|
{
|
||||||
|
content += $"{kvp.Key}={kvp.Value}\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
Console.WriteLine("Environment variables content:");
|
||||||
|
Console.WriteLine(content);
|
||||||
|
|
||||||
|
// 使用FileSystem的WriteFile方法来确保在Cosmos中正常工作
|
||||||
|
// 注意:这里需要访问FileSystem实例,但EnvironmentVariableManager是独立的
|
||||||
|
// 所以我们使用File.WriteAllText,但添加重试机制
|
||||||
|
|
||||||
|
int retryCount = 0;
|
||||||
|
bool success = false;
|
||||||
|
|
||||||
|
while (retryCount < 3 && !success)
|
||||||
|
{
|
||||||
|
try
|
||||||
|
{
|
||||||
|
File.WriteAllText(envFilePath, content);
|
||||||
|
success = true;
|
||||||
|
Console.WriteLine("Environment variables saved successfully.");
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
retryCount++;
|
||||||
|
Console.WriteLine($"Save attempt {retryCount} failed: {ex.Message}");
|
||||||
|
// Thread.Sleep(1000); // 等待1秒后重试
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!success)
|
||||||
|
{
|
||||||
|
Console.WriteLine("Failed to save environment variables after 3 attempts.");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
catch (Exception ex)
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Error saving environment variables: {ex.Message}");
|
||||||
|
Console.WriteLine($"Exception type: {ex.GetType().Name}");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool SetVariable(string varName, string varValue)
|
||||||
|
{
|
||||||
|
if (string.IsNullOrWhiteSpace(varName))
|
||||||
|
{
|
||||||
|
Console.WriteLine("Error: Variable name cannot be empty");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
environmentVariables[varName] = varValue;
|
||||||
|
SaveEnvironmentVariables();
|
||||||
|
Console.WriteLine($"Environment variable '{varName}' set to '{varValue}'");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
public string GetVariable(string varName)
|
||||||
|
{
|
||||||
|
if (environmentVariables.ContainsKey(varName))
|
||||||
|
{
|
||||||
|
return environmentVariables[varName];
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Error: Environment variable '{varName}' not found");
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public void ListVariables()
|
||||||
|
{
|
||||||
|
if (environmentVariables.Count == 0)
|
||||||
|
{
|
||||||
|
Console.WriteLine("No environment variables set.");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("====================================");
|
||||||
|
Console.WriteLine(" Environment Variables");
|
||||||
|
Console.WriteLine("====================================");
|
||||||
|
Console.WriteLine();
|
||||||
|
foreach (var kvp in environmentVariables)
|
||||||
|
{
|
||||||
|
Console.WriteLine($" {kvp.Key}={kvp.Value}");
|
||||||
|
}
|
||||||
|
Console.WriteLine();
|
||||||
|
Console.WriteLine($"Total: {environmentVariables.Count} variables");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
public bool DeleteVariable(string varName)
|
||||||
|
{
|
||||||
|
if (environmentVariables.ContainsKey(varName))
|
||||||
|
{
|
||||||
|
environmentVariables.Remove(varName);
|
||||||
|
SaveEnvironmentVariables();
|
||||||
|
Console.WriteLine($"Environment variable '{varName}' deleted");
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Error: Environment variable '{varName}' not found");
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -56,6 +56,14 @@ namespace CMLeonOS
|
|||||||
// 初始化用户系统
|
// 初始化用户系统
|
||||||
userSystem = new UserSystem();
|
userSystem = new UserSystem();
|
||||||
|
|
||||||
|
// 检查env.dat文件是否存在,如果不存在则创建并设置Test环境变量
|
||||||
|
string envFilePath = @"0:\system\env.dat";
|
||||||
|
if (!System.IO.File.Exists(envFilePath))
|
||||||
|
{
|
||||||
|
System.IO.File.WriteAllText(envFilePath, "Test=123");
|
||||||
|
Console.WriteLine("Created env.dat with Test=123");
|
||||||
|
}
|
||||||
|
|
||||||
// 循环直到登录成功或退出
|
// 循环直到登录成功或退出
|
||||||
while (true)
|
while (true)
|
||||||
{
|
{
|
||||||
|
|||||||
116
Shell.cs
116
Shell.cs
@@ -1,6 +1,7 @@
|
|||||||
using System;
|
using System;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
using System.IO;
|
using System.IO;
|
||||||
|
using System.Linq;
|
||||||
using Sys = Cosmos.System;
|
using Sys = Cosmos.System;
|
||||||
|
|
||||||
namespace CMLeonOS
|
namespace CMLeonOS
|
||||||
@@ -12,12 +13,14 @@ namespace CMLeonOS
|
|||||||
private FileSystem fileSystem;
|
private FileSystem fileSystem;
|
||||||
private UserSystem userSystem;
|
private UserSystem userSystem;
|
||||||
private bool fixMode;
|
private bool fixMode;
|
||||||
|
private EnvironmentVariableManager envManager;
|
||||||
|
|
||||||
public Shell(UserSystem userSystem)
|
public Shell(UserSystem userSystem)
|
||||||
{
|
{
|
||||||
this.userSystem = userSystem;
|
this.userSystem = userSystem;
|
||||||
fileSystem = new FileSystem();
|
fileSystem = new FileSystem();
|
||||||
fixMode = Kernel.FixMode;
|
fixMode = Kernel.FixMode;
|
||||||
|
envManager = EnvironmentVariableManager.Instance;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Run()
|
public void Run()
|
||||||
@@ -147,6 +150,10 @@ namespace CMLeonOS
|
|||||||
" user delete <username> - Delete user",
|
" user delete <username> - Delete user",
|
||||||
" user list - List all users",
|
" user list - List all users",
|
||||||
" cpass - Change password",
|
" cpass - Change password",
|
||||||
|
" env <cmd> - Environment variables",
|
||||||
|
" env see <varname> - Show variable value",
|
||||||
|
" env change <varname> <value> - Set variable value",
|
||||||
|
" env delete <varname> - Delete variable",
|
||||||
" beep - Play beep sound",
|
" beep - Play beep sound",
|
||||||
" branswe <filename> - Execute Branswe code file",
|
" branswe <filename> - Execute Branswe code file",
|
||||||
" version - Show OS version",
|
" version - Show OS version",
|
||||||
@@ -372,6 +379,9 @@ namespace CMLeonOS
|
|||||||
case "beep":
|
case "beep":
|
||||||
Console.Beep();
|
Console.Beep();
|
||||||
break;
|
break;
|
||||||
|
case "env":
|
||||||
|
ProcessEnvCommand(args);
|
||||||
|
break;
|
||||||
case "branswe":
|
case "branswe":
|
||||||
ProcessBransweCommand(args);
|
ProcessBransweCommand(args);
|
||||||
break;
|
break;
|
||||||
@@ -1056,5 +1066,111 @@ namespace CMLeonOS
|
|||||||
Console.WriteLine($"Error executing Branswe: {ex.Message}");
|
Console.WriteLine($"Error executing Branswe: {ex.Message}");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void ProcessEnvCommand(string args)
|
||||||
|
{
|
||||||
|
string[] parts = args.Split(new char[] { ' ' }, StringSplitOptions.RemoveEmptyEntries);
|
||||||
|
|
||||||
|
if (parts.Length == 0)
|
||||||
|
{
|
||||||
|
envManager.ListVariables();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
string command = parts[0].ToLower();
|
||||||
|
|
||||||
|
switch (command)
|
||||||
|
{
|
||||||
|
case "list":
|
||||||
|
envManager.ListVariables();
|
||||||
|
break;
|
||||||
|
case "see":
|
||||||
|
if (parts.Length >= 2)
|
||||||
|
{
|
||||||
|
string varName = parts[1];
|
||||||
|
string varValue = envManager.GetVariable(varName);
|
||||||
|
if (varValue != null)
|
||||||
|
{
|
||||||
|
Console.WriteLine($" {varName}={varValue}");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Error: Environment variable '{varName}' not found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Error: Please specify variable name");
|
||||||
|
Console.WriteLine("Usage: env see <varname>");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "add":
|
||||||
|
if (parts.Length >= 3)
|
||||||
|
{
|
||||||
|
string varName = parts[1];
|
||||||
|
string varValue = parts.Length > 2 ? string.Join(" ", parts.Skip(2).ToArray()) : "";
|
||||||
|
|
||||||
|
if (envManager.SetVariable(varName, varValue))
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Environment variable '{varName}' added");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Error: Failed to add environment variable '{varName}'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Error: Please specify variable name and value");
|
||||||
|
Console.WriteLine("Usage: env add <varname> <value>");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "change":
|
||||||
|
if (parts.Length >= 3)
|
||||||
|
{
|
||||||
|
string varName = parts[1];
|
||||||
|
string varValue = parts.Length > 2 ? string.Join(" ", parts.Skip(2).ToArray()) : "";
|
||||||
|
|
||||||
|
if (envManager.SetVariable(varName, varValue))
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Environment variable '{varName}' set to '{varValue}'");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Error: Failed to set environment variable '{varName}'");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Error: Please specify variable name and value");
|
||||||
|
Console.WriteLine("Usage: env change <varname> <value>");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case "delete":
|
||||||
|
if (parts.Length >= 2)
|
||||||
|
{
|
||||||
|
string varName = parts[1];
|
||||||
|
|
||||||
|
if (envManager.DeleteVariable(varName))
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Environment variable '{varName}' deleted");
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine($"Error: Environment variable '{varName}' not found");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
Console.WriteLine("Error: Please specify variable name");
|
||||||
|
Console.WriteLine("Usage: env delete <varname>");
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
Console.WriteLine("Error: Invalid env command");
|
||||||
|
Console.WriteLine("Usage: env [list] | env see <varname> | env add <varname> <value> | env change <varname> <value> | env delete <varname>");
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user