e.wind
Goto Top

VBA - VBS : Umbennen und Verschieben von Dateien in Loop

Hallo zusammen,

folgende Situation habe ich:

Warenwirtschaftssystem erzeugt eine sog. Pollingdatei für DHL Easylog, bisher war es so, das diese Datei vom Namen her Eindeutig war nämlich "EasyLog_0815.csv" das 0815 steht hier für die Mandanten ID aus der WaWi. Nun gab es ein lustiges Software Update und der Dateiname ist nun zufällig generiert und sowas wie "11510307_83aff66ea0bd6e54ae48182b730b3098_0.csv" kommt dabei heraus. Nun brauche ich aber den Dateinamen inkl. Mandanten ID damit ich beim Verpacken unterscheiden kann, ob ich ein Paket für Firma A, B, C oder D verschicke, da wir deren Kundennummern in unserem Easylog hinterlegt haben.

Was ich machen kann ist, ich kann die .csv für jeden Mandanten in einen anderen Ordner speichern, damit das Polling funktioniert möchte ich also aus "C:\DHL\0815\irgendwas.csv" die Datei umbenennen und sie zu "C:\DHL\EasyLog_0815.csv" machen.

Theoretisch fertig habe ich eine Batch Datei die zumindest mal das Umbenennen erledigt

@echo off
rename C:\DHL\*.csv EasyLog_0815.csv
move C:\DHL\EasyLog_0815.csv "C:\Test\0815\" /D /E /Y

Das Verschieben macht er auch hier nicht...

Da eine in Dauerschleife laufende Batch ja doch recht Ressourcen intensiv ist, dachte ich ein VB Script wäre die bessere Lösung um sowas zu handhaben. Leider ist mein VB nicht wirklich vorhanden, das bisschen das ich kann reicht grade so aus um in einem vorhanden Code herum zu stochern und Anpassungen vorzunehmen.

das ist was ich bisher versucht habe:

Private Sub TestSub()
Dim strOldFile As String
Dim strNewFile As String

strOldFile = Environ$("C:\DHL\0815") & "\*.csv"
strNewFile = Environ$("C:\DHL") & "\EasyLog_0815.csv"

Name strOldFile As strNewFile
End Sub

Next

Wscript.Sleep 1000

Loop

Wie gesagt, da mein VB nicht vorhanden ist, blicke ich auch nicht durch wo der Fehler ist, ich hoffe das ich bei euch Hilfe finden kann.

Vielen Dank vorab und nochmal Verzeihung für meine völlige Inkompetenz.
Kommentar vom Moderator Biber am 19.11.2014 um 19:07:40 Uhr
VBA - VBS : Umbennen und Verschieben von Dateien in Loop
set /a rgc+=1
#899

wir bekommen auch die 1000 noch voll während Merkels Amtszeit...

Content-ID: 255287

Url: https://administrator.de/forum/vba-vbs-umbennen-und-verschieben-von-dateien-in-loop-255287.html

Ausgedruckt am: 22.12.2024 um 20:12 Uhr

colinardo
colinardo 19.11.2014 aktualisiert um 18:56:48 Uhr
Goto Top
Hallo E.Wind,
mit VBS etwa so:
Hinweis: im Eingabe-Verzeichnis werden nur die Unterordner der ersten ebene auf neue CSV-Dateien überprüft.
Also z.B.
  • C:\DHL\0815
  • C:\DHL\5586
  • etc

Einmal gestartet läuft es still im Hintergrund und überprüft alle 5 Sekunden auf neue CSV-Dateien. Zum Beenden muss es dann im Taskmanager gekillt werden.
On Error Resume Next
' Ordner dessen Unterordner der ersten Ebene überprüft werden sollen  
Const FOLDERIN = "C:\DHL"  
'Ordner in den die CSV-Dateien verschoben werden  
Const FOLDEROUT = "C:\DHL"  
'Interval der Überprüfung (in sek.)  
Const INTERVAL = 5
Dim strNewFile, fso, folder, file, intCount
Set fso = CreateObject("Scripting.Filesystemobject")  
While True
	For Each folder In fso.GetFolder(FOLDERIN).SubFolders
		If folder.Files.Count > 0 Then
			For Each file In folder.Files
				If LCase(fso.GetExtensionName(file.Name)) = "csv" Then  
					strNewFile = FOLDEROUT & "\Easylog_" & folder.Name & ".csv"  
					intCount = 1
					While (fso.FileExists(strNewFile))
						strNewFile = FOLDEROUT & "\Easylog_" & folder.Name & "_(" & intCount & ").csv"  
						intCount = intCount + 1
					Wend
					fso.MoveFile file.Path, strNewFile
				End If
			Next
		End If
	Next
	WScript.Sleep(INTERVAL * 1000)
