Archive: ‘How-To’ Category

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.

 

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.

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);
}