Zum Inhalt

Schlagwort: PowerShell

PowerShell: Windows Aufgabenplanung exportieren

Verwendet man die Windows Aufgabenplanung für viele Aufgaben, so macht es in jedem Fall Sinn die einzelnen Aufgaben auch zu sichern, damit man diese im Bedarfsfall auch einfach wieder importieren kann. Das folgende PowerShell Skript exportiert die Aufgaben.

$sch = New-Object -ComObject("Schedule.Service")
$sch.Connect("localhost")
$tasks = $sch.GetFolder("\").GetTasks(0)
 
$outfile_temp = "C:\PoSh\Save_ScheduledTasks\{0}.xml";
 
$tasks | %{
    $xml = $_.Xml
    $task_name = $_.Name
    $outfile = $outfile_temp -f $task_name
    $xml | Out-File $outfile 
}

Das Skript exportiert alle Aufgaben des lokalen Rechner (»localhost«) aus dem Hauptordner der Aufgabenplanung in das Verzeichnis, das mittels der Variablen »$outfile_temp« definiert wird.

PowerShell: E-Mail an mehrere Empfänger verschicken

Will man, wie hier beschrieben, eine E-Mail verschicken und dies an mehrere Empfänger, so kann man diese auch in einer „externen“ Datei ablegen. Sinnvoll ist dies bspw. wenn ein Script im Fehlerfall bestimmte Empfänger benachrichtigen soll und man diese Empfänger nicht codiert im PowerShell Skript hinterlegen will.
Zu diesem Zweck legt man die E-Mail Adressen der Empfänger einfach zeilenweise in einer Textdatei ab und lässt diese dann vom PowerShell Skript einlesen und übergibt das Ergebnis an den Send-MailMessage Befehl.

1
2
3
4
5
6
7
8
9
10
11
12
13
$i = 1;
$Recip = "";
$RecipientFile = (Get-Content C:\Temp\test.txt);
foreach ($Recipient in $RecipientFile)
{
	if ($i -gt 1)
	{ $Recip = $Recip + "," }
	$Recip = $Recip + $Recipient 
	$i++;
}
$Recip = $Recip.TrimEnd();
$toAddress = $Recip.Split(",")
Send-MailMessage -To $toAddress -From sender@example.com -Subject MultipleRecipients -SmtpServer smtp@example.com

PowerShell: E-Mail mit Sonderzeichen verschicken

Will man mittels PowerShell eine E-Mail versenden, so kann man hierfür die eingebaute Funktion »Send-MailMessage« verwenden. Will man hierbei auch Sonderzeichen im Text der Email verwenden, so muss man die Option »-Encoding« anhängen und den Zeichensatz UTF8 definieren. Ein einfaches Beispiel hierfür sieht wie folgt aus.

Send-MailMessage -Body 'Ein paar Sonderzeichen: äöüß' -Encoding ([System.Text.Encoding]::UTF8) -To receipient@example.com -From sender@example.com -SmtpServer smtp@example.com -Subject TestSubject

Muss man weitere Parameter übergeben, wie bspw. eine Authentifizierung gegenüber dem SMTP-Server, so findet man diese bei Microsoft im TechNet.

Send-MailMessage @ Microsoft TechNet

Datei mittels PowerShell aktualisieren/kopieren

Will man eine Datei von einem Verzeichnis automatisch in anderes Verzeichnis kopieren, so kann man dies unter Windows relativ einfach mit einer Batch-Datei und der Aufgabenplanung erledigen.
Will man allerdings die Datei nur kopieren, wenn die Datei im Quellverzeichnis neuer ist als die Datei im Zielverzeichnis so geht dies mit einer Batch-Datei schon nicht mehr so einfach.

Zu diesem Zweck kann man sich aber ein PowerShell Skript schreiben, dass genau diese Funktionalität abbildet. Falls man bisher noch keine PowerShell Skripte auf seinem Rechner eingesetzt hat, muss man zunächst die sogenannte »ExecutionPolicy« ändern. Weitere Infos hierzu kann man dem folgenden Link entnehmen: Running Scripts From Within Windows PowerShell.
Abgekürtzt reicht es aus, wenn man eine Instanz der PowerShell als Administrator (also als Administrator ausführen) startet und den folgenden Befehl ausführt:

Set-ExecutionPolicy Unrestricted

Die Abfrage einfach mit »J« beantworten.

Auf einem Testsystem kann man diesen Befehl so verwenden, auf einem produktiven System (bspw. Server) sollte man dies nicht einsetzen, wenn man nicht weiß, welche Konsequenzen hieraus resultieren können.

$BackEndDir = "C:\PowerShellCopy\Backend\"
$BackEndFile = "ImportantInformation.txt"
$FrontEndDir = "C:\PowerShellCopy\Frontend\"
 
if ( !$BackEndDir.EndsWith("\") )
{ $BackEndDir = $BackEndDir + "\" }
if ( !$FrontEndDir.EndsWith("\") )
{ $FrontEndDir = $FrontEndDir + "\" }
 
$BackFile = $BackEndDir + $BackEndFile
$FrontFile = $FrontEndDir + $BackEndFile
 
if ( !(Test-Path $BackFile) )
{
    Write-Host("Datei im Backend ist nicht vorhanden")
    return
}
 
$objBackFile = get-item $BackFile
$objBackFileLWT = [datetime]$objBackFile.LastWriteTimeUTC
 
Write-Host ("BackEndDatei: " + $objBackFileLWT)
 
If ( (Test-Path $FrontFile) )
{
    echo "Datei vorhanden"
    $objFrontFile = get-item $FrontFile
    $objFrontFileLWT = [datetime]$objFrontFile.LastWriteTimeUTC
    Write-Host ("FrontEndDatei: " + $objFrontFileLWT)
    if ($objBackFileLWT -gt $objFrontFileLWT)
    {
        Write-Host ("Datei wird im FrontEnd aktualisiert")
        Copy-Item $BackFile $FrontEndDir
    }
    else
    {
        Write-Host ("Datei im FrontEnd ist gleich alt bzw. aktueller")
    }
}
Else
{
    Write-Host ("Datei nicht vorhanden")
}

Für die eigene Verwendung müssen im Grunde nur noch die Verzeichnispfade und der Dateiname in den ersten drei Zeilen angepast werden.

Führt man dann dieses PowerShell Skript mittels der Aufgabenplanung aus, so wird die Datei aus dem Backend-Verzeichnis immer dann in das Frontend-Verzeichnis kopiert, nur wenn diese auch wirklich aktueller ist. Somit ist man immer auf dem aktuellsten Stand, verhindert aber unnötige Kopieraktionen, was gerade bei großen Dateien ein Vorteil sein kann.

Quellen:
Converting the FileSystemObject’s FileExists Method
Using the Copy-Item Cmdlet
Verwenden des Cmdlet „Set-ExecutionPolicy“
Windows PowerShell Tip: The String’s the Thing