Sonderzeichen (UND-Zeichen) in Dateinamen bringt Batch zu Absturz
Hallo zusammen,
ich habe ein Problem welches ich bisher einfach nicht lösen kann. Ich habe zwar schon stundenlang
gegoogled aber anscheinend bin ich zu blind die Lösung zu finden.
Ein bereits exsitierender Thread ..kaufmännisches Und-Zeichen in den Übergabeparametern hat leider nicht geholfen.
Folgendes Szenario ist gegeben.
Eine Batchdatei soll ein Verzeichnis durchsuchen und alle Dateiname in eine Datei schreiben.
Im nächsten Schritt sollen diese Dateien weiter verarbeitet werden, in dem die Dateinamen und Inhalte
aus den Dateien in andere Dateien übertragen werden sollen.
Sobald aber ein Dateiname ein "&" enthält bricht die Verarbeitung aufgrund der Bedeutung des &-Zeichens
natürlich ab, wenn ich erweiterte Parameterfunktionen verwenden will. z.B. ~n, ~p, ~d.
Auch eine Zuweisung an eine Zwischenvariable hilft nicht, da die erweiterten Paramterfunktionen
wie ~n, ~d usw. dann nicht mehr funktionieren.
Für eine Hilfe zur Lösung des Problems bin ich sehr dankbar.
[Edit Biber] Link editiert (war nicht aufrufbar) und Codeformatierung ergänzt]
ich habe ein Problem welches ich bisher einfach nicht lösen kann. Ich habe zwar schon stundenlang
gegoogled aber anscheinend bin ich zu blind die Lösung zu finden.
Ein bereits exsitierender Thread ..kaufmännisches Und-Zeichen in den Übergabeparametern hat leider nicht geholfen.
Folgendes Szenario ist gegeben.
Eine Batchdatei soll ein Verzeichnis durchsuchen und alle Dateiname in eine Datei schreiben.
Im nächsten Schritt sollen diese Dateien weiter verarbeitet werden, in dem die Dateinamen und Inhalte
aus den Dateien in andere Dateien übertragen werden sollen.
@echo off & setlocal enableDelayedExpansion
set R=Replacer.vbs
Dir /A /B /S .\DatFiles\*.dat > %Dat_Files%
FOR /f "delims=" %%x in (%Dat_Files%) do (
for /f "delims=" %%i in ('findstr /n . "%%~x"^|findstr "^2:"') do @set ln2=%%i & call:Sub_Names !ln2:*"="! "%%x"
)
Goto :eof
:Sub_Names
@Rem %1 = Inhalt der zweiten Zeile der verarbeiteten Datei
@Rem %2 = Name inkl. Pfad des aktuellen DAT-Files
set Setname=%1
@set cmp_file=Control.cmp
@set cmp_path=%~d2%~p2
@set cmp_path=%cmp_path:DatFiles=Settings%
@set dat_file=%~n2
@>%R% echo Set fso=CreateObject("Scripting.FileSystemObject"): T=fso.OpenTextFile("%cmp_file%").ReadAll: fso.CreateTextFile("%cmp_file%",True).Write Replace(T,"Misc_DatfileNameTag = ","Misc_DatfileNameTag = " + "%Setname%")
@cscript //nologo %R%
@>%R% echo Set fso=CreateObject("Scripting.FileSystemObject"): T=fso.OpenTextFile("%cmp_file%").ReadAll: fso.CreateTextFile("%cmp_file%",True).Write Replace(T,"Scanner_FastScan = ","Scanner_FastScan = \%dat_file%.fsc")
@cscript //nologo %R%
Sobald aber ein Dateiname ein "&" enthält bricht die Verarbeitung aufgrund der Bedeutung des &-Zeichens
natürlich ab, wenn ich erweiterte Parameterfunktionen verwenden will. z.B. ~n, ~p, ~d.
Auch eine Zuweisung an eine Zwischenvariable hilft nicht, da die erweiterten Paramterfunktionen
wie ~n, ~d usw. dann nicht mehr funktionieren.
Für eine Hilfe zur Lösung des Problems bin ich sehr dankbar.
[Edit Biber] Link editiert (war nicht aufrufbar) und Codeformatierung ergänzt]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 166838
Url: https://administrator.de/forum/sonderzeichen-und-zeichen-in-dateinamen-bringt-batch-zu-absturz-166838.html
Ausgedruckt am: 05.01.2025 um 15:01 Uhr
6 Kommentare
Neuester Kommentar
Hallo DHammes,
warum setzt Du nicht die komplette Lösung in VBS um? Ist viel weniger stressig. Außerdem verwendest Du ja schon VBS und wenn ich mir den Code so anschaue, wirst Du in 3 Monaten, wenn mal eine Anpassung gemacht werden muss, selbst nicht mehr durchblicken. Die Umgehung von Problemen mit Sonderzeichen wie
Gruß
Friemler
warum setzt Du nicht die komplette Lösung in VBS um? Ist viel weniger stressig. Außerdem verwendest Du ja schon VBS und wenn ich mir den Code so anschaue, wirst Du in 3 Monaten, wenn mal eine Anpassung gemacht werden muss, selbst nicht mehr durchblicken. Die Umgehung von Problemen mit Sonderzeichen wie
&,%,(,)
usw. in Dateinamen ist in Batchscript ziemlich aufwändig, kostet Zeit und verringert die Übersichtlichkeit meistens noch mehr.Gruß
Friemler
Moin DHammes,
ergänzend zu Friemler würde ich sagen: Klar machen Streifen irgendwie schlank.
Aber wenn der Source so sehr in die Breite geht und dabei so kurz ist.... dann ist es ein indiz für das falsche Werkzeug.
( Wohlgemerkt: der Schnipsel sähe auch mit Zeilenumbrüchen und auf DIN-A4 ausgewalzt letzten Endes nicht appetitlicher aus.)
Nach es komplett mit VBScript.
Grüße
Biber
ergänzend zu Friemler würde ich sagen: Klar machen Streifen irgendwie schlank.
Aber wenn der Source so sehr in die Breite geht und dabei so kurz ist.... dann ist es ein indiz für das falsche Werkzeug.
( Wohlgemerkt: der Schnipsel sähe auch mit Zeilenumbrüchen und auf DIN-A4 ausgewalzt letzten Endes nicht appetitlicher aus.)
Nach es komplett mit VBScript.
Grüße
Biber
Hallo DHammes,
Ungetestet:
Suche mal bei Google nach "script56.chm", das müsste als erstes diesen Link ausspucken. Das ist eine gute Hilfe zum Lernen von VBS und JScript.
Gruß
Friemler
Ungetestet:
Const ForReading = 1
Const ForWriting = 2
Const AsASCII = 0
strDatFileDir = ".\DatFiles"
strDatFileType = "dat"
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strDatFileDir)
Set colFiles = objFolder.Files
For Each objFile in colFiles
If UCase(objFSO.GetExtensionName(objFile.Name)) = UCase(strDatFileType) Then
Set objDatFile = objFile.OpenAsTextStream(ForReading, AsASCII)
objDatFile.SkipLine
strSetname = objDatFile.ReadLine
objDatFile.Close
If InStr(strSetname, """") > 0 Then
strSetname = Mid(strSetname, InStr(strSetname, """"))
End If
strCmpFileName = "Control.cmp"
strCmpPath = objFile.ParentFolder
strCmpPath = Replace(strCmpPath, "DatFiles", "Settings")
strDatFile = objFSO.GetBaseName(objFile.Name)
ReplaceInFile strCmpPath & "\" & strCmpFileName, "Misc_DatfileNameTag = ", "Misc_DatfileNameTag = " & strSetname
ReplaceInFile strCmpPath & "\" & strCmpFileName, "Scanner_FastScan = ", "Scanner_FastScan = \" & strDatFile & ".fsc"
End If
Next
Sub ReplaceInFile(strFileName, strPattern, strString)
Dim objSomeFile, strText
Set objSomeFile = objFSO.OpenTextFile(strFileName, ForReading, False, AsASCII)
strText = objSomeFile.ReadAll
objSomeFile.Close
Set objSomeFile = objFSO.OpenTextFile(strFileName, ForWriting, False, AsASCII)
objSomeFile.Write Replace(strText, strPattern, strString)
objSomeFile.Close
End Sub
Suche mal bei Google nach "script56.chm", das müsste als erstes diesen Link ausspucken. Das ist eine gute Hilfe zum Lernen von VBS und JScript.
Gruß
Friemler