Automatisiertes Backup mit der Windows Powershell

No comments März 26th, 2011

Nachdem mein USB-Stick Anfang Februar den Dienst verweigert hat und somit alle Daten, darunter meine Web- und Windows-Projekte, unzugänglich wurden habe ich mir Gedanken über ein automatisiertes Backup für meinen Stick gemacht. Da kam mir die Windows Powershell in den Sinn.

Das Backup-Script war mit 5 Zeilen Code schnell geshrieben:

Set-Location "I:\"
$NowDate = Get-Date -UFormat %Y\%m\%d.%m.%Y
$BackupPath = "E:\Backup\UsbStick\$NowDate\"
New-Item -Path $BackupPath -ItemType "Directory"
Get-Childitem "I:\" | ForEach-Object -Process { Copy-Item $_ -Destination $BackupPath -Recurse }

Zur Erklärung:

  1. Der aktuelle Arbeitsort wird auf das zu sichernde Wechselmedium gesetzt.
  2. Die Backups werden nach Jahren, Monaten und zuletzt Sicherungsdatum angelegt. Daher ist das Datum $NowDate im  Format JJJJ\MM\DD.MM.JJJJ nötig.
  3. Auf die Variable $BackupPath wird der Speicherort der Backups geschrieben, wobei zum Schluss das bereits für den Ordnerpfad formatierte Datum angehängt wird.
  4. Entsprechend dem Inhalt von $BackupPath wird ein neuer Ordner angelegt.
  5. Die Elemente des zu sichernden Sticks werden ausgelesen und an den Zielort $BackupPath kopiert, wobei durch das Anfügen von -Recurse an die Anweisung die Ordner rekursiv kopiert werden.

Nachdem dieser Code als *.ps1-Datei gespeichert wurde, kann nun die Zeitgesteuerte Ausführung über die Windows Aufgabenplanung eingerichtet werden.

In dieser wird eine neue Aufgabe erstellt; die Trigger müssen nach eigenen Vorlieben eingestellt werden.
Als Aktion gibt man powershell ein. Im Feld Argumente wird folgendes eingegeben:

-noprofile -command Pfad\Datei.ps1

Pfad und Datei müssen natürlich noch durch den Pfad zur Datei und den Dateinamen ersetzt werden.

Nun muss man sich nicht mehr um das Sichern seines USB-Sticks kümmern.

 

Updates für meine Programme verfügbar

No comments Dezember 22nd, 2010

Die Server-Probleme sind behoben, sodass die Updates von RideLog und PhotoStackRenamer nun auch als Direkt-Download verfügbar sind.

Updates für meine Programme

No comments Dezember 4th, 2010

Information: Aufgrund von Server-Problemen stehen die Updates vorerst nur per Auto-Update zur Verfügung!

RideLog 1.0.0.1

Am 01. Dezember habe ich RideLog in der Version 1.0.0.1 veröffentlicht. Neu ist allerdings nur ein wenig Text auf der Datei- bzw. Druck-Ausgabe: Über “Daten für das Jahr XXXX” steht nun als Überschrift “FAHRTENBUCH”.

PhotoStackRenamer 1.1.0.3

Heute habe ich den PhotoStackRenamer 1.1.0.3 veröffentlicht. Neu ist die Möglichkeit, Drag-and-Drop für das Laden der Fotos in die Umbenennungsliste zu nutzen.

Auto-Update

Wer RideLog 1.0.0.0 bzw. PhotoStackRenamer 1.1.0.2 installiert hat, sollte in den nächsten zwei Wochen von der Software selbst, oder besser gesagt von Microsofts ClickOnce, das Update angeboten bekommen (vorausgesetzt, die Anwendungen werden hin und wieder mal geöffnet Smiley).

Tolles Tool: Rainmeter

No comments September 15th, 2010

Vor ein paar Tagen bin ich auf Rainmeter aufmerksam geworden und war auf Anhieb begeistert. Rainmeter ist so etwas Ähnliches wie die Minianwendungen von Windows 7. Der für mich entscheidende Vorteil liegt hier allerdings darin, dass der Editor reicht, um ein sogenanntes Skin für Rainmeter zu erstellen.

Diese Skins sind ini-Dateien, in denen Werte gemessen und anschließend nach Belieben ausgegeben werden. Dabei stehen eine Reihe von Messungsmöglichkeiten wie der PC-Laufzeit, der CPU-Auslastung uvm. zur Verfügung. Des weiteren sind bereits Plugins mitgeliefert, die beispielsweise das Parsen von Web-Dokumenten ermöglichen.

