Heute in der Firma zusammengetippt, getestet, läuft bisher an 2 Test-PCs und wird in naher Zukunft verteilt.
Für alle, die es interessiert und natürlich für hilfreiches Feedback, was man verbessern könnte.

Mein .NET Framework 4.5 Deployment Batch Script:

Color 9f
@echo on
title Installiere .NET Framework 4.5...
setlocal

:: dotnet45-installer.bat
:: Installiert .NET Framework 4.5 silent mit Logging
:: Hannes Schurig	- 11.09.2012
:: Letzte Änderung	- Version 0.4 am 11.09.2012

set wd=\\server\dotNET_Framework\45
set log=\\server\dotNET_Framework\45\log.txt

:checkversion
REM prüfe ob .NET 4.5 schon installiert ist
for /f "tokens=1,2,3 delims= " %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" /v "Version"^|findstr "Version"') do set netversion=%%c
if not %netversion:~0,3%==4.5 goto install
echo %date% %time:~0,5% - %computername% hat schon >> %log%
goto end

:install
%wd%\dotnetfx45_full_x86_x64.exe /passive /log "%wd%\logs\%computername%.txt" /norestart
set netinstallerrlvl=%errorlevel%
if not %netinstallerrlvl%==0 goto fehler

:checkinstallation
REM überprüfe ob die Installation erfolgreich war
for /f "tokens=1,2,3 delims= " %%a in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Client" /v "Version"^|findstr "Version"') do set newnetversion=%%c
if not %newnetversion:~0,3%==4.5 set netinstallerrlvl=99 & goto fehler
if %newnetversion:~0,3%==4.5 echo %date% %time:~0,5% - %computername% hat erfolgreich Version %netversion% installiert >> %log%
goto end

:fehler
REM Return Codes: http://msdn.microsoft.com/en-us/library/ee942965.aspx
if %netinstallerrlvl%==1602 echo echo %date% %time:~0,5% - %computername% FEHLER: Benutzer hat die Installation abgebrochen >> %log%
if %netinstallerrlvl%==1603 echo echo %date% %time:~0,5% - %computername% FEHLER: Ein fataler Installationsfehler ist aufgetreten >> %log%
if %netinstallerrlvl%==1641 echo echo %date% %time:~0,5% - %computername% HINWEIS: Installation erfolgreich aber Neustart notwendig >> %log%
if %netinstallerrlvl%==3010 echo echo %date% %time:~0,5% - %computername% HINWEIS: Installation erfolgreich aber Neustart notwendig >> %log%
if %netinstallerrlvl%==5100 echo echo %date% %time:~0,5% - %computername% FEHLER: Das System entspricht nicht den Anforderungen >> %log%
if %netinstallerrlvl%==99 echo echo %date% %time:~0,5% - %computername% FEHLER: Installationserrorlevel 0 aber erneute Registryprüfung gibt nicht Version 4.5 zurück. Ungewöhnlicher Fall, Überprüfung notwendig >> %log%
goto end

:end
endlocal

Ausgabe in der log.txt ist dann sowas:
11.09.2012 16:40 – IQB177 hat erfolgreich Version 4.5.50709 installiert

Ich benutze momentan noch den Parameter

/passive

, welcher zwar eine GUI anzeigt aber keine Nutzerinteraktion zulässt. Dadurch erfährt aber der Benutzer zumindest den aktuellen Status und Fortschritt der Installation. Vielleicht wechsel ich noch zu

/q

, wo keinerlei GUI zu sehen ist, absolut unsichtbar.

via: .NET Versionsnummern, .NET Framework 4 Deployment, .NET Framework 4 Allgemein

Praktisch auf (indirekter) Anfrage:
Ziel: Anzahl der Ordner und Dateien eines Ordners zählen und verarbeiten

Diese Batch zählt Dateien und Ordner des Ordners, in dem sie sich befindet:

set /A dateien=0
set /A ordner=0
for /F %%i in ('dir /B /A-d') do set /A dateien=dateien+1
for /F %%i in ('dir /B /Ad') do set /A ordner=ordner+1
echo %dateien% Dateien und %ordner% Ordner

Ziemlich einfach.
Dateien/Ordner zählen premium: Nun erweitere ich den Grundaufbau und bastel ein Batch, die per Parameter auch noch einen Ordner entgegennimmt, der verarbeitet werden soll. Der Ordner kann beim Aufruf eingegeben werden oder man zieht einfach im Explorer einen Ordner auf die Batch Datei. Sollte der übergebene Pfad nicht schon in Anführungszeichen stehen wird er in Anführungszeichen gepackt. Wird kein Ordner als Parameter angegeben wird wieder der Ordner, in dem die Batch Datei liegt, genutzt.

