我已经关注了.bat
- 建议用于打开完全正常java_cmd
便携式任务的文件。
@echo off
cd /d "%~dp0"
:: cd ..\CommonFiles
:: set Path=%cd%\bin;%path%
set Path=%~d0\PortableApps\CommonFiles\bin;%path%
:: set "JAVA_HOME=%~d0\PortableApps\CommonFiles\jre"
set "JAVA_HOME=%~d0\PortableApps\CommonFiles"
nircmd regsetval dword "HKCU\console" "QuickEdit" "1" >nul 2>&1
cd /d "\Documents\workspaces\java"
start "Java_cmd" cmd /k "cs -w 100x25 -b 100x3000"
到目前为止,我已翻译成以下内容:
using Microsoft.Win32;
using System;
using System.Diagnostics;
using System.IO;
using System.Reflection;
using System.Runtime.InteropServices;
using con = System.Console;
namespace javacmd
{
class Program
{
const int HWND_BROADCAST = 0xffff;
const uint WM_SETTINGCHANGE = 0x001a;
[DllImport("user32", SetLastError = true, CharSet = CharSet.Auto)]
static extern bool SendNotifyMessage(IntPtr hWnd, uint Msg, UIntPtr wParam, string lParam);
static string codeBase = Assembly.GetExecutingAssembly().CodeBase;
static string drive = Path.GetPathRoot(codeBase);
static string oldjavahome = "";
static int Main(string[] args)
{
PrintOutStart();
string args0 = null;
try
{
if (args == null || args0 == "?" || args0 == "/?" || args0 == "--?" || args0 == "help" || args0 == "/help" || args0 == "--help")
{
return PrintOutHelp();
}
else
{
args0 = args[0];
}
}
catch
{
return PrintOutHelp();
}
if (args0 != null)
{
if (!File.Exists(args0+ ".java"))
{
con.WriteLine($"Error: FileNotFound!\nDie Datei {args0} wurde nicht gefunden. Bitte überprüfen Sie, dass\nSie den Namen richtig geschrieben haben!");
con.WriteLine("");
con.Write("Drücken Sie eine beliebige Taste . . . ");
con.ReadLine();
return 1;
}
else
{
string javahome = Path.Combine(drive, @"PortableApps\CommonFiles");
string javabin = Path.Combine(drive, @"PortableApps\CommonFiles\bin");
using (var key = Registry.LocalMachine.OpenSubKey(@"SYSTEM\CurrentControlSet\Control\Session Manager\Environment", true))
{
var ojh = key.GetValue("JAVA_HOME");
if (ojh != null)
{
oldjavahome = ojh.ToString();
if (oldjavahome != javahome)
{
key.SetValue("JAVA_HOME", javahome);
}
}
var path = key.GetValue("path");
if (path != null)
{
if (!path.ToString().Contains(javabin))
{
key.SetValue("Path", javabin + ";" + path);
}
}
SendNotifyMessage((IntPtr)HWND_BROADCAST, WM_SETTINGCHANGE, (UIntPtr)0, "Environment");
}
Process p = new Process() { StartInfo = new ProcessStartInfo() { FileName = "javac", Arguments = $"{args0}.java", CreateNoWindow = true, RedirectStandardOutput = true } };
try
{
p.Start();
p.WaitForExit();
con.WriteLine($"output javac: \"{p.StandardOutput}\"");
}
catch
{
con.WriteLine("Error while compiling!\nFehler während des Kompilier-Vorgangs!");
con.WriteLine("");
con.Write("Drücken Sie eine beliebige Taste . . . ");
con.ReadLine();
return 1;
}
p.StartInfo.FileName = "java";
p.StartInfo.Arguments = args0;
try
{
p.Start();
p.WaitForExit();
con.WriteLine($"output java: \"{p.StandardOutput}\"");
}
catch
{
con.WriteLine("Fehler während des Start-Vorgangs!");
con.WriteLine("");
con.Write("Drücken Sie eine beliebige Taste . . . ");
con.ReadLine();
return 1;
}
}
}
else
{
con.WriteLine("Der benötigte Parameter \"args0\" hat den Wert \"null\". Bitte versuchen Sie es erneut!");
con.WriteLine("");
con.Write("Drücken Sie eine beliebige Taste . . . ");
con.ReadLine();
return 1;
}
return 0;
}
private static void PrintOutStart()
{
con.WriteLine("");
con.WriteLine("###################################################");
con.WriteLine("# #");
con.WriteLine("# javacmd #");
con.WriteLine("# #");
con.WriteLine("###################################################");
con.WriteLine("");
}
private static int PrintOutHelp()
{
string name = Path.GetFileNameWithoutExtension(codeBase);
con.WriteLine("Der javacmd compiliert und startet eine angegebene .java-Datei mit nur einem Befehl.");
con.WriteLine("");
con.WriteLine("Syntax: " + name + ".exe [name | [ | / | --]? | [ | / | --]help]");
con.WriteLine("");
con.WriteLine(" name\t\t\tDie zu startende Datei (ohne die Endung \".java\").");
con.WriteLine(" [ | / | --]?\t\tZeigt die Hilfe an. Dies entspricht einer Eingabe ohne Optionen.");
con.WriteLine(" [ | / | --]help\tZeigt die Hilfe an. Dies entspricht einer Eingabe ohne Optionen.");
con.WriteLine("");
con.WriteLine("Wird der javacmd ohne Argument aufgerufen, zeigt er diese Hilfe an.");
con.WriteLine("");
con.Write("Drücken Sie eine beliebige Taste . . . ");
con.ReadLine();
return 1;
}
}
}
问题是它在打开reigstry键时抛出System.Security.SecurityException
。我认为这是由于缺少管理员权限造成的 - 我不想在我想要使用该程序的所有计算机上获得这些权限。如何使此代码与批处理代码一样运行?
我的程序位于\Documents\workspaces\java
,其中Documents
是(root)usb驱动器的子代。
提前致谢!