Wend


Alternativ geht das noch effizienter auch mit einem Powershell-Script. Es überwacht im Beispiel die Unterordner des Ordners C:\Mandaten mit einem Filesystemwatcher auf neu angelegte CSV-Dateien.
Also z.B.
  • C:\Mandanten\0815\11510307_83aff66ea0bd6e54ae48182b730b3098_0.csv
  • C:\Mandanten\5586\11599811_83aff66ea0bd6e7d77e7182b730b3098_0.csv
Sobald eine neue CSV-Datei darin landet wird sie umbenannt nach Easylog_[MANDANTENID].csv, falls im Zielordner schon eine solche Datei liegt wird der neuen Datei eine Nummer angängt Easylog_[MANDANTENID]_(1).csv.(Optional könnte man hier auch den Inhalt in die bereits bestehende Datei transferieren, falls das gewünscht ist)
(Wichtig: Das Mandanten-Verzeichnis sollte bei diesem Script nicht in dem Ausgabe-Ordner für die CSV-Dateien liegen)
# Ordner dessen Unterordner auf neue CSV-Dateien überwacht wird
$folderMonitor = 'C:\Mandanten'  
# Ordner in den die unbenannten CSV-Dateien verschoben werden
$global:folderOUT = 'C:\DHL'  
if ((Get-EventSubscriber "CSV_Watcher" -ErrorAction SilentlyContinue)){Unregister-Event "CSV_Watcher"}  
#Filewatcher erstellen
$watcher = New-Object System.IO.FileSystemWatcher $folderMonitor,'*.csv' -Property @{IncludeSubDirectories=$true}  

# Filesystem-Watcher registrieren
Register-ObjectEvent $watcher "Created" -SourceIdentifier "CSV_Watcher" -Action {  
    Try{
        $obj = $Event.SourceEventArgs
        # Mandanten-Ordner extrahieren
        $mandant = $obj.Name.Split("\")  
        # Zieldatei zusammensetzen
        $targetfile = "$($global:folderOUT)\Easylog_$mandant.csv"  
        # Für den Fall das die Zieldatei schon existiert hänge eine Zahl an
        $cnt = 0
        while((Test-Path $targetfile)){
            $cnt++
            $targetfile = "$($global:folderOUT)\Easylog_$($mandant)_($($cnt)).csv"  
        }
        # Verschiebevorgang
        move-item $obj.FullPath $targetfile -Force
        # Console-Logging
        write-host "Verschiebe Datei '$($obj.FullPath)' nach '$targetfile'" -ForegroundColor Green  
    }catch{
        write-host "Fehler: $($_.Exception.Message)" -ForegroundColor Red  
    }
}
cls
write-host "Warte auf neue Dateien ..." -ForegroundColor Yellow  
while($true){sleep(1)}
Das Powershell-Script muss nur einmal gestartet werden und überwacht dann permanent den angegebenen Ordner.
powershell.exe -ExecutionPolicy ByPass -File C:\csv_monitor.ps1
Grüße Uwe
E.Wind
E.Wind 20.11.2014 um 08:59:11 Uhr
Goto Top
Hallo Uwe,

das ist perfekt, ich werde die Lösung 2 mit dem Powershell-Script verwenden und dann nur noch einen Task schreiben, der das ganze bei Rechnerstart ausführt. damit die Kollegen im Lager keinen Nerv darauf verschwenden müssen das erst jeden Morgen zu starten.

Eine Frage hätte ich noch, kann man das Script auch Unsichtbar für den Anwender im Hintergrund laufen lassen? Wie gesagt es wird auf einem Rechner im Lager ausgeführt und jedes Fenster kann potentiell geschlossen werden...

Auf jedenfall DANKE für die schnelle und vorallem geniale Hilfe, Deine Lösung kann mehr als ich überhaupt gehofft habe durchführen zu können.

Grüße

Eric
colinardo
colinardo 20.11.2014 aktualisiert um 09:13:13 Uhr
Goto Top
Hallo Eric,
Eine Frage hätte ich noch, kann man das Script auch Unsichtbar für den Anwender im Hintergrund laufen lassen?
ja, mit dem zusätzlichen Parametern
-WindowStyle Hidden -NonInteractive
, oder benutze im Task-Scheduler einfach einen anderen Benutzeraccount ( achte auf genügend Rechte), dann ist es nicht mehr sichtbar.

Grüße Uwe
colinardo
colinardo 22.11.2014 um 09:04:16 Uhr
Goto Top
Bitte den Beitrag dann noch als gelöst markieren. Merci.