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.
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.
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
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/contentid/255287
Ausgedruckt am: 19.11.2024 um 11:11 Uhr
4 Kommentare
Neuester Kommentar
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.
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.
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.
(Wichtig: Das Mandanten-Verzeichnis sollte bei diesem Script nicht in dem Ausgabe-Ordner für die CSV-Dateien liegen)
Das Powershell-Script muss nur einmal gestartet werden und überwacht dann permanent den angegebenen Ordner.
Grüße Uwe
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
(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)}
powershell.exe -ExecutionPolicy ByPass -File C:\csv_monitor.ps1
Hallo Eric,
, oder benutze im Task-Scheduler einfach einen anderen Benutzeraccount ( achte auf genügend Rechte), dann ist es nicht mehr sichtbar.
Grüße Uwe
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
Bitte den Beitrag dann noch als gelöst markieren. Merci.