sysroy
Goto Top

Prozentzeichen im Dateipfad macht Ärger

Hallo miteinander,

OS: Win XP und Win Server 2003

Mein Problem sind Sonderzeichen (z.B. Prozentzeichen "%", kaufmännisches UND "&") in Datei- und Ordnernamen, die beim automatischen Kopieren von Dateien nicht mit gelesen werden und dann zu "Datei nicht gefunden..." - Fehlern führen.

Ich habe zwar den Beitrag "Übergabe von Variabeln die Prozentzeichen enthalten per call" gelesen aber es hat mich nicht weitergebracht - vermutlich nicht richtig verstanden face-wink.

Das Problem steht im Zusammenhang mit meiner vorherigen Frage (Verzeichnisstrukturen automatisch so umkopieren, dass in der Kopie keine Leerzeichen mehr in den Ordner- und Dateinamen sind Dateien mit von Leerzeichen befreiten Pfaden kopieren), zu der mir Bastla folgenden Quellcode geschickt hat, der normalerweise auch funktioniert:

@echo off & setlocal
set "Quelle=D:\Eigene Daten"  
set "Ziel=D:\neueDaten"  

for /f "delims=" %%i in ('dir /s /b /a-d "%Quelle%"') do set "Pfad=%%i" & call :CopyFile "%%i"  
goto :eof

:CopyFile
call set "PfadNeu=%%Pfad:%Quelle%=%%"  
set "PfadNeu=%PfadNeu: =%"  
xcopy %1 "%Ziel%%PfadNeu%*">nul  
goto :eof

In der Zeile

call set "PfadNeu=%%Pfad:%Quelle%=%%"  

oder

set "PfadNeu=%PfadNeu: =%"  

erfolgt der Verlust des %-Zeichens


Frage: Wie kann der Code geändert werden, dass die Dateipfade mit diesen Sonderzeichen erhalten bleiben??

Danke
sysroy

Content-Key: 121125

Url: https://administrator.de/contentid/121125

Printed on: April 20, 2024 at 00:04 o'clock

Member: rubberman
rubberman Jul 23, 2009 at 12:45:50 (UTC)
Goto Top
Nur mal ein Tip, ohne dass ich mir das scho näher angesehen hätte. Vermutlich sind die beiden von dir verdächtigten Zeilen nicht die Übeltäter, sondern vielmehr der Parameter %%i (alias %1 in deiner Subroutine). Versuche dort mal mit der Variablen "%Pfad%" zu arbeiten.
Member: sysroy
sysroy Jul 24, 2009 at 06:33:44 (UTC)
Goto Top
Nein rubberman,

das war's nicht.

Übrigens wird in meinem Browser die Zeile 05 dargestellt als wären da zwei Aufrufe "Call: Copyfile", im Quelltext sieht man es aber richtig.
Member: rubberman
rubberman Jul 24, 2009 at 19:38:54 (UTC)
Goto Top
Hmm, was ich meinte sieht so aus:
@echo off &setlocal
set "Quelle=D:\Eigene Daten"  
set "Ziel=D:\neueDaten"  

for /f "delims=" %%i in ('dir /s /b /a-d "%Quelle%"') do set "Pfad=%%i" & call :CopyFile  
goto :eof

:CopyFile
call set "PfadNeu=%%Pfad:%Quelle%=%%"  
set "PfadNeu=%PfadNeu: =%"  
xcopy "%Pfad%" "%Ziel%%PfadNeu%*">nul  
goto :eof
Sollte doch eigentlich funktionieren?!
Member: bastla
bastla Jul 24, 2009 at 20:03:25 (UTC)
Goto Top
Hallo sysroy!

Da das Prozentzeichen beim Speichern des Pfades ohne Leerzeichen in die Variable %PfadNeu% verloren geht, sollte dieses Speichern vermieden werden; zusätzlich kann, wie auch rubberman schon erwähnt hat, auch der Parameter %1 durch %Pfad% ersetzt werden (haben den selben Inhalt, aber eine unterschiedliche Anzahl von Prozentzeichen im Variablennamen bzw sind unterschiedliche Arten von Variablen):
:CopyFile
call set "PfadNeu=%%Pfad:%Quelle%=%%"  
xcopy "%Pfad%" "%Ziel%%PfadNeu: =%*">nul  
goto :eof
Grüße
bastla
Member: sysroy
sysroy Jul 27, 2009 at 08:36:41 (UTC)
Goto Top
Hallo rubberman, hallo Bastla,

war das Wochende weg, deshalb erst heute die Anwort.

Es funktioniert genau so, wie rubberman es angibt - keine Ahnung, was ich beim ersten Versuch falsch gemacht habe face-sad.

Vielen Dank an Euch Beide

sysroy
Member: pieh-ejdsch
pieh-ejdsch Jul 28, 2009 at 23:35:31 (UTC)
Goto Top
der Verlust des Prozentzeichens erfolgt nicht bei Zeile 09 oder 10 sondern weil in Zeile 05 hinter dem CALL die Variable Übergeben wird
es war ein bischen kniffliger, da die Forschleife eine Variable beim Übergeben in eine Subroutine als Parameter nicht mit den Prozentzeichen übergibt, sondern dieses einfach entfernt.
das bedeuted, sobald Du eine Variable mit dem Prozentzeichen in eine Subroutine schickst wird das Prozentzeichen entfernt es wird zwar noch hinter dem CALL mit angezeigt aber bei der Parameterübergabe haperts...
Ob daran nun die Subroutine schuld ist ....?? die Verzögerte Variablenauflösung ändert jedenfalls an dieser Sache auch nichts. Ach ja - der Bill weiss es bestimmt - warum...
also ist Deine eigentliche Zeile 11 Schuld an der ganzen Miesere.

Dein & macht so eigentlich gar keine Probleme, da Du ja die Gänsefüsschen drumrum gefriemelt hast.
nur wenn Du Deine Variable Ohne Gänsefüsschen weiterverarbeiten willst, dann brauchst Du diese Zusatzzeile mit der Variablenumschreibung. Du musst also schon vorher wissen ob die Gänsefüsschen gebraucht werden oder nicht.
bei Dateinamen mit Leerzeichen brauchst Du ja ohnehin die Federviehlatschenfüller.


@ echo off
for /f "delims=" %%i in ('dir /s /b /a-d "D:\Eigene Daten"') do set "pfad=%%i" & call :CopyFile  
goto :eof
:CopyFile
set "pfadneu=D:\neue%pfad:~10%"  
xcopy "%pfad%" "%pfadneu: =%*">nul  

Gruß Phil
[Edit] ups ist ja schon beantwortet naja steht halt nochmehr da...[/Edit]