Powershell Skript mit Verknüpfung starten

Manchmal wäre es sinnvoll, ein Powershellskript direkt über eine Verknüpfung zu starten.Führt man einen Doppelklick auf diese Verknüpfung aus, so startet entweder Notepad, oder ein anderer installierter Skripteditor. Das Skript selbst wird nicht ausgeführt.

Damit das dennoch klappt muß die Verknüpfung etwas modifiziert werden. Unter Eigenschaften > Verknüpfung > Ziel muß folgendes angegeben werden:

powershell.exe -Command "& '<Pfad>'"

Hierbei muß <Pfad> ersetzt werden mit dem absoluten Pfad zum Skript.

Beispiel:

powershell.exe -Command "& 'D:\Skripte\test.ps1'"

Man beachte, daß der Pfad in Hochkommas gesetzt ist und der gesamte Ausdruck hinter -Command in Anführungszeichen. Die Anführungszeichen geben eine Zeichenfolge an, und der Aufrufoperator (&) verursacht die Ausführung des Befehls.

Weitere Parameter für die Ausführung wie z.B.

Weitere Links zum Thema:

Microsoft TechNet: PowerShell.exe-Konsolenhilfe

 

Backup Exec Job nach Veeam Backup starten

Die zeitliche Abstimmung zwischen Veeam Backup und Bandsicherung ist wichtig, damit nicht die Bandsicherung startet, während die Veeam Sicherung noch im Gange ist. Eine Möglichkeit besteht darin, ein möglichst großes Zeitfenster zwischen beiden Vorgängen einzubauen. Oft ist aber diese Zeit nicht vorhanden. Alternativ dazu kann man den BackupExec Job unmittelbar aus dem Veeam Auftrag heraus starten. Hier hat sich seit Version 2012 einiges geändert. Daher schildere ich beide Vorgehensweisen für BE 2010 und BE 2012.

Backup-Exec 2010

Hilfreich ist hier das CLI Tool bemcmd.exe. Bei einer Standardinstallation befindet es ich im Verzeichnis:

“c:\Program Files\Symantec\Backup Exec\bemcmd.exe”

Der Aufruf des BE Sicherungsjobs erfolgt mit der Kommandosequenz

"c:\Program Files\Symantec\Backup Exec\bemcmd.exe" -o1 -j<JobName>

Hierbei ist JobName der Name des BE Sicherungsjobs (ohne <>). Ihm voran wird ein kleines J ohne Leerzeichen gestellt. Der Parameter -o1 (O, nicht Null). Eine ausführliche Zusammenfassung der Befehlsparameter wurde von Arne Fokkema (ICT-Freak NL)  unter diesem Link bereit gestellt.

Der BEMCMD Befehl wird wie oben dargestellt in den Eigenschaften des Veeam Jobs eingetragen.

 Backup-Exec 2012

Symantec hat seine aktuelle Version von Backup Exec ordentlich umgepflügt und einige Neuerungen eingeführt. Neben optischen Änderungen fällt auf, daß das CLI Tool bemcmd.exe nicht mehr existiert. Statt dessen gibt es ein Powershell Plugin BEMCLI. Man kann die Shell entweder direkt aufrufen mit:

c:\Program Files\Symantec\Backup Exec\CLILauncher.exe

..oder man startet sie indirekt über Powershell. Dann muß allerdings das BEMCLI Modul eingebunden werden. Das geschieht in der Powershell mit dem Import-Module Befehl.

Import-Module bemcli

Danach lassen sich BEMCLI Befehle in Powershell ausführen. Eine Ausführliche Dokumentation der BEMCLI Befehle gibt es bei Symantec.

Befehl aus Veeam Auftrag starten

Job bearbeiten und im Abschnitt Storage (Veeam 6) auf Advanced klicken.

Das vollständige Kommando ist unten aufgeführt, wobei “<JobName>” ersetzt wird durch den Namen des Sicherungsauftrages. Z.B. “myBEJob”.

Achtung! Der Jobname in der GUI kann vom internen Jobnamen abweichen, wenn diese Jobs von einer früheren Version von BackupExec importiert wurden. Dann wird dem Namen intern das Suffix -Backup hinzugefügt. Aus dem Namen in der GUI “MyDailyJob” wird intern “MyDailyJob-Backup”. Der reale Name des Jobs lässt sich an der Powershell abfragen.

PS> import-module BEMcli
PS> Get-bejob

Der dort angezeigte Jobname wird im Befehl unten als “myBEJob” verwendet.

powershell.exe -command "&{import-module bemcli; get-bejob -Name "myBEJob" | start-bejob -confirm:$false}"

Die Poweshell Parameter sind im Microsoft TechNet dokumentiert. Innerhalb der geschweiften Klammern {} kann eine Serie von Befehlen stehen. Sie müssen lediglich durch ein Semikolon getrennt werden.

Der Parameter -confirm:$false hinter dem start-bejob Befehl ist unbedingt notwendig, da ansonsten eine Benutzereingabe zur Bestätigung des start-bejob Befehls verlangt wird.

Skriptfehler PowerCLI

Bei der Ausführung von Powershell oder PowerCLI Skripten kann es zu einem Problem mit der Signierung kommen. Zur Laufzeit erhält man eine Meldung wie unten dargestellt.

Die Datei <name> kann nicht geladen werden. Die Datei <name> ist nicht digital signiert. Das Skript wird auf dem System nicht ausgeführt. Weitere Informationen erhalten Sie mit “Get-Help about_signing”.

bzw. für englische Ausgabe:

The file <name> cannot be loaded. The file <name> is not digitally signed. The script will not execute on the system. Please see “Get-Help about_signing” for more details.

Die kontrolle der Sicherheitseinstellungen von Powershell ergab, daß sie bereits auf “RemoteSigned” gestellt wurden.

PS C:\Users> get-executionpolicy
RemoteSigned
PS C:\Users>

Was Ist also die Ursache? Das PowerCLI Skript (ein Teil von vCheck) hatte ich kurz zuvor geladen und lokal entpackt. Öffnet man die Eigenschaften des der ps1-Datei so sieht man schnell die Ursache.

Aktiviert man den Button “Zulassen”, so ist das Skript für künftige Ausführung genehmigt und der Fehler tritt nicht mehr auf.

Powershell: Skript als geplanten Task auf Server 2008 R2 starten

Geplante Tasks waren schon immer eine feine Sache. Meist wurden in der Vergangenheit Batchdateien ausgeführt. Viel komfortabler lassen sich Vorgänge jedoch mit Powershell programmieren. Der Aufruf mit dem Taskplaner geht nicht direkt auf das Shellscript, sondern es muß zunächst Powershell aufgerufen werden.

Auf der Kommandozeile sieht das etwa so aus:

powershell.exe -Noninteractive -Command "&{<Pfad zum Skript>}"

Im Taskplaner ist das ähnlich, lediglich die Argumente müssen in andere Felder verteilt werden.

Verwaltung > Aufgabenplanung

Unter Programm wird Powershell.exe aufgerufen. Ggf. kann es nötig sein den Pfad zu Powershell.exe anzugeben. Er lautet

%SystemRoot%\system32\WindowsPowerShell\v1.0\

Achtung: Auch bei Powershell 2.0 ist der Pfad \v1.0\

Der Pfad zur Powershell Skriptdatei wird in den Argumenten übergeben. Da das Anzeigefeld sehr klein geraten ist hier nochmal die kompletten Argumente.

-noninteractive -command "&{<Pfad zum Skript>}"

Die Argumente NonInteractive und Command sind in diesem Artikel im Microsoft Technet erklärt.