Frage von Kallyguru, 49

(Batch)Warum funktioniert mein Umbenenn-Code nicht?

Hi leute,

ich bastle seit einiger Zeit an einem Batch Programm welches eine bestimmte Zeichenfolge in einem Dateinamen erkennen soll und dieses dann dem User_input nach umbenennt.

for /f "tokens=1* delims=_" %%i in ('dir /b "%cd%\test"*""') do ren "%%i_%%j" "%userinput%_%%j"

dieser Code welcher direkt im selben verzeichnis wie die angesprochenenen Dateien steht funktioniert. Dieser Code hingegen:

for /f "tokens=1* delims=_" %%i in ('dir /b "%cd%\Storys\test"""') do ren "%%i_%%j" "%newname%_%%j" for /f "tokens=1 delims=_" %%i in ('dir /b "%cd%\Drehbuecher\test"""') do ren "%%i_%%j" "%newname%_%%j" for /f "tokens=1 delims=_" %%i in ('dir /b "%cd%\Ideen\test"*""') do ren "%%i_%%j" "%newname%_%%j"

nicht funktioniert. Dabei ist doch der einzige Unterschied nur ein übergeordnetes Verzeichnis.

Wär sau cool wenn jemand ne Lösung parat hätt :D

Antwort
von ThomasAral, 30

bei test fehlt der Stern  "*"

aber warum verwendest du nicht besser windows script,  das ist viel einfacher zu durchschauen ... geht auch mit environment parametern oder sogar mit input-message-boxen ....    VBA Style mäßig

nur wenige haben den Scripting Host deaktiviert.

Kommentar von ThomasAral ,

hier versuch mal das (beginnt ab VERZ) und speicher es mit Notepad und Dateityp = Alle Dateien  unter den Namen    filnam.vbs   auf den Desktop ab.  Wichtig ist die Endung   .vbs  Dann doppeltklicken und in der Eingabebox (vorbelegt mit MY) den gewünschten USERINPUT eingeben, dann OK drücken. Am Ende die CMD Boxen schließen.

VERZ = "D:\MyVerz"
set SO = createobject("WScript.Shell")
SO.currentdirectory = VERZ
SO.Run("%comspec% /k dir"), 1, FALSE
USERINPUT = InputBox("Userinput","Filename Change:","MY")
DELIM = "_"

set FSO = CreateObject("Scripting.FileSystemObject")
set FO = FSO.GetFolder(VERZ)
set FC = FO.Files ' collection

For Each a in FC
i = InStr(a,DELIM)
if i then
a1 = Mid(a,1,i-1)
a2 = Mid(a,i+1)
SO.RUN("%comspec% /k ren """ & a & """ """ & USERINPUT & "_" & a2 & """"), 0, FALSE
end if
Next
SO.Run("%comspec% /k dir"), 1, TRUE

Kommentar von ThomasAral ,

mit den RUN Befehlen kannst du natürlich wenns unbedingt sein muss auch vom VBS aus CMD Dateien aufrufen. Du könntest also wenn du unbedingt auf die CMD Dateien stehst erst mit dem VBS alles regeln sodass die Pfade usw. richtig sitzen und dann das CMD Batch aufrufen.

SO.RUN("(PFAD)\mybatch.bat"), 1, TRUE

Kommentar von Kallyguru ,

Cool danke für den Tipp und die Antwort.
Ja ich denke du hast recht, werde mir wohl mal ein bisschen vb aneignen. 


Was ist überhaupt ein FO.file ? XD

Aufjedenfall nochmal danke für die Hilfe und den Denkanstoß :D


Kommentar von Kallyguru ,

bzw. gibt es auch für Excel und Word dateien so eine Endung ?

weil wenn ich jetzt raten würde is FO eine Gruppierung zu der auch vbs zugeordnet wird :D

Kommentar von ThomasAral ,

bei mir hats funktioniert ... die Dateien müssen natürlich den DELIM im Dateinanem haben die geändert werden,  nur diese werden geändert, so hab ich das verstanden.   Also

bla_irgendwas   wird geändert in USERINPUT_irgendwas   aber   datname (ohne unterstrich)  wird nicht geändert.

wenn irgendwas mit pfad oder rechten falsch ist, dann geb im mittleren SO.Run  Parameter   1, FALSE   (statt 0, FALSE)  ein.

es erscheint dann das fenster bei REN  (mit evtl. fehlerausgabetext)

FO ist meine Bezeichnung für FolderObject, damit es kurz ist und dennoch nicht mit anderen temporären Variablen verwechselt wird. Normal nehmen die in Beispielen dann    objFolder =  oder sowas... ist halt mehr Schreibarbeit.

FO.Files  ist dann die Files Methode des FolderObject s . Das Ergebnis wird in die Variable FC gespeichert (C steht für collection). Eine Collection ist in Visual Basic Script ein eindimensionales Array mit beliebigen Datentypen (auch gemischt). In unserem Fall sinds natürlich alles Strings.

Kommentar von ThomasAral ,

also um korrekt zu sein:  es ist kein eindimensionales Array im strengen Sinn, aber es verhält sich in vieler Hinsicht ähnlich, hat aber eine zusätzliche Methode Count.  Es ist jedoch nicht kompatibel. Man kann eine Collection nicht mit einer Zuweisung einem gleichgroßen array zuweisen. das müsste man dann für jedes Element einzeln machen (mit Schleife).

Kommentar von Kallyguru ,

Klappt jetzt alles Super :D

danke für dei sehr hilfreiche Hilfe ^^

kennst du vllt noch ne gute Seite wo man nen bissi was über GUI in vbs erfahren kann ?

Kommentar von Kallyguru ,

der Pfad läuft ja soweit ich das verstanden hab auf den Desktop
wegen %comspec%

aber ich bekomms einfach nicht hin den Pfad auf was anderes zu verweisen
soweit ich gelesen habe gibt es sowas wie %cd% in vbs gar nicht
sondern man muss sich das aus den dateiinfos rauskratzen XD

das mit dem derzeitigen Pfad habe ich ja hinbekommen
nur es funktioniert einfach nicht
es kommt nichtma ne fehlermeldung, sonder es passiert nix.

Ja die Dateien haben Unterschriche :D

also z.B test_1.docx

oder test_2.vbs

Kommentar von Kallyguru ,

okay comspec ist der pfad der cmd XD

ohw mann
sry aber versuch grad den code nachzuvollziehen, fällt mir irgendwie schwer

Kommentar von ThomasAral ,

ja weil wenn du  dir  einfach so durch RUN schickst, dann sucht er nach einem   dir.exe   was ja nicht geht  (dir ist ja ein cmd befehl).

Kommentar von ThomasAral ,

und will man in Visual Basic ein Anführungszeichen in einem String schreiben, der ja mit Anführungszeichen anfängt und endet, dann muss man das doppelt schreiben, ansonsten würde es als Endanführungszeichen interpretiert und der rest würde syntax-error erzeugen.  also   a = ""Hallo"" -> Fehler  Hallo"" wäre Syntax error weil a = "" bereits die Anweisung wäre.  a = """Hallo""" -> "Hallo". Strings haben doppelte " (shift 2) Anführungszeichen.  Einfache Anf. sind Kommentar-Einleitungen.

Kommentar von ThomasAral ,

Kommentar-Einleitungen nur, wenn man nicht im Anführungszeichen-Auf Modus ist.   Du kannst also locker:  a = " 'Hallo' " schreiben,  aber nicht  a = 'H' .

Keine passende Antwort gefunden?

Fragen Sie die Community