Natürlich habe ich sofort mit dem Schreiben von eigenen Skins losgelegt. Ein paar sind schon fertig.

Meine selbst geschriebenen Rainmeter Skins

Meine selbst geschriebenen Rainmeter Skins

Als kleines Beispiel hier mal der Code meines PC UpTime-Skins:

[Rainmeter]
Update=1000
Author=SeKliSys (Sebastian Kliem)

[Metadata]
Name=PC UpTime
Config=The Elegance Of Simplicity | PCUpTime
Description=Displays teh german date.
Instructions=
Version=1.0
Tags=basic | clean | Silmple | elegance | PC | UpTime
License=

[Variables]
_FontColor=255,255,255,220
_FontFace=Segoe UI

:-------Measures-------

[MeasureUpTime]
Measure=UpTime
Format=%4!i!d %3!i!h %2!i!m %1!i!s

;--------Meters--------
[MeterUpTimeHead]
Meter=STRING
X=0
Y=0
FontFace=#_FontFace#
FontSize=20
FontColor=#_FontColor#
StringAlign=LEFT
AntiAlias=1
Text="PC UpTime"

[MeterUpTime]
MeasureName=MeasureUpTime
Meter=STRING
X=5r
Y=35r
FontFace=#_FontFace#
FontSize=15
FontColor=#_FontColor#
StringAlign=LEFT
AntiAlias=1

UserControl, das sich selbst aus einem übergeordnetem Element löscht

No comments Juni 28th, 2010

In einem meiner aktuellen Projekte habe ich mehrere UserControls in einem StackPanel untergebracht. Der Nutzer soll selbst auswählen können, welche er davon angezeigt haben möchte und welche nicht. Und er soll diese Auswahl zur Laufzeit treffen können – ohne Restart des Programms.

Die Lösung: Einfach das übergeordnete Element in ein StackPanel konvertieren und das Control sich selbst löschen lassen:

// das Click-Event meines Close-Buttons im zu löschenden UserControl
private void _CloseButton_Click(object sender, RoutedEventArgs e)
{
    ((StackPanel)this.Parent).Children.Remove(this);
}

Einem BackgroundWorker mehrere Werte übergeben

No comments Juni 27th, 2010

In einem meiner aktuellen Projekte habe ich einen BackgroundWorker benötigt, dem ich mehr als einen Wert übergeben kann. Da das “von Haus aus” nicht möglich ist, habe ich natürlich das Internet befragt. Das war leider reine Zeitverschwendung …

Da kam mir eine Idee: Warum denn nicht eine Liste vom Typ object nehmen? Diese kann man dann mit seinen Variablen verschiedenen Typs füllen. und der RunWorkerAsync()-Methode übergeben.

Damit man damit dann in der DoWork()-Methode auch arbeiten kann, muss man das übergebene Argument wieder in eine List<object> konvertieren:

List<object> Arguments = (List<object>)e.Argument;

Danach kann man über den Index auf die Elemente zugreifen und sie verwenden:

int Var1 = (int)Arguments[0];
string Var2 = (string)Argument[1];

Ein Kalender mit PHP

No comments April 11th, 2010

Um bevorstehende Termine übersichtlich auf einer Website darstellen zu können eignet sich ein Kalender ziemlich gut. Wie man diesen programmieren könnte, möchte ich im folgenden zeigen.

Um die Kalenderausgabe für einen bestimmten Monat in einem bestimmten Jahr auszugeben, wird der Code in eine Funktion geschrieben.

function ShowCalendar($ShowMonth, $ShowYear)
{
 
}

Benötige Variablen erstellen

Der anzuzeigende Monat und das anzuzeigende Jahr werden als Funktionparameter geholt. Danach müssen noch der aktuelle Tag, die Anzahl der Tage im Monat sowie die Anzahl der Wochen im Monat bestimmt werden. Außerdem wird noch ein Array benötigt, in das die einzelnen Tage später geschrieben werden.

$NowDay = date("d", time());
$DaysInMonth = date("t", mktime(1, 0, 0, $ShowMonth, 1, $ShowYear));
$WeeksInMonth = date("W", mktime(1, 0, 0, $ShowMonth, $DaysInNowMonth, $ShowYear)) - date("W", mktime(1, 0, 0, $ShowMonth, 1, $ShowYear)) + 1;
$CalData = array();

Array füllen

Zuerst werden so viele Elemente in das Array eingefügt, wie der Monat Wochen hat.

for($a = 0; $a < $WeeksInMonth; $a++)
{
	$CalData[] = array();
}

