Batch-Dateien, Powershell-Cmdlets und VBscript-Befehle im Vergleich

1. April 2015

Der Bedarf nach Prozessautomatisierung, Stapelverarbeitung und der bequemen Abarbeitung wiederkehrender Aufgaben geht weit zurück auf die Anfänge der Betriebssysteme. Bereits in den ersten Versionen von MS-DOS, Windows und Unix wurden daher Methoden entwickelt, um solche Scripting-Lösungen zu bieten, und das Arbeiten zu erleichtern. „Batch-Dateien“ waren beispielsweise bereits 1981 in der Version „PC DOS 1.0“ eingeführt worden. Im Laufe der Zeit kamen noch weitere Vertreter wie beispielsweise Visual Basic Script (VBS oder VBscript) und die Windows Powershell (PS) hinzu.

Aktuell nutzen viele Administratoren oft mehrere Scripting-Lösungen parallel, der Trend führt dabei allerdings deutlich in Richtung Powershell. Die meisten der in den Batch-Dateien verwendeten Kommandozeilenbefehle (CMD-Befehle) sind über Aliase als Cmdlets innerhalb der Powershell verfügbar. Somit bietet es kaum Vorteile, auf die „veraltete“ CMD zurückzugreifen, wenn doch (beinahe) alle Befehle auch in der Powershell integriert sind. Diese bietet zudem über ein Vielfaches an Funktionalität. Ein ähnliches Bild bietet bei näherer Betrachtung die Script-

Bild
Bild 1. Bei der direkten Eingabe von komplizierten Befehlen in die CMD schleichen sich leicht Schreibfehler ein

Sprache VBS. Damit werden Befehle mittels des „Windows Script Hosts“ abgearbeitet wird zwar momentan noch von Microsoft unterstützt, doch werden laut Microsoft keine weiteren Features mehr hinzugefügt. Einige Code-Beispiele für die Abarbeitung alltäglicher Administrationsaufgaben bieten  einen guten Überblick über die drei unterschiedlichen Ansätze. Dabei können die Systembetreuer die unterschiedlichen Lösungsansätze der drei Scripting-Alternativen direkt gegenübergestellt betrachten.

Dateien kopieren, verschieben oder entfernen:

Batch:

copy C:\MyFile.txt C:\SomeOtherFolder
move C:\MyFile.txt C:\SomeOtherFolder
del C:\MyFile.txt

VBscript:

objFs.CopyFile "C:\MyFile.txt", "C:\SomeOtherFolder\"
objFs.MoveFile "C:\MyFile.txt", "C:\SomeOtherFolder\"
objFs.DeleteFile "C:\MyFile.txt"

Powershell:

Copy-Item -Path ‘C:\MyFile.txt’ -Destination ‘C:\SomeOtherFolder’
Move-Item -Path ‘C:\MyFile.txt’ -Destination ‘C:\SomeOtherFolder’
Remove-Item -Path ‘C:\MyFile.txt’

Ordnerinhalte auflisten

Batch:

dir

VBscript:

Set objFolder = objFs.GetFolder(“C:\”)
Set colFiles = objFolder.Files
For Each objFile in colFiles
Wscript.Echo objFile.Name
Next

Powershell:

Get-ChildItem -Path C:\

Anzeigen von Ordnerinhalten mit einer bestimmten Zeichenfolge in der Dateibezeichnung:

Batch:

dir C:\*somestringinsideafile*

VBscript:

Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
Set colFiles = objWMIService.ExecQuery("Select * from CIM_DataFile Where Name LIKE 'C:\%somestringinsideafile%\'")
For Each objFile in colFiles
Wscript.Echo objFile.FileName
Next

Powershell:

Get-ChildItem -Path C:\*somestringinsideafile*

Dateien innerhalb eines Ordners auflisten und in eine CSV-Datei exportieren.

Batch:

(for %F in (C:\*) do @echo "%~dpF","%~nxF",%~zF)>>Files.csv

VBscript:

Set objFs = CreateObject("Scripting.FileSystemObject")
Set objFile = objFs.CreateTextFile(“C:\Files.csv”)
Wscript.sleep(2000) 'Pause while file is being created
Set objFile = objFs.GetFile(“C:\Files.csv”)
Const ForWriting = 2
Set outputFile = objFs.OpenTextFile(“C:\Files.csv”, ForWriting)
Set objFolder = objFs.GetFolder(“C:\”)
Set colFiles = objFolder.Files
For Each objFile in colFiles
OutputFile.Write “C:\,” & objFile.Name & “,” & objFile.Size
Wscript.Echo “C:\,” & objFile.Name & “,” & objFile.Size
Next
OutputFile.Close

