Dateien umbenennen und verschieben mit VBS
Hallo Admins,
ich habe beim folgenden Script noch ein paar Problemchen, bei denen ich auf Hilfe hoffe.
Was klappt noch nicht:
1. Ich würde gerne jeder verschobenen und umbenannten Datei hinten einen Zähler anfügen, der einfach hochzählt.
2. Die Schleife mit der Abfrage ob die Angaben korrekt sind.
3. Das Logfile soll am Schluss automatisch aufgerufen werden.
zu 1.
Im Zielordner sind bereits Dateien vorhanden. Wenn neue dazukommen können diese den gleichen Namen kriegen wie bestehende (abgesehen vom Zähler). D. h. ein fortlaufender Zähler hilft nicht, da bei jeder einzelnen Datei geprüft werden muss ob es diese schon gibt und dann die nächst höhere Zählernummer zu verwenden ist.
zu 2.
Die Schleife mit Eingabe: und Goto will nicht funktionieren (ist nur derzeit ausgeblendet). Wo liegt hier der Denk-/Syntaxfehler?
zu 3.
Wie bringe ich die Datei am Ende auf den Bildschirm?
Danke im Voraus für euer hilfe und Geistesblitze.
Gruß Joni
ich habe beim folgenden Script noch ein paar Problemchen, bei denen ich auf Hilfe hoffe.
'P F A D E A N F A N G =============================================================================================================
quelle = "E:\Scanordner\" 'Pfad inkl. \
ziel = "E:\Objekte\"
zielpfad = "\11_laufende_Buchhaltung\Rechnungen\Eingangsrechnungen\" 'Pfadteil nach der Objektnummer - Beginn und Ende mit \ 'Pfad inkl. \
'P F A D E E N D E =============================================================================================================
'U S E R N A M E A U S L E S E N
Set objNetwork = CreateObject("WScript.Network")
username = objNetwork.UserName
'msgbox(Username)
'D A T U M U N D Z E I T F E S T L E G E N U N D F O R M A T I E R E N
DD = Date
dt = Year(DD) & "-" & Right("0" & Month(DD), 2) & "-" & Right("0" & Day(DD), 2)
ZZ = Time
zt = Left(ZZ, 2) & "-" & Mid(ZZ, 4, 2) & "-" & Right(ZZ, 2)
'L O G D A T E I F E S T L E G E N
logdat = "e:\Scanordner\" & username & "\log_" & dt & "_" & zt & ".txt"
'msgbox(logdat)
'Q U E L L P F A D D E S U S E R S F E S T L E G E N
quellpfad = quelle & username & "\"
'msgbox(quellpfad)
'D A T E I E N A B F R A G E N
on error resume next
set fs = CreateObject("Scripting.FileSystemObject")
set f = fs.GetFolder(quellpfad)
Set y = fs.CreateTextFile(logdat, True)
For Each file in f.Files
if right(file.Name, 4) = ".pdf" then 'nur PDFs bearbeiten
alt = file.Name 'alten Namen speichern
'msgbox(alt)
'Eingabe:
onr = InputBox("Objektnummer bitte angeben:", "Objektnummer", onr)
rdat = InputBox("Rechnungsdatum bitte angeben (TTMMJJ):", "Rechnungsdatum", rdat)
korr = InputBox("Eingaben korrekt?" & vbCrLf & "Objektnummer: " & onr & vbCrLf & "Datum: " & left(rdat, 2) &_
"." & mid(rdat,3,2) & ".20" &right(rdat,2), "Eingabekontrolle", "ja")
' if korr <> "ja" or korr <> "j" then goto Eingabe
file.Name = onr & " Rechnung vom 20" & right(rdat,2) & mid(rdat,3,2) & left(rdat, 2) & ".pdf"
neu = file.Name
'msgbox(neu)
if fs.FileExists(neu) then msgbox("gibt es schon") 'neunen Namen speichern
if fs.FolderExists(ziel & ONR & zielpfad) then
if quellpfad <> ziel & ONR & zielpfad then 'Zielverzeichnis darf nicht gleich Quelle sein
file.move (ziel & ONR & zielpfad) 'ins Zielverzeichnis verschieben
y.WriteLine(quellpfad & alt & " >>> " & ziel & ONR & zielpfad & neu & " <<< +v+u") 'Wenn der Ordner existiert wurde die Datei verschoben + protokolliert
else
fs.CreateFolder(quellpfad & "fertig\") 'Ordner erzeugen, da Ziel gleich Quelle
file.move (quellpfad & "fertig\") 'in neuen Ordner verschieben
y.WriteLine(quellpfad & alt & " >>> " & quellpfad & "fertig\" & neu & " <<< -v+u Quelle gleich Ziel") 'Wenn Ziel gleich Quelle wird nur die Namensänderung protokolliert
end if
else
fs.CreateFolder(quellpfad & "fertig\") 'Ordner erzeugen, da Ziel nicht vorhanden ist
file.move (quellpfad & "fertig\") 'in neuen Ordner verschieben
y.WriteLine(quellpfad & alt & " >>> " & quellpfad & "fertig\" & neu & " <<< -v+u kein Ziel vorhanden") 'Wenn der Ordner nicht existiert wird nur die Namensänderung protokolliert
end if
End if
Next
y.Close 'Logdatei schließen
Was klappt noch nicht:
1. Ich würde gerne jeder verschobenen und umbenannten Datei hinten einen Zähler anfügen, der einfach hochzählt.
2. Die Schleife mit der Abfrage ob die Angaben korrekt sind.
3. Das Logfile soll am Schluss automatisch aufgerufen werden.
zu 1.
Im Zielordner sind bereits Dateien vorhanden. Wenn neue dazukommen können diese den gleichen Namen kriegen wie bestehende (abgesehen vom Zähler). D. h. ein fortlaufender Zähler hilft nicht, da bei jeder einzelnen Datei geprüft werden muss ob es diese schon gibt und dann die nächst höhere Zählernummer zu verwenden ist.
zu 2.
Die Schleife mit Eingabe: und Goto will nicht funktionieren (ist nur derzeit ausgeblendet). Wo liegt hier der Denk-/Syntaxfehler?
zu 3.
Wie bringe ich die Datei am Ende auf den Bildschirm?
Danke im Voraus für euer hilfe und Geistesblitze.
Gruß Joni
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 147471
Url: https://administrator.de/contentid/147471
Ausgedruckt am: 25.11.2024 um 20:11 Uhr
18 Kommentare
Neuester Kommentar
Hallo joni2000de!
Mit Ausnahme von "On Error Goto 0", gibt es In VBS keine Goto-Funktion. Alternativ kannst Du aber eine While-Schleife verwenden:
Gruß Dieter
Mit Ausnahme von "On Error Goto 0", gibt es In VBS keine Goto-Funktion. Alternativ kannst Du aber eine While-Schleife verwenden:
Do
.....
korr = InputBox(....)
Loop While LCase(Left(korr, 1)) <> "j"
Gruß Dieter
Hallo Dieter,
hab zu lange ferngesehn, aber meine fast fertig gewesene Antwort will ich nicht vorenthalten
@joni
Formatierungen sind ja großteils eine Frage des persönlichen Geschmacks,
aber teilweise 10 Tabs in Folge sowie die im Internet Bereich übliche Interpretation von fortlaufender Großschrift als SCHREIEN (verstärkt mit gesperrter Schrift als L A U T S C H R E I E N) machen deinen Code - ähem - schlecht lesbar.
Ich, mag mich jedenfalls so, nicht damit beschäftigen.
Gruß
LotPings
@Biber, wir laufen wohl heute zur Hochform auf Aber man nennt doch die Dinger Ohrenschützer - meinen bitte in Pink.
hab zu lange ferngesehn, aber meine fast fertig gewesene Antwort will ich nicht vorenthalten
@joni
Formatierungen sind ja großteils eine Frage des persönlichen Geschmacks,
aber teilweise 10 Tabs in Folge sowie die im Internet Bereich übliche Interpretation von fortlaufender Großschrift als SCHREIEN (verstärkt mit gesperrter Schrift als L A U T S C H R E I E N) machen deinen Code - ähem - schlecht lesbar.
Ich, mag mich jedenfalls so, nicht damit beschäftigen.
Gruß
LotPings
@Biber, wir laufen wohl heute zur Hochform auf Aber man nennt doch die Dinger Ohrenschützer - meinen bitte in Pink.
[OT]
...evtl in Kombination mit stark getönten Sonnenbrillen...
Würde das helfen?
Grüße
Biber
[/OT]
Zitat von @77559:
Formatierungen sind ja großteils eine Frage des persönlichen Geschmacks,
aber teilweise 10 Tabs in Folge sowie die im Internet Bereich übliche Interpretation von fortlaufender Großschrift als SCHREIEN
(verstärkt mit gesperrter Schrift als L A U T S C H R E I E N) machen deinen Code - ähem - schlecht lesbar.
Ich, mag mich jedenfalls so, nicht damit beschäftigen.
Hmmm, ich spiele eh mit dem Gedanken, vielleicht einen Kopfhörer-Verleih aufzumachen...Formatierungen sind ja großteils eine Frage des persönlichen Geschmacks,
aber teilweise 10 Tabs in Folge sowie die im Internet Bereich übliche Interpretation von fortlaufender Großschrift als SCHREIEN
(verstärkt mit gesperrter Schrift als L A U T S C H R E I E N) machen deinen Code - ähem - schlecht lesbar.
Ich, mag mich jedenfalls so, nicht damit beschäftigen.
...evtl in Kombination mit stark getönten Sonnenbrillen...
Würde das helfen?
Grüße
Biber
[/OT]
[OT]
Hallo LotPings und Biber!
Also, am Beitrag selbst kann ich kein ungebührliches Verhalten erkennen und wenn's im Code mit der Schreibung etwas übertrieben erscheint, ähem keine Ahnung, ob ich das jetzt negativ bewerten soll. Ist mir auch ehrlich gesagt erst im Nachhinein aufgefallen und Ohrenstöpsel (grün), habe ich ne Schüssel voll
Gruß Dieter
[/OT]
Hallo LotPings und Biber!
Also, am Beitrag selbst kann ich kein ungebührliches Verhalten erkennen und wenn's im Code mit der Schreibung etwas übertrieben erscheint, ähem keine Ahnung, ob ich das jetzt negativ bewerten soll. Ist mir auch ehrlich gesagt erst im Nachhinein aufgefallen und Ohrenstöpsel (grün), habe ich ne Schüssel voll
Gruß Dieter
[/OT]
Hallo joni2000de!
Den Vorbehalten hinsichtlich der Formatierung schließe ich mich an (wie sieht denn das aus, wenn's derart in die Breite geht - obwohl ich einräume, dass auch die Tatsache, dass ein TAB durch die Forensoftware in der Breite von 8 Leerzeichen dargestellt wird, ihren Teil zu diesem Erscheinungsbild beiträgt) ...
Für 3. sollte
genügen.
Grüße
bastla
P.S.: Ohrenstöpsel brauche ich nicht - habe defaultmäßig auf Durchzug gestellt ...
Den Vorbehalten hinsichtlich der Formatierung schließe ich mich an (wie sieht denn das aus, wenn's derart in die Breite geht - obwohl ich einräume, dass auch die Tatsache, dass ein TAB durch die Forensoftware in der Breite von 8 Leerzeichen dargestellt wird, ihren Teil zu diesem Erscheinungsbild beiträgt) ...
Für 3. sollte
CreateObject("WScript.Shell").Run logdat
Grüße
bastla
P.S.: Ohrenstöpsel brauche ich nicht - habe defaultmäßig auf Durchzug gestellt ...
Hallo Joni,
wie willst du die Versionsnummer denn anhängen, einfach ohne Trenner, mit fester Stellenzahl, in Klammern etc.?
Gruß
LotPings
@Biber, immerhin sind wir noch im Kontext der ersten Frage - und meine Gegenfragen sollten zum Denken anregen.
Wessen essen.. ich hab gerade erst kalt gefrühstückt; obwohl der Kaffe war schon heiss
wie willst du die Versionsnummer denn anhängen, einfach ohne Trenner, mit fester Stellenzahl, in Klammern etc.?
Gruß
LotPings
@Biber, immerhin sind wir noch im Kontext der ersten Frage - und meine Gegenfragen sollten zum Denken anregen.
Wessen essen.. ich hab gerade erst kalt gefrühstückt; obwohl der Kaffe war schon heiss
[OT]
[/OT]
@77559, "zum Denken anregen" finde ich gut.... aber nicht, dass dann wieder das Essen kalt wird...
Zitat von @77559:
wie willst du die Versionsnummer denn anhängen, einfach ohne Trenner, mit fester Stellenzahl, in Klammern etc.?
Und wenn er auf diese Suggestivfrage mit "Gerne!" antwortet, dann ufert das wieder aus..wie willst du die Versionsnummer denn anhängen, einfach ohne Trenner, mit fester Stellenzahl, in Klammern etc.?
[/OT]
@77559, "zum Denken anregen" finde ich gut.... aber nicht, dass dann wieder das Essen kalt wird...
Das passt ja ziemlich genau auf eine rekursive Funktion die ich hier in Batch realisiert habe, hatte ich auch schon einmal in vbs geschrieben - finde ich aber gerade nicht (muss wirklich mal einen Hausputz machen )
Aber vielleicht schaust du dir den Code mal an und versuchst es selber als vbscript zu schreiben.
Gruß
LotPings
Aber vielleicht schaust du dir den Code mal an und versuchst es selber als vbscript zu schreiben.
Gruß
LotPings
Hallo joni2000de!
Hier mal ein Beispiel zum Verschieben einer Datei mit Zähler, wobei es wenig Sinn macht, die Datei erst umzubenennen und dann erst zu prüfen, ob die Datei bereits existiert... D.h. nach der neuen Namensbildung anhand einer Zählerschleife ermitteln, ob die Datei im Zielpfad schon existiert. Wenn nicht, dann wird der neue Dateinamen gebildet und unter dem neuen Dateinamen verschoben.
Gruß Dieter
Hier mal ein Beispiel zum Verschieben einer Datei mit Zähler, wobei es wenig Sinn macht, die Datei erst umzubenennen und dann erst zu prüfen, ob die Datei bereits existiert... D.h. nach der neuen Namensbildung anhand einer Zählerschleife ermitteln, ob die Datei im Zielpfad schon existiert. Wenn nicht, dann wird der neue Dateinamen gebildet und unter dem neuen Dateinamen verschoben.
Const Quellpfad = "E:\Quelle\"
Const Zielpfad = "E:\Ziel\"
Dim Fso, File, ZielName, FilePfad, i
Set Fso = CreateObject("Scripting.FileSystemObject")
For Each File In Fso.GetFolder(Quellpfad).Files
If LCase(Fso.GetExtensionName(File.Name)) = "pdf" Then
'ZielNamen durch Eingabe bilden .... z.B.
ZielName = "123456 Rechnung vom 20100723"
i = 1 'Zähler = 1
Do Until Fso.FileExists(Zielpfad & ZielName & "_" & Right("0" & i, 2) & ".pdf") = False: i = i + 1: Loop
'Zielpfad mit neuem Dateinamen
FilePfad = Zielpfad & ZielName & "_" & Right("0" & i, 2) & ".pdf"
File.Move FilePfad
End If
Next
Gruß Dieter
Hallo joni2000de!
Geöffnete Dateien können logischerweise nicht umbenannt/verschoben werden. Und da Du die Fehlerbehandlung mit "On Error Resume Next" außerkraft gesetzt hast, bekommst Du natürlich auch keine entsprechenden Fehlermeldung. Letztendlich bleibt es so oder so ein Lotteriespiel
Du kannst mal versuchen, die Datei zu öffnen und manuell wieder zu schließen. Das geht in Zeile 41 mit folgender Codezeile:
wobei das True am Ende bedeutet, dass die Script-Ausführung bis zum Schließen der Datei angehalten wird.
Gruß Dieter
Geöffnete Dateien können logischerweise nicht umbenannt/verschoben werden. Und da Du die Fehlerbehandlung mit "On Error Resume Next" außerkraft gesetzt hast, bekommst Du natürlich auch keine entsprechenden Fehlermeldung. Letztendlich bleibt es so oder so ein Lotteriespiel
Du kannst mal versuchen, die Datei zu öffnen und manuell wieder zu schließen. Das geht in Zeile 41 mit folgender Codezeile:
CreateObject("WScript.Shell").Run quellpfad & alt, 1, True
Gruß Dieter