dhammes
Goto Top

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.


@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]

Content-Key: 166838

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

Printed on: April 24, 2024 at 04:04 o'clock

Member: Friemler
Friemler May 24, 2011 at 17:30:56 (UTC)
Goto Top
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 &,%,(,) usw. in Dateinamen ist in Batchscript ziemlich aufwändig, kostet Zeit und verringert die Übersichtlichkeit meistens noch mehr.

Gruß
Friemler
Member: Biber
Biber May 24, 2011 at 17:58:02 (UTC)
Goto Top
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
Member: DHammes
DHammes May 24, 2011 at 19:15:25 (UTC)
Goto Top
Hi Friemler,

das VBS-Script habe ich selbst auch aus dem Internet rausgesucht da ich mich absolut nicht damit auskenne.
Anscheinend bleibt mir nichts anderes übrig als VBS zu lernen. Wenn aber jemandem trotzdem eine Lösung
für mein Problem einfällt bitte posten

Trotzdem Danke.
Member: Friemler
Friemler May 24, 2011 at 22:31:53 (UTC)
Goto Top
Hallo DHammes,

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
Member: DHammes
DHammes May 25, 2011 at 08:15:37 (UTC)
Goto Top
Hi Friemler,

vielen Dank für den Code-Schnipsel. Ich denke mal das ist 'ne Basis auf die ich aufbauen kann. Zumindest verstehe ich wie der Code funktionieren soll :D
Also nochmals vielen Dank.
Member: jeb-the-batcher
jeb-the-batcher May 26, 2011 at 21:02:01 (UTC)
Goto Top
Hallo DHammes,

eine einfache Lösung ist meistens bei SET Anweisungen Anführungszeichen zu verwenden
SET "var=%%~i"  
Danach sollte man auf var nur noch per delayed expansion zugreifen, weil dann Sonderzeichen keine Rolle mehr spielen

Gruß
jeb