@echo off
setlocal
set /A dateien=0
set /A ordner=0
set path=%~1
if (%path%)==() set path=%~dp0
set first=%path:~0,1%
set last=%path:~-1%
if not (%first%)==(^") set path=^"%path%
if not (%last%)==(^") set path=%path%"
for /F %%i in ('dir %path% /B /A-d') do set /A dateien=dateien+1
for /F %%i in ('dir %path% /B /Ad') do set /A ordner=ordner+1
echo %dateien% Dateien und %ordner% Ordner
endlocal

Kurze Codebeschreibung: Pfad auf den Parameter setzen, wenn Pfad nicht gesetzt auf den aktuellen Ordner setzen. Erstes und letztes Zeichen speichern. Beide überprüfen; wenn kein Anführungszeichen dann eins setzen. Anführungszeichen werden hier mit dem ^ Zeichen escaped. Pfad an die Zählroutinen übergeben.

Eine Frage stellt sich mir aber: Ich musste jedes Anführungszeichen escapen bis auf eins: Zeile 10 ganz am Ende. Wird dort das Anführungszeichen escaped dann funktioniert das Programm nicht mehr. Kann mir jemand sagen warum?

via: Dateien/Ordner zählen, Stringkrams, Hochkomma (Anführungszeichen) in Batch escapen

Es geht schnell und einfach: das Messen von Zeit zwischen 2 Messzeitpunkten im PHP Code. Das ermöglicht das Optimieren von PHP, bzw. die Überprüfung von Optimierungen.
Dazu wird die Funktion

microtime()

verwendet, die (bei Verwendung des true Parameters) die Anzahl der Sekunden seit dem Unix Zeitstempel (1.1.1970 00:00) inklusive Millisekunden als Dezimalzahl ausgibt.

In einem Beispiel werde ich einen längeren HTML Code Text umwandeln, 1000 Mal hintereinander. Die Dauer des Vorgangs wird gemessen und dann in 3 Darstellungsweisen ausgegeben.

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

<?php
$string = ' <title>IMA - Informationen Mal Anders</title>

<meta name="keywords" content="Internet, IT, Computer, Programmierung, Software, Web2.0, Administration, Tutorials, Unterhaltung"/>
<meta name="description" content="Bei IMA - Informationen Mal Anders k&ouml;nnt ihr regelmäßig Neues über IT, Internet, Programmierung und Software erfahren."/>
<meta name="DC.Description" content="Bei IMA - Informationen Mal Anders k&ouml;nnt ihr regelmäßig Neues über IT, Internet, Programmierung und Software erfahren. Zusätzlich interagiere ich gerne mit meinen Lesern, diskutiere, lasse mich begeistern und lerne dazu."/>
<meta name="title" content="IMA - Informationen Mal Anders"/>
<meta name="language" content="German, de, deutsch"/>
<meta name="author" content="Hannes Schurig"/>
<meta name="publisher" content="Hannes Schurig"/>
<meta name="copyright" content="Hannes Schurig"/>
<meta name="date" content="2009-01-06"/>
<meta name="page-topic" content="Neuigkeiten aus Alltag und IT"/>
<meta name="page-type" content="Informationen, Programmierung, Anleitungen"/>
<meta name="audience" content="alle"/>
<meta name="robots" content="index,follow"/>
<meta name="generator" content="http://hannes-schurig.de"/>

<meta http-equiv="X-UA-Compatible" content="chrome=1"/>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
           ';

function convert($string)   {
    $string = htmlentities($string, ENT_QUOTES);
    $string = preg_replace('/\\\\/', "&#092", $string);
    $string = preg_replace('/`/', "&#096", $string);

    return $string;
}
echo ("\n Microtime: ".microtime(true));

$old = microtime(true);
for($i=0;$i<=1000;$i++) {
    convert($string);
}
$time = microtime(true) - $old;

echo ("\n Zeit in Sekunden: ".$time);
echo ("\n Zeit in Millisekunden: ".$time*1000);
echo ("\n Zeit in Mikrosekunden: ".$time*1000000);
echo ("\n Microtime: ".microtime(true));
?>
Demo

Demo

Download

php-stopwatch [.php]

In meinem letzten Post habe ich die Farbgestaltung in Java etwas näher untersucht. Zusätzlich auch die Konsolensteuerung (Cursor bewegen, Konsoleninhalt manipulieren usw) getestet.
Daraus kann man ja schon eine Menge machen. Ich habe mich mal an einen „Splash Screen Generator“ gemacht. Klingt natürlich viel geiler als es ist.
Ziel soll es sein einen beliebigen umrahmten Text in beliebiger Farbgestaltung an beliebiger Stelle auf dem Bildschirm für eine beliebige Zeit anzeigen zu lassen. Für den Benutzer ist das mit 1 Funktionsaufruf besonders einfach gehalten.

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

import java.io.IOException;
import java.io.*;
import org.fusesource.jansi.AnsiConsole;
import org.fusesource.jansi.*;

public class test {
  
  public static final String CLS = "\u001b[2J";
  public static final String TOP = "\u001b[0;1H";
  public static final String UP = "\u001b[1F";
  public static final String LEFT = "\u001b[1G";
  public static final String DEL = "\u001b[2K";
  public static final String DEL_LEFT = "\u001b[1K";
  public static final String DEL_RIGHT = "\u001b[0K";
  public static final String BOLD = "\u001b[1m";
  public static final String RESET = "\u001b[0m";
  public static final String SPLASH = "\u001b[1;37;1;44m";
	
	public static void buildSplashScreen(String[] splash, int time, String Style, int x, int y) throws InterruptedException {
		Ansi ansi=Ansi.ansi();
		
		// get longest element
		int maxlength = 0;
		for(String getmax : splash) {
			if(getmax.length() > maxlength) maxlength = getmax.length();
		}
		
		// old style: AnsiConsole.out.print(SPLASH+"\u001b["+x+";"+y+"H");
		AnsiConsole.out.print(SPLASH+ansi.cursor(x-1,y));
		System.console().printf("\u2554");
		for(int i = 0;i<maxlength+2;i++) {
			System.console().printf("\u2550");
		}
		System.console().printf("\u2557\n");
		for(int j = 0;j < splash.length;j++) {
			AnsiConsole.out.print(ansi.cursor(x,10)); x++;
			System.console().printf("\u2551 " + splash[j] + " \u2551\n");
		}
		AnsiConsole.out.print(ansi.cursor(x,10));
		System.console().printf("\u255A");
		for(int k = 0;k<maxlength+2;k++) {
			System.console().printf("\u2550");
		}
		System.console().printf("\u255D\n");
		
		Thread.sleep(time);
		
		clearScreen();
	}
	
	public static void clearScreen() {
		for(int i=0;i<50;i++)
        {
            AnsiConsole.out.println( RESET + DEL);
        }
        AnsiConsole.out.print( CLS + TOP );
	}

	public static void main(String[] args) throws IOException, InterruptedException {
		
		try {AnsiConsole.systemInstall();}catch(Exception e){}
		Ansi ansi=Ansi.ansi();
		
		String[] splash = new String[9];
		splash[0] = "                                                        ";
		splash[1] = " _    _  _____            ____                          ";
		splash[2] = "| |  | |/ ____|          / _| |                         ";
		splash[3] = "| |__| | (___  ___  ___ | |_| |___      ____ _ _ __ ___ ";
		splash[4] = "|  __  |\\___ \\/ __|/ _ \\|  _| __\\ \\ /\\ / / _` | '__/ _ \\";
		splash[5] = "| |  | |____) \\__ \\ (_) | | | |_ \\ V  V / (_| | | |  __/";
		splash[6] = "|_|  |_|_____/|___/\\___/|_|  \\__| \\_/\\_/ \\__,_|_|  \\___|";
		splash[7] = "                                                        ";
		splash[8] = "                                                        ";
		
		buildSplashScreen(splash, 5000, SPLASH, 10, 10);
		
		try {System.in.read();}catch(Exception e){}
	}
}

Die Funktion buildSplashScreen wird also mit 5 Parametern aufgerufen:

buildSplashScreen(String[] anzuzeigender-Text, int Anzeigedauer-in-Millisekunden, String Unicode-Farbstyle, int x-Koordinate, int y-Koordinate);

Den Anzeigetext als Array (ein- oder mehrzeilig möglich), Backslashes im Anzeigetext müssen natürlich doppelt gesetzt werden, Unicode Farbstyle als String mit einer Form ähnlich wie „\u001b[1;37;1;44m„, x- und y-Koordinate definiert die obere linke Ecke des Splash Screens.

Ausführung in Notepad++:
(schon mehrfach behandelt, aber nochmal zur Erinnerung)
Code anzeigen

(Vorbereitung hier) NppExec Plugin installieren, Batch erstellen mit folgendem Inhalt (oder unten downloaden):

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

@echo off

:: jar(s) specified?
if not [%4]==[] goto jars

:: compile and run without externals jars
if not [%1]==[] javac %1
if not [%2]==[] if not [%3]==[] start cmd.exe /c java -classpath %2 %3

:jars
setlocal enabledelayedexpansion
set /a N=0

:: reads up to 6 externals jars
for /f "tokens=1,2,3 delims=;" %%a in ("%~4") do (
	set /a N+=1
	set j1=%%a
	set j2=%%b
	set j3=%%c
)

set classpath=%~2
set jarpath=%~2
if not [%5]==[] set jarpath=%~5
set jars=.
if not [%j1%]==[] set jars=%jars%;%jarpath%\%j1%
if not [%j2%]==[] set jars=%jars%;%jarpath%\%j2%
if not [%j3%]==[] set jars=%jars%;%jarpath%\%j3%

:: compile and run with external jars
if not [%1]==[] javac -cp "%jars%" %1

if not [%2]==[] if not [%3]==[] start cmd /c ""c:\Program Files\Java\jre7\bin\java" -cp "%jars%;%classpath%" %3"

endlocal

:: usage:

:: just compile
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java"

:: compile with 1 external .jar
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "lib1.jar"

:: compile with 1 external .jar
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "lib1.jar;lib2.jar"

:: just run java code
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm"

:: run java code with one or multiple external jars
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm" "lib1.jar"

:: run java code with one or multiple external jars - up to 3 jars supported (change lines 15-28 [if you know batch] for more)
:: usage: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm" "lib1.jar;lib2.jar;jcurse.jar"

:: Notepad++ F6 Code: 
::   NPP_SAVE
::   ?:\path\to\executor.bat "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(NAME_PART)" "one_or_multiple_external.jar"

Batch, .java Code und alle nötigen .jars (jansi.jar in diesem Fall) in ein Verzeichnis, in Notepad++ F6 drücken, folgenden Code (erst anpassen!) einfügen:

NPP_SAVE
t:\Dropbox\Programmierung\Java\executor.bat "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(NAME_PART)" "jansi.jar"

(bei mir liegen also .java, .jar und .bat in T:\Dropbox\Programmierung\Java\)

und dann sollte das funktionieren. Weitere Nutzungshinweise zur executor.bat befinden sich als Kommentar am Ende. Die Batch kann mittlerweile nur kompilieren (ohne und mit jars) und ausführen (ohne und mit jars).
Beachte: javac.exe und java.exe müssen in der Windows Umgebungsvariablen PATH eingetragen sein! siehe Vorbereitungen oder Google.

Demo

Download

executor [.bat]
SplashScreen [.java]
SplashScreen [.class]
jansi [.jar]

Ich habe es mittlerweile aufgegeben eigene Funktionen für farbige Ausgaben oder Konsolenhandling (Konsole leeren, Cursor bewegen usw) in Java (unter Windows) zu schreiben. Fehlendes ANSI Verständnis von Windows sorgt dafür, dass ANSI Steuerzeichen nicht umgesetzt werden; damit sind Farben, Formatting und Handling in der Konsole schier unerreichbar.
Aber glücklicherweise gibt es dutzende Java Bibliotheken, die solche Dinge realisieren: Jansi, JCurses, Charva, uvm.

Ich habe bisher nur Jansi getestet und es klappt ganz gut. Jansi installiert das Ansi Verständnis in die Konsole und ermöglicht somit die ordnungsgemäße Nutzung dieser Steuerzeichen sowohl mit der eigenen Funktion AnsiConsole.out als auch mit der normalen Funktion System.out.

Ich habe die Farbgestaltung und ein paar Handlingsachen mal in einem Beispiel zusammengepackt.

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

import java.io.IOException;
import java.io.*;
// Jansi Bibliothekbestandteile importieren, logischerweise muss das sein.
// Diese imports befinden sich in der jansi.jar, die dann beim kompilieren und ausführen mit eingebunden werden muss
// siehe http://hannes-schurig.de/17/04/2012/java-2-farbige-formatierte-konsolenausgaben-in-windows-einfache-beispiele/
import org.fusesource.jansi.AnsiConsole;
import org.fusesource.jansi.*;

public class Farben {

/*
	Author: 	 Hannes Schurig
	Created: 	 16.4.2012
	Changed: 	 16.4.2012
	Version: 	 1.0
	Changelog:
		v1.0:	 Farbige Ausgaben und Konsolenhandling dank jansi.jar, verschiedene Beispiele
	Title: 		 Farben				 
	Quellen:	jansi Doku: http://jansi.fusesource.org/documentation/api/index.html
				http://en.wikipedia.org/wiki/ANSI_escape_code
*/
  
  public static final String CLS = "\u001b[2J";
  public static final String TOP = "\u001b[H";
  public static final String UP = "\u001b[1F";
  public static final String LEFT = "\u001b[1G";
  public static final String DEL = "\u001b[2K";
  public static final String DEL_LEFT = "\u001b[1K";
  public static final String DEL_RIGHT = "\u001b[0K";
  public static final String BOLD = "\u001b[1m";
  public static final String RESET = "\u001b[0m";
  public static final String SPLASH = "\u001b[1;37;44m";
  public static final String f1 = "\u001b[1;37;46m";
  public static final String f2 = "\u001b[1;34;41m";
  public static final String f3 = "\u001b[1;31;45m";
  public static final String f4 = "\u001b[1;36;42m";
  public static final String f5 = "\u001b[1;35;43m";

	public static void main(String[] args) throws IOException, InterruptedException {
		try {
			// Installation der AnsiConsole und Einbetttung der Funktionalitäten in die System.out Funktion
			AnsiConsole.systemInstall();
		}catch(Exception e){}
		// muss nicht in einer try catch stehen, würde ich persönlich aber bevorzugen
		
		// Ansi Objekt erstellen
		Ansi ansi=Ansi.ansi();
		
		// AnsiConsole.out wird für ANSI Steuerzeichenausgaben genutzt
		// Farb- oder Formatierungsanweisungen immer vor den Text, den es betreffen soll.
		// Diese Formatierungen bleiben so lange aktiv, bis sie neu gesetzt werden. Also auch über mehrere Ausgabebefehle hinweg.
		// Ein Zurücksetzen der Farb- und Formatierungsanweisungen kann mit [0m oder [m erfolgen (hier in RESET gespeichert).
		AnsiConsole.out.println( f1 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( f2 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( f3 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( f4 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( f1 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( f2 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( f3 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( f4 + " Dies ist ein Test " + RESET );
		AnsiConsole.out.println( SPLASH + " Dies ist ein Test " );
		AnsiConsole.out.println( " Eine Zeile ohne RESET davor ist wie die vorherige. " + RESET );
		AnsiConsole.out.println( " Wieder normal " );
		
		// Pause von 5 Sekunden (main Funktion braucht throws InterruptedException und import java.io.*; nötig)
		Thread.sleep(10000);
		
		// Ausgabe von ANSI [2J und [H ( auch: [1;1H ) für 'Clear Screen' und 'Cursor to top left cornor'
		AnsiConsole.out.print( CLS + TOP );
		
		// weiterhin kann man System.out und System.console() verwenden
		System.console().printf( " CLS löscht zwar die Zeichen aber nicht farbige Überreste, " );
		System.console().printf( " daher müssen diese Zeile für Zeile gelöscht werden. " );
		
		Thread.sleep(10000);
		
		// echter CLS Befehl mit mehrfachem Zeile Löschen und erneutem Hochspringen am Ende
		for(int i=0;i<50;i++)
		{
			AnsiConsole.out.println( RESET + DEL);
		}
		AnsiConsole.out.print( CLS + TOP );
		// echter CLS Ende
		
		AnsiConsole.out.print(ansi.cursor(10,10) + SPLASH + " Positionieren des Cursors kann auf 2 verschiedene Wege passieren: " );
		AnsiConsole.out.print(ansi.cursor(11,10) + " Entweder generiert man sich das Ansi Objekt (siehe oben) und nutzt " );
		AnsiConsole.out.print(ansi.cursor(12,10) + " dann die ansi.cursor(row, column) Funktion oder man nutzt direkt die " );
		AnsiConsole.out.print( "\u001b[13;10H entsprechenden ANSI Steuerzeichen dafür. Also [row;columnH " );
		AnsiConsole.out.print( "\u001b[14;10H wie in den letzten beiden Zeilen hier zu sehen. " + RESET );
		// System.out bietet nach der AnsiConsole.systemInstall die gleichen Funktionalität
		System.out.print( "\u001b[16;10H\u001b[1;37;41m Grundsätzlich brauch man sich also gar keine Variablen für Formatierungen setzen\u001b[m " );
		System.out.print( "\u001b[17;10H\u001b[1;37;41m und kann alle Steuerzeichen händisch eingeben. Variablen sind aber zu empfehlen ;)\u001b[0m " );
		
		Thread.sleep(10000);
		
		// echter CLS Befehl mit mehrfachem Zeile Löschen und erneutem Hochspringen am Ende
		for(int i=0;i<50;i++)
		{
			AnsiConsole.out.println( RESET + DEL);
		}
		AnsiConsole.out.print( CLS + TOP );
		// echter CLS Ende
		
		AnsiConsole.out.println("\n\n" + BOLD + "Choose a menu item with the specified number key" +"\n"+ "or press another key to exit." +"\n\n"+ " >> " + RESET);
		
		try {System.in.read();}catch(Exception e){}
	}
}

In diesem Beispiel nutze ich eigens definierte Variablen mit Ansi Steuercodes und die ansi.cursor() Funktion. Vermutlich bietet Jansi weitere fertig ausprogrammierte Lösungen in Form von Funktionen für Dinge, die ich hier noch manuell gemacht habe (ein richtiges Clear Screen z.B.). Für weitere fertige Lösungen schaut bitte die Jansi Dokumentation durch.

Ausführung in Notepad++:
(Vorbereitung hier) NppExec Plugin installieren, Batch erstellen mit folgendem Inhalt (oder unten downloaden):

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

@echo off

:: jar(s) specified?
if not [%4]==[] goto jars

:: compile and run without externals jars
if not [%1]==[] javac %1
if not [%2]==[] if not [%3]==[] start cmd.exe /c java -classpath %2 %3

:jars
setlocal enabledelayedexpansion
set /a N=0

:: reads up to 6 externals jars
for /f "tokens=1,2,3 delims=;" %%a in ("%~4") do (
	set /a N+=1
	set j1=%%a
	set j2=%%b
	set j3=%%c
)

set classpath=%~2
set jarpath=%~2
if not [%5]==[] set jarpath=%~5
set jars=.
if not [%j1%]==[] set jars=%jars%;%jarpath%\%j1%
if not [%j2%]==[] set jars=%jars%;%jarpath%\%j2%
if not [%j3%]==[] set jars=%jars%;%jarpath%\%j3%

:: compile and run with external jars
if not [%1]==[] javac -cp "%jars%" %1

if not [%2]==[] if not [%3]==[] start cmd /c ""c:\Program Files\Java\jre7\bin\java" -cp "%jars%;%classpath%" %3"

endlocal

:: usage:

:: just compile
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java"

:: compile with 1 external .jar
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "lib1.jar"

:: compile with 1 external .jar
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "lib1.jar;lib2.jar"

:: just run java code
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm"

:: run java code with one or multiple external jars
:: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm" "lib1.jar"

:: run java code with one or multiple external jars - up to 3 jars supported (change lines 15-28 [if you know batch] for more)
:: usage: executor.bat "C:\Pfad\zur\Javadatei\MeinProgramm.java" "C:\Pfad\zur\Javadatei" "MeinProgramm" "lib1.jar;lib2.jar;jcurse.jar"

:: Notepad++ F6 Code: 
::   NPP_SAVE
::   ?:\path\to\executor.bat "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(NAME_PART)" "one_or_multiple_external.jar"

Batch, .java Code und alle nötigen .jars (jansi.jar in diesem Fall) in ein Verzeichnis, in Notepad++ F6 drücken, folgenden Code (erst anpassen!) einfügen:

NPP_SAVE
t:\Dropbox\Programmierung\Java\executor.bat "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(NAME_PART)" "jansi.jar"

(bei mir liegen also .java, .jar und .bat in T:\Dropbox\Programmierung\Java\)

und dann sollte das funktionieren. Weitere Nutzungshinweise zur executor.bat befinden sich als Kommentar am Ende. Die Batch kann mittlerweile nur kompilieren (ohne und mit jars) und ausführen (ohne und mit jars).
Beachte: javac.exe und java.exe müssen in der Windows Umgebungsvariablen PATH eingetragen sein! siehe Vorbereitungen oder Google.

Demo

Download

executor [.bat]
Farben [.java]
Farben [.class]
jansi [.jar]

Meine ersten Schritte in Java sind getan. Diese beschränken sich noch auf die Textausgabe in einer Konsolenanwendung aber nach „Hello World“ kommt nunmal sowas 😀
Gestern Abend habe ich meine erste Anwendung geschrieben.

Ziel: Sie soll die Nutzung von Unicode Zeichen zum Aufbau einer „Titel Box“ verdeutlichen und dabei den Unterschied zwischen System.out und System.console() hervorheben. Am Ende wird der Aufbau dynamisch abhängig vom beinhalteten Text gestaltet und in einer Funktion verpackt.
Alle Anmerkungen, Hinweise, Links und Quellen stehen im Code.

Code

Code anzeigenDen Code könnt ihr bequem mit den Links/Rechts Pfeiltasten horizontal bewegen.

public class Gruppenmitglieder {

/**
	Author: 	 Hannes Schurig
	Created: 	 6.4.2012 22:16
	Changed: 	 7.4.2012 00:28
	Version: 	 1.1
	Changelog:
		v1.1:	 Code der for-Schleife optimiert
		v1.0:	 Erstellung der GUI mit einer Funktion,
				 Ausgabe aller Namen eines festgelegten Arrays untereinander
	Title: 		 Gruppenmitglieder
	Description: Mein erster Versuch mit Java. Ziel ist die Ausgabe von vielen Namen.
				 Die Ausgabe soll mit nur 1 Schleife und einem Array erfolgen um
				 möglichst flexibel einsetzbar zu sein.
				 Ich ergänze das um einen Titel-Prototyp. Dieser soll dynamisch mit
				 einer Funktion erstellt werden können um ebenfalls flexibel und
				 einfach anwendbar zu sein.
**/

	public static void buildGUI(String text) {
		int length = text.length();
		String slength = String.valueOf(length);

		// Box mit den richtigen Maßen bauen
		System.console().printf("\u2554");
		for(int i=0; i<length; i++) {
			System.console().printf("\u2550");
		}
		System.console().printf("\u2557\n");
		System.console().printf("\u2551"+text+"\u2551 \n");
		System.console().printf("\u255A");
		for(int i=0; i<length; i++) {
			System.console().printf("\u2550");
		}
		System.console().printf("\u255D \n");
	}

	public static void main(String[] args) {
		/**
		   Hat 2 Stunden gedauert das Zusammenspiel des Character Encoding von Windows
		   und Java halbwegs zu verstehen. Die Windows CMD arbeitet mit der alten ANSI
		   Kodierung und System.out verwendet stur diese Systemkodierung.
		   ANSI beinhaltet aber zu wenig schöne Zeichen.
		   Für Extended ASCII und Unicode muss man System.console() nutzen,
		   wenn man nicht die Codepage des Systems vor der Ausführung verstellen
		   möchte (was nicht zu empfehlen ist).
		   System.console() erkennt die benötigte Kodierung automatisch.
		   Quelle: http://bit.ly/Htl3SH

		   BOX_DRAWING Unicode Chars: http://bit.ly/HtlmNb

		   Double Box Codes skizziert:

		   2554 2550 2566 2550 2557

		   2551      2551      2551

		   2560 2550 256C 2550 2563

		   2551      2551      2551

		   255A 2550 2569 2550 255D

		   Mehr? Alle Unicode Characters: http://bit.ly/HtmyjI

		   Let's go!

		**/

		/**
			einfache leere Box
			__________________
		**/
		System.console().printf("Box:\n");

		System.console().printf("\u2554\u2550\u2550\u2550\u2557 \n");
		System.console().printf("\u2551   \u2551 \n");
		System.console().printf("\u255A\u2550\u2550\u2550\u255D \n");


		/**
			breite Box mit wenig Code dank Schleife
			_______________________________________
		**/
		System.console().printf("breite Box:\n");

		// oberer Rand
		System.console().printf("\u2554");
		for(int i=0; i<19; i++) {
			System.console().printf("\u2550");
		}
		System.console().printf("\u2557 \n");

		// Mitte mit Text
		System.console().printf("\u2551 Dies ist ein Test \u2551 \n");

		// unterer Rand
		System.console().printf("\u255A");
		for(int i=0; i<19; i++) {
					System.console().printf("\u2550");
		}
		System.console().printf("\u255D \n");


		/**
			dynamische Boxbreite dank Zeichenzählung
			________________________________________
		**/
		System.console().printf("dynamische Box:\n");

		// gewünschter Boxtext (sollte nicht zu lang sein), Zeichen zählen
		String text = " 6.4.2012  |  Gruppenmitglieder ausgeben  |  Hannes Schurig ";
		int length = text.length();
		String slength = String.valueOf(length);

		// Box mit den richtigen Maßen bauen
		System.console().printf("\u2554");
		for(int i=0; i<length; i++) {
					System.console().printf("\u2550");
				}
		System.console().printf("\u2557\n");
		System.console().printf("\u2551"+text+"\u2551 \n");
		System.console().printf("\u255A");
				for(int i=0; i<length; i++) {
							System.console().printf("\u2550");
				}
		System.console().printf("\u255D \n");

		/**
			Programmieren I: LE01 Übung: Aufgabenblatt 1: Gruppenmitglieder ausgeben
			________________________________________________________________________
		**/
		System.out.println("");
		System.console().printf("Programmieren I: LE01 Übung: Aufgabenblatt 1: Gruppenmitglieder ausgeben:\n");
		System.out.println("");

		// Titel erstellen
		buildGUI(" 6.4.2012  |  Gruppenmitglieder ausgeben  |  Hannes Schurig ");
		System.out.println("");
		System.out.println("");

		// Namen festelegen
		String[] namen = {"Hannes Schurig", "Max Mustermann", "Max Mustermann", "und viele mehr"};

		// sexy Abarbeitung von Arrays mit wenig Code: http://bit.ly/HoeKyp
		for(String s : namen){
			System.console().printf(s+"\n");
		}

		System.out.println("");
		System.out.println("");


		/**
			Farbige Ausgabe war leider nicht so einfach wie gedacht, DOS ist da etwas
			zu alt für. Es gibt portable Ansätze aber die sind mir jetzt zu krass.
			Siehe: http://bit.ly/Htrg0Y
		**/
	}

}

Hinweis: Ich benutze Javadoc Kommentarblöcke (mit 2 Sternen) weil die Blog-Code-Anzeige bei normalen Kommentarblöcken (mit 1 Stern) spinnt. Dient also nur der korrekten Darstellung im Blog.

Ausgabe:

Ziel soll es sein mit Notepadd++ (in Windows) einfache Java Anwendungen schreiben und sie mit einem einfachen Tastendruck testen zu können. Das ganze soll schnell und einfach sein und damit ein ständiges „javac ba.class java bla“ in der Konsole ersparen.

Anmerkung: es geht bei „einfachen Java Anwendungen“ hauptsächlich erstmal um Konsolenprogramme, die in der Windows CMD oder der internet Console des Editors ausgeführt werden soll.

Notepad++ bietet für solche Zwecke die Erweiterung „NppExec“. Sollte die Erweiterung nicht installiert sein ist das schnell über Erweiterungen -> Plugin Manager -> Show Plugin Manager -> NppExec -> Install erledigt. NppExec führt beliebige Befehlszeilen per Tastenkombi aus, speichert diese in Profilen usw.
Ihr könnt F6 drücken oder per Erweiterungen -> NppExec -> Ausführen das Pupup öffnen, in das ihr eure Befehlszeilen eintragen könnt.

2 Möglichkeiten stehen zur Verfügung:

Ausführung innerhalb von Notepad++ in der eigenen Konsole:
F6 Code:
Quelle

NPP_SAVE
javac "$(FULL_CURRENT_PATH)"
java -classpath "$(CURRENT_DIRECTORY)" "$(NAME_PART)"

Das Dokument wird gespeichert, der komplette Pfad wird an den Compiler übergeben, kompiliert und danach mit der java.exe ausgeführt.
Achtung: Damit das funktioniert muss der Java SDK /bin/ Ordner in der Path Umgebungsvariable des Betriebssystems eingetragen sein. Das passiert normalerweise bei der Installation der SDK in Windows automatisch. Ich fand aber auch schon viele Rechner (u.A. 2 von meinen) wo das nicht so war. Testet es, indem ihr aus einem beliebigen Ordner heraus folgende cmd Befehle abfeuert:

Sollte gehen; if not, do this (Neustart oder Ab- und Anmelden danach).

Führt nun den oben stehenden F6 Code aus. Wenn alles funktioniert und in der Konsole des Editors euer Programm erscheint ist alles super.

Wenn auch nach dem Setzen der Umgebungsvariablen mit Neustart noch folgendes Problem in der Konsole auftritt:

javac "T:\Dropbox\Programmierung\Java\TextGUI.java"
CreateProcess() failed with error code 2:
Das System kann die angegebene Datei nicht finden.

… dann geht’s euch wie mir. Ich hab keine Ahnung warum Notepad++ bei mir die javac nicht findet.
Auch ein einfaches javac -version geht nicht. Die normale Windows CMD kann javac aus jedem Ordner heraus finden. Sowohl 32bit als auch 64bit SDK ist installiert, beide Pfade stehen in der Path.

Keine Ahnung, egal, Workaround:

Erstellt eine Batch Datei (ich nenne sie „executor.bat“) irgendwo, folgender Inhalt:

if not [%1]==[] javac %1
if not [%2]==[] if not [%3]==[] start cmd.exe /c java -classpath %2 %3

Die Batch kann mit 1 oder 3 Parametern aufgerufen werden. Bei nur 1 Parameter wird die Java Datei nur kompiliert. Bei 3 Parametern wird sie von der Windows CMD ausgeführt (brauchen wir nur zur externalen Ausführung, siehe unten).

Hier noch den F6 Code:

NPP_SAVE
Pfad\zur\Batch\executor.bat "$(FULL_CURRENT_PATH)"
java -classpath "$(CURRENT_DIRECTORY)" "$(NAME_PART)"

Die Batch kompiliert und der interne Interpreter von Notepad++ führt die Anwendung in der internen Konsole aus.

Ausführung außerhalb von Notepad++ in der Windows CMD:
Auch hier brauchen wir die oben erstellte .bat Datei mit folgendem Inhalt:

if not [%1]==[] javac %1
if not [%2]==[] if not [%3]==[] start cmd.exe /c java -classpath %2 %3

…und folgendem F6 Code:

NPP_SAVE
t:\Dropbox\Programmierung\Java\executor.bat "$(FULL_CURRENT_PATH)" "$(CURRENT_DIRECTORY)" "$(NAME_PART)"

Jetzt müsste sich kurz ein Windows CMD Fenster öffnen und direkt wieder schließen. Denn wie wir wissen schließt sich ein Java Konsolenprogramm (wie auch die Windows Konsole) wenn alle Befehle abgearbeitet sind.
Also lassen wir es am Ende pausieren. Dazu nutzen wir eine Nutzereingabe, die das Konsolenfenster so lange aufhält bis dieser eine Taste drückt.

Ihr müsst zusätzlich java.io.IOException importieren, eurer main Funktion die throws IOException Erweiterung geben und an das Ende 2 Zeilen hängen.
Like that:

import java.io.IOException;
public class TextGUI {
	public static void main(String[] args) throws IOException {
		System.out.println("1234 1234 1234 1234\b9999");
		System.out.println("1234 1234 1234 1234\r9999");
		
		System.out.println("Press Enter to continue...");
		System.in.read();
	}
}

Okay, warum denn jetzt 2 verschiedene Wege? Reicht nicht die interne Konsole oder die externe CMD?
Vielleicht ist es jemanden aufgefallen: die Ausgaben unterscheiden sich trotz selbem Code voneinander.
Die interne Konsole der Editoren (Notepad++ wie auch andere Programme wie Eclipse) behandeln ASCII Steuerzeichen (\b \r \t \n) nämlich anders als die Windows CMD. Wer das wirklich verstehen will muss wohl sowas hier lesen.

Jedenfalls kann es helfen beide Wege zu testen bevor man ein solches Konsolenprogramm freigibt.