Zum Inhalt

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

Published inWindows

Kommentare sind geschlossen.