PowerShell:

Get-ChildItem -Path C:\ -File | Select-Object Directory,Name,Length | Export-Csv C:\csv.csv -Append –NoTypeInformation

Zusammenfassung

Diese Code-Beispiele zeigen die Möglichkeiten, Grenzen und Eigenheiten der drei Ansätze klar auf. Während einfache Aufgaben, wie etwa das Anzeigen eines Ordnerinhaltes, bei der CMD den Administratoren schnell von der Hand geht, ist das Auflisten von Dateien nach bestimmten Parametern und einem Export in eine (CSV-) Datei zwar möglich, aber relativ aufwendig. Die CMD eignet sich damit weniger, um solch komplexe Jobs „live“ in der CMD zu erledigen. Zudem schleichen sich bei solchen Aufgaben schnell Eingabefehler ein. Als abgespeicherte Batch-Datei dagegen fällt dieses Argument weg, schließlich testen die Script-Ersteller ihre Lösungen (hoffentlich) bevor diese in Produktivumgebungen ausgeführt werden. Allerdings ist die CMD hier nicht unbedingt die erste Wahl, komplexere Aufgaben lassen sich oftmals mittels VBS oder PS deutlich besser lösen. Die CMD spielt ihre Stärken eher in den Bereichen aus, wo die Systembetreuer schnell ein Kommandozeilen-Fenster öffnen, und die benötigten Befehle für ihre Aufgaben direkt in die Kommandozeile eintippen.

Bild
Bild 2. Ein VBscript wird in einem Editor bearbeitet.

VBscript kehrt diesen Ansatz um: VBS ist als Scripting-Lösung konzipiert, in der die Systembetreuer die einzelnen Programm- oder Scrip-Zeilen innerhalb eines entsprechenden Editors strukturieren, und zu einem späteren Zeitpunkt ausführen. Das erhöht im Vergleich zur CMD die Übersichtlichkeit bei komplexeren Abläufen. Um dagegen „ad-hoc“ den Inhalt eines Laufwerks anzuzeigen, ist VBscript weniger geeignet. Denn VBS ist nicht auf ein solches Einsatzszenario zugeschnitten. Seine Stärken liegen  in Bereichen wie der Anpassung von Betriebssystem- oder Anwendungskomponenten. So ziehen die Systemadministratoren beispielsweise VBscript bei der Anpassung von Office-Programmen heran, (um Outlook anzuweisen, beim Start einen bestimmten IMAP-Ordner automatisch zu expandieren) oder etwa um Windows-Lizenzen zu aktivieren (mittels Slmgr.vbs).

Bild
Bild 3. Mit dem Powershell-Editor „ISE“ steht den Administratoren ein wichtiges Werkzeug zum Erstellen von PS-Scripten zur Verfügung.

Die Powershell dagegen bietet sowohl die Unterstützung der „alten“ CMD-Befehle (als Alias-Cmdlets), als auch die nötige Flexibilität und Funktionalität einer Scripting-Lösung, um einfache sowie komplexe Aufgaben schnell und effizient anzugehen. Dabei behalten die Administratoren im Hinterkopf, dass die PS eine objektorientierte Script-Sprache darstellt. Folglich sind auch die Ausgaben eines klassischen CMD-Kommandos (wie etwa „Dir“) keine Zeichenketten (Strings) sondern zunächst einmal Objekte. Diese werden von den Systembetreuern bei Bedarf in die Powershell-Pipeline weitergereicht, und können so  – objektbasiert – von anderen Cmdlets verarbeitet werden. Bereits simple strukturierte „Einzeiler“ vereinfachen den Systembetreuer den Arbeitsalltag, durch die Tabulator-Funktion (zum automatischen Ergänzen von Befehlen) und die integrierte, umfassende Hilfefunktion steht mit der PS ein effizientes Werkzeug für „Live-Einsatz“ zur Verfügung. Aber auch im Scripting-Bereich spielt die PS ihre Stärken gekonnt aus, durch Editoren (beispielsweise dem Powershell Integrated Scripting Editor, ISE) erstellen die Administratoren ihre eigenen Lösungen, und teilen diese mit anderen Systembetreuern. Welche der vorgestellten Lösungen nun den Vorzug gegeben werden soll, ist somit für jeden unterschiedlich zu beantworten. Für die meisten Administratoren, Netzwerk- und Systembetreuer stellt sich ganz klar die Powershell in den Vordergrund.

Adam Bertram / FAH

Lesen Sie auch