Dann wird jede Woche im Array mit den entsprechenden Tagen gefüllt. Dabei wird für jeden Tag bestimmt, der wievielte Tag der Woche es ist, und dieser wird dann an entsprechender Stelle in die Woche eingefügt. Da date(“w”, $timestamp) allerdings den Sonntag als Tag Nr. 0 und den Samstag als Tag Nr. 6 zurück liefert, müssen der Sonntag als Nr. 6 festgelegt und alle anderen zurückgegebenen Werte um 1 verringert werden.

Und immer, wenn das Skript beim sechsten Tag der Woche angelangt ist, wird der Wochenzähler um 1 erhöht, wodurch dann die nächste Woche gefüllt wird.

$w = 0;
for($i = 1; $i <= $DaysInMonth; $i++)
{
	$Day = date("w", mktime(1, 0, 0, $ShowMonth, $i, $ShowYear));
	($Day == 0) ? $Day = 6 : $Day--;
	$CalData[$w][$Day] = $i;
	if($Day == 6)
	{
		$w++;
	}
}

Monate auf Deutsch

Damit die Monate dann auch auf Deutsch angezeigt werden, wir dein Array mit den deutschen Bezeichnungen angelegt.

$Months = array(0 => "Januar",
		1 => "Februar",
		2 => "März",
		3 => "April",
		4 => "Mai",
		5 => "Juni",
		6 => "Juli",
		7 => "August",
		8 => "September",
		9 => "Oktober",
		10 => "November",
		11 => "Dezember");

Die Ausgabe des Kalenders

Der Tabellenkopf

Für den Tabellenkopf müssen erst einmal Monat und Jahr entsprechend formatiert werden.

echo <<<DOC
	<table>
		<tr>
			<th colspan="7">
				$Month_Year_formatted
			</th>
		</tr>
		<tr>
			<th>Mo</th>
			<th>Di</th>
			<th>Mi</th>
			<th>Do</th>
			<th>Fr</th>
			<th>Sa</th>
			<th>So</th>
		</tr>
DOC;
Der Inhalt – das Array auslesen

Nun wird für jedes Wochenelement im Array eine Zeile angelegt und für jeden Tag in dieser Zeile eine Zelle angelegt und am Ende die Tabelle geschlossen.

foreach($CalData as $Week)
{
	echo "<tr>";
	for($wd = 0; $wd <= 6; $wd++)
	{
		if(mktime(1, 0, 0, $ShowMonth, $Week[$wd], $ShowYear) == mktime(1, 0, 0, date("m", time()), $NowDay, date("Y", time())))
		{
			// CSS-Klasse Cal_Today: .Cal_Today { border: 1px #000000 solid; }
			echo "<td class='Cal_Today'>$Week[$wd]</td>";
		}
		else
		{
			echo "<td>$Week[$wd]</td>";
		}
	}
	echo "</tr>";
}
 
echo "</table>";

So könnte der Kalender beispielsweise am Ende aussehen:
PHP_Calendar
Das gesamte PHP-Skript steht hier zum Download bereit.

Man könnte nun noch eine Blätter-Funktion hinzufügen. Eine Möglichkeit diese zu implementieren ist im Download-Skript mit enthalten.

CeBIT 2010

No comments März 7th, 2010

Nachdem ich letztes Jahr nach meinem ersten CeBIT-Besuch begeistert zurück kam, hatte ich mich entschlossen auch die diesjährige CeBIT zu besuchen. Das haben mein Kumpel Martin Geßner und ich gestern auch getan. Allerdings waren An- und Abreise mit dem Zug eine “Abenteuerfahrt” …

Die Anreise

Um 05:10 Uhr sollte unser Zug von Wolfen nach Bitterfeld fahren – es hatte die Nacht geschneit und dies war der erste Zug. So gegen 05:15 Uhr kam dann die Durchsage, der Zug hätte unbestimmte Zeit Verspätung. Wenige Minuten später teilte uns die nächste Durchsage mit: 28 Minuten Verspätung. Dadurch hatten wir unseren Anschlusszug von Bitterfeld nach Halle verpasst und mussten also auf den nächsten warten. Der kam  – sogar pünktlich – 6:20 Uhr an. In Halle konnten wir durch die Verspätung des ersten Zuges erst den Zug 2 Stunden später nehmen, in den wir dann gegen 08:02 Uhr eingestiegen sind. Dieser kam aus Leipzig und war bereits gut gefüllt – wir mussten also stehen. Nachdem es von Station zu Station immer mehr Leute im Zug wurden, und man lauter Leuten fast nicht mehr umfallen konnte, wurde glücklicherweise die erste Klasse frei gegeben und wir hatten uns dort Sitzplätze ergattert – der Fahrtcomfort für die nächsten 2 Stunden war gerettet. Um 11:40 Uhr waren wir in Hannover angekommen und um 12:19 Uhr kamen wir endlich am Messebahnhof an.

