Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Entwerten von Sonderzeichen, die durch Dateinamen in eine Batch-Variable kommen...

Frage Entwicklung Batch & Shell

Mitglied: dctibi

dctibi (Level 1) - Jetzt verbinden

16.12.2013, aktualisiert 17.12.2013, 3371 Aufrufe, 8 Kommentare

Hallo, immer wieder habe ich in einer Batch Probleme mit Sonderzeichen - Leertasten an umöglichen Stellen, alle Arten von Klammern, Klammeraffen, Prozentzeichen, Ausrufezeichen, etc.

Habe hier schon mal auf http://www.administrator.info/forum/korrektur-aller-falschen-dateinamen ... geschrieben - der ursprüngliche Artikel dürfte aber zu alt sein, als das sich das noch wer anschaut?!

Deshalb hier noch mal - denn ich bin mir sicher, das Problem haben bzw. hatten viele und ist sicherlich gar nicht so schwer zum lösen - wenn man nur mal weiss, wie

Beispielsweise sollte untenstehende Batch NICHTS ausgeben - doch leider...

@echo off
setlocal enabledelayedexpansion
set "Basis=c:\temp"
cd /d %Basis%
echo Suche Dateien mit Zeichen, die in der Batch Probleme machen ab %Basis%...
for /f "usebackq delims=" %%a in (`"dir "\\?\%CD%\*" /b/s"`) do (
rem dc echo Teste "%%a"...
if not exist "%%a" echo Probleme mit einer Datei, in deren Namen %%a - aber dazu noch was doofes vorkommt...
)
echo Eigentlich sollte er nichts gefunden haben... doch bei kreativen Dateinamen gibt es leider sehr wohl Eintraege...
pause

Was muss man also machen bei solchen Dateinamen?
Mitglied: rubberman
LÖSUNG 16.12.2013, aktualisiert 17.12.2013
Hallo dctibi,

deine Probleme sollten sich mit folgender Kombination lösen lassen:
  • Zuweisung eines Variablenwertes bei ausgeschalteter verzögerter Variablenerweiterung
  • Arbeiten mit dem Variablenwert bei eingeschalteter verzögerter Variablenerweiterung

ungetestet:
01.
@echo off 
02.
setlocal DisableDelayedExpansion 
03.
 
04.
for /f "delims=" %%i in ('dir /a-d /b /s "c:\temp\*"') do ( 
05.
  set "filename=%%i" 
06.
 
07.
  setlocal EnableDelayedExpansion 
08.
  if not exist "!filename!" echo Dateiname "!filename!" macht Probleme. 
09.
  endlocal 
10.
11.
 
12.
pause
Grüße
rubberman
Bitte warten ..
Mitglied: dctibi
16.12.2013 um 18:18 Uhr
Hallo Rubberman!

Sieht nicht nach einer Lösung aus

Habe jetzt nur wenige Testdateien angelegt - Dateinamen, die mit einem ! beginnen, werden weiterhin als falsch ausgegeben ((
Bitte warten ..
Mitglied: Endoro
16.12.2013 um 18:55 Uhr
Hey,
du könntest deine Frage präzisieren:
- was ist die Eingabe
- was ist die erwartete Ausgabe
lg.
Bitte warten ..
Mitglied: rubberman
16.12.2013 um 19:33 Uhr
Hallo dctibi,

ich habe mal ein "C:\Temp" bei mir angelegt und eine Datei "!%&@ ^äß(1).#" hinein gelegt. Dann meinen Batchcode um eine Zeile erweitert, damit man auch sieht, was gefunden wurde.

01.
@echo off 
02.
setlocal DisableDelayedExpansion 
03.
 
04.
for /f "delims=" %%i in ('dir /a-d /b /s "c:\temp\*"') do ( 
05.
  set "filename=%%i" 
06.
 
07.
  setlocal EnableDelayedExpansion 
08.
  echo "!filename!" wird verarbeitet. 
09.
  if not exist "!filename!" echo Dateiname "!filename!" macht Probleme. 
10.
  endlocal 
11.
12.
 
13.
pause
Die Ausgabe:
"c:\temp\!%&@ ^äß(1).#" wird verarbeitet. 
Drücken Sie eine beliebige Taste . . .
Ich kann deinen Einwand leider nicht nachvollziehen.

Grüße
rubberman
Bitte warten ..
Mitglied: Friemler
LÖSUNG 16.12.2013, aktualisiert 17.12.2013
Hallo dctibi,

ich habe mir vor einigen Jahren in einem masochistischen Anfall selbst eine Aufgabe gestellt, deren Problematik in die gleiche Richtung ging: Einen Fileselector in native Batch. Den Code habe ich später mal in diesem Thread gepostet (mein zweiter Kommentar dort). Ich konnte das Problem damals mit viel Mühe und Tricksereien lösen.

Der Code ist jetzt ca. 6 Jahre alt, ich kann Dir keine Einzelheiten mehr dazu erläutern, evtl. kannst Du Dir zumindest Anregungen herausziehen.

Was mir dazu noch im Gedächtnis geblieben ist:
  1. Ich habe so weit wie möglich versucht, auf die verzögerte Variablenerweiterung zu verzichten, da man dann zwar alle "üblichen Problemkandidaten" vom Hals hat, dafür aber mit dem Ausrufezeichen kämpfen muss.
  2. Wenn die verzögerte Variablenerweiterung ausgeschaltet ist, kann der Inhalt von Laufvariablen der FOR-Schleife mit ECHO ausgegeben werden, in einer anderen FOR-Schleife benutzt werden, als Argument an einen Befehl übergeben werden usw. Sonderzeichen werden dann brav übernommen.
  3. Probleme tauchen auf, sobald man den Inhalt einer FOR-Laufvariablen, die Sonderzeichen enthält, an eine normale Umgebungsvariable zuweist und damit irgendwelche Operationen ausführen möchte.
  4. Probleme gibt es auch, wenn man den Inhalt einer FOR-Laufvariablen an ein Unterprogramm übergeben will, und die Variable das Zeichen ^ enthält. Im Unterprogramm wird daraus ^^.
  5. Man kann aus einer FOR-Schleife ein Unterprogramm aufrufen und die Laufvariable der Schleife aus dem Hauptprogramm in einer FOR-Schleife im Unterprogramm verwenden (lässt sich mit Punkt 2 kombinieren).
  6. Man kann in einer FOR-Schleife die Laufvariable an eine normale Umgebungsvariable zuweisen und dann ein Unterprogramm aufrufen, in dem die Umgebungsvariable aus der FOR-Schleife im Hauptprogramm den aktuellen (vorher zugewiesenen Wert) hat. Damit kann man die (normale) "sofortige" Variablenerweiterung des Batch-Interpreters austricksen.
  7. Ich musste manchmal Abschnitte in den Code einbauen, in denen ich die verzögerte Variablenerweiterung temporär eingeschaltet habe (mit setlocal enabledelayedexpansion). Um am Ende eines solchen Abschnitts die geänderten Werte von Variablen aus diesem Abschnitt herauszubekommen, muss man folgendes Konstrukt verwenden:
01.
set "x=Wert1_von_x" 
02.
set "y=Wert1_von_y" 
03.
setlocal enabledelayedexpansion 
04.
05.
06.
07.
set "x=Wert2_von_x" 
08.
set "y=Wert2_von_y" 
09.
endlocal & set "x=%x%" & set "y=%y%"
Zeile 9 muss genau so notiert werden, damit man die veränderten Werte von x und y nach diesem Block wieder zur Verfügung hat.

Für dieses Problem gibt es leider keine allgemeingültige Antwort, da die Wahl der Mittel stark davon abhängt, in welchem Kontext man was erreichen möchte.

Viel Erfolg bei Deinen Versuchen
Friemler


[Edit]
BTW: Die folgende Sammlung von Dateinamen
!Hallo!.TXT 
!Hallo&Welt!.TXT 
!Hallo.TXT 
%Hallo^&^,;_^~'^Welt&&&.TXT 
&^^&%%Hall!o^^^&W%elt&^&^^&&^^.TXT 
^!Hallo^&Welt%%^^.TXT 
Hallo%Welt.TXT
lässt sich mit diesem Batchscript ausgeben:
01.
@echo off & setlocal 
02.
 
03.
set "Basis=E:\Test" 
04.
 
05.
cd /d "%Basis%" 
06.
 
07.
for /f "delims=" %%a in ('dir /s /b "%CD%\*"') do ( 
08.
  echo %%a 
09.
)
[/Edit]
Bitte warten ..
Mitglied: dctibi
17.12.2013 um 13:52 Uhr
Hallo Rubberman, mit Leertasten am Ende bekommt man da leicht wieder eine Fehlermeldung hin. Aber Danke für deinen Code - hat mir weitergeholfen.

Generelle Frage, die wohl von allgemeinen Interesse ist: EnableDelayedExpansion ist, wie der Name meiner Meinung nach nicht vermuten läßt, die Ursache, warum Dateinamen mit besonderen Zeichen bei Befehlen wie copy, move, rename, etc. Probleme macht? Das einfach vermeiden bei allen Programmierungen (was ich hier aber noch nie gesehen habe) - und man wird mit seiner Batch egal bei welcher Dateinamen-Kreativität glücklich? Habe ich das richtig verstanden?
Bitte warten ..
Mitglied: dctibi
17.12.2013 um 13:59 Uhr
Danke, das in der Zeile 9 ist ein guter Ansatz meiner Meinung nach...

Und, ja, Friemler, ich denke, du bist masochistisch

Bin ich aber vielleicht auch. Ich war immer der Meinung "keep it simple and stupid" - also löse soweit es geht immer mit der Batch... doch die Batch ist doch sehr, sehr, sehr eigen... bin mir gar nicht mehr so sicher, ob simple = batch passt (nur stupid = batch *g*)
Bitte warten ..
Mitglied: rubberman
LÖSUNG 17.12.2013, aktualisiert 18.12.2013
Hallo dctibi.

Auch Leerzeichen am Ende des Dateinamens führen bei mir unter keinen getesteten Umständen zum Fehlschlag. Vielleicht magst du ja doch noch das eine oder andere Beispiel zeigen, bei dem du Probleme hast. Ich bin überzeugt es lässt sich lösen, solang nicht der Unicode-Zeichensatz angezogen werden müsste um die Dateinamen zu verarbeiten.

Was das Delayed Expansion angeht, so ist das erst einmal ganz einfach erklärt (darin bin ich geübt, hatte ich letzthin erst getan). Ich zitiere mich also mal selbst
Das setlocal EnableDelayedExpansion schaltet die verzögerte Variablenerweiterung ein.
In einer Kommandozeile oder einem in Klammern eingefassten Block von Kommandozeilen (zB. in einer FOR Schleife) werden normale Umgebungsvariablen nur einmal zum Wert aufgelöst, und zwar noch bevor die Zeile/der Block ausgeführt wird. Das EnableDelayedExpansion verzögert diese Auflösung, sodass die Werte zur Laufzeit der Zeile/des Blocks abgreifbar sind. Die umschließenden Prozentzeichen für die Variable sind dabei durch Ausrufezeichen zu ersetzen.
Beispiel zur Verdeutlichung:
01.
@echo off 
02.
 
03.
setlocal 
04.
set "n=vorher" 
05.
for /l %%i in (0 1 4) do ( 
06.
  set "n=%%i" 
07.
  echo %n% 
08.
09.
endlocal 
10.
 
11.
echo ~~~~~~~~~ 
12.
 
13.
setlocal EnableDelayedExpansion 
14.
set "n=vorher" 
15.
for /l %%i in (0 1 4) do ( 
16.
  set "n=%%i" 
17.
  echo !n! 
18.
19.
endlocal 
20.
 
21.
pause
Ende des Zitats.

Nun hat die verzögerte Erweiterung aber noch ein paar Sideeffects. Ausrufezeichen werden (sofern sie nicht maskiert wurden) bei Wertzuweisungen mal eben eliminiert. Schlimmer wird es noch, wenn ein String in Ausrufezeichen eingefasst ist, dann wird versucht diesen als Variable zu interpretieren. Das ist der Grund, warum die Zuweisung des Wertes bei ausgeschalteter verzögerter Variablenerweiterung erfolgen sollte, nach Schema
SET "Variablenname=Wert"
Die Anführungszeichen nicht vergessen, sonst gibt's wahrscheinlich unangenehme Überaschungen bei Sonderzeichen.
Warum dann aber für die Ausgabe/Verarbeitung einschalten? Ein Grund steht schon oben: Innerhalb der Schleife lässt sich die Variable sonst nicht zum Wert auflösen. Ein weiterer Aspekt ist, dass auch Sonderzeichen auf diese Art gefahrlos verarbeitet werden können, da diese für den Kommandozeileninterpreter beim Parsen des Codes noch nicht sichtbar sind.
Wie der Kommandozeileninterpreter mit Batchcode umgeht, lässt sich dort nachlesen.

Grüße
rubberman
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Batch & Shell
gelöst Batch Variable setzten mit Leerzeichen (3)

Frage von Marlon1 zum Thema Batch & Shell ...

Batch & Shell
Batch: Variable Expansion in einer FOR-Schleife (9)

Frage von .Sessl zum Thema Batch & Shell ...

Batch & Shell
gelöst In Batch variable DOS-Funktion von "größer" und "kleiner" Zeichen unterdrücken (3)

Frage von Markus5579 zum Thema Batch & Shell ...

Batch & Shell
gelöst Batch Variable auf 5 Zeichen begrenzen (5)

Frage von PinkFLuffyUnicorn zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...