Die CeBIT

Die Anfahrt hat sich aber dennoch gelohnt. Die CeBIT selbst war super. Die meiste Zeit haben wir uns natürlich bei Microsoft aufgehalten :) . Wir haben uns u. a. einen Vortrag über Microsoft Security Essentials im MSDN- / Technet-Vortragsraum angesehen, später dann noch Vorträge über Microsoft Visual Studio 2010 und Microsoft Silverlight, die nicht im Vortragsraum, sondern direkt “draußen” auf dem Gang statt fanden.
Hier mal ein paar Bilder.

CeBit 2010, Messegelände 03_web CeBit 2010, Messegelände 04_web CeBit 2010, Microsoft 01_web CeBit 2010, Microsoft 02_web CeBit 2010, Microsoft 04_web CeBit 2010, Microsoft 05_web

Die Rückreise

Rückzu hatten wir Glück, dass wir rechtzeitig im Zug saßen, denn das “Drama” vom Morgen setzte sich fort. Diesmal wurden es allerdings von Station zu Station weniger Leute im Zug. Als wir dann in Halle ankamen, schaute Martin mit seinem Handy nach aktuellen Streckeninformationen: Schienenersatzverkehr! Dadurch kamen wir nicht wie geplant 23:17 Uhr, sondern erst 00:42 Uhr in Wolfen an.

How-To: RichTextBox absatzweise auslesen

No comments Dezember 13th, 2009

Für mein aktuelles Projekt, die Homepageverwaltung 2, ist es nötig, den Inhalt eine RichTextBox nicht zeilenweise, sondern absatzweise auszulesen und im HTML-Code erst dann ein <br /> einzufügen. Wie das funktioniert, zeige ich nun.

Zuerst wird ein String, der den späteren HTML-Code enthält, erstellt.

string HtmlCode = "";

Nun wird die RichTextBox mittels einer foreach-Schleife absatzweise ausgelesen.

foreach (Paragraph p in _InhaltRTBox.Document.Blocks)
{
    // TextRange-Objekt mit Text vom Absatz-Anfang bis Absatz-Ende füllen
    TextRange ParagraphText = new TextRange(p.ContentStart, p.ContentEnd);
 
    // Text des TextRange-Objekts (mit etwas Formatierung) in den String schreiben
    Text += ParagraphText.Text.ToString() + Environment.NewLine;
    Text += "<br />" + Environment.NewLine;
}

How-To: E-Mails versenden mit C#

No comments November 19th, 2009

Für Kontaktformulare oder andere Zwecke  ist es nötig, E-Mails zu versenden. Wie das mit C# funktioniert möchte ich nun einmal kurz zeigen.

Zum Versenden von Mails sind zunächst Absender und Empfänger (jeweils Adresse und Anzeigetext), Inhalt der Mail sowie ein E-Mail-Server nötig. Außerdem kann man noch einen Betreff und Anhänge anfügen. Bei meinem portable MailClient werden diese Informationen aus TextBoxen geholt.

Das Fenster für neue E-Mails im pMC.

Das Fenster für neue E-Mails im pMC. (Server und Absender werden in einem anderen Fenster abgefragt.)

Nun aber zum Code. Zunächst sollten für bessere Übersichtlichkeit im Code zwei Namespaces eingebunden werden.

using System.Net;
using System.Net.Mail;

Danach wird die Methode zum Versenden geschrieben.

private void MailSenden()
{
    // Erstellen von zwei E-Mail-Adressen: Absender und Empfänger
    MailAddress Absender = new MailAddress("Adresse",
       "Anzeigename", System.Text.Encoding.UTF8);
    MailAddress Empfaenger = new MailAddress("Adresse", "Anzeigename",
       System.Text.Encoding.UTF8);
 
    // MailMessage erstellen und mit Inhalt füllen
    MailMessage Mail1 = new MailMessage(Absender, Empfaenger);
    Mail1.IsBodyHtml = true;
    Mail1.Subject = "Betreff";
    Mail1.Body = "Inhalt";
 
    // SmptClient zum Versenden der Mail
    SmtpClient SmtpClient1 = new SmtpClient("Server");
    SmtpClient1.Credentials = new NetworkCredential("Benutzername", "Passwort");
    SmtpClient1.Send(Mail1);
}