don.redhorse
Goto Top

Anführungszeichen, Schräger etc. aus String entfernen zum Umbenennen einer Datei

Da der eigentlichen Thread ein "wenig" unübersichtlich wurde, hier die Fortsetzung.

Hallo,

in diesem Thread wurde mein Problem schon soweit gelöst. String aus PDF Datei als Dateinamenszusatz für eben diese PDF Datei

Die neue Frage noch einmal:

Im Prinzip funktioniert es auch schon ganz gut, ich habe jetzt nur noch Probleme mit Zeichen die nicht in Dateinamen vorkommen dürfen. Insbesondere """ und "/" werden gerne verwendet.

Dazu habe ich, natürlich, hier auch gesucht und auch eine Lösung gefunden. Nur die Umsetzung ist mehr als unschön.

Es betrifft folgenden Teil der Batch:
for /f "tokens=1,2* delims=," %%i in ('type "%~1.txt" ^|findstr "1ST"') do set "var=%%i"  
set "var=!var:~18,-1!"  

in der Zeile steht dann soetwas wie:

bringe bitte die Bananen in Raum "D" / "C"  

Am Ende der Batch wird aus diversen Variablen der Dateiname zusammen gesetzt. Kommt in "var" nun ein """ oder "/" vor knallt es natürlich.

"Meine Lösung" (ist natürlich hier aus dem Forum kopiert) sieht so aus:

if not exist "%~1.txt" echo Fehler bei Datei %~1 >> "Aufträge.log"  
for /f "tokens=1,2* delims=," %%i in ('type "%~1.txt" ^|findstr "1ST"') do set "var=%%i"  
set "var=!var:~18,-1!"  

echo %var%
call b.cmd %var%>kopie.txt
echo call Ende
pause

for /f "tokens=* delims=," %%i in ('type "kopie1.txt" ') do set "var=%%i"  

echo %var%
pause
if exist kopie.txt del kopie.txt

mit diesem Part rufe ich also eine weitere Batch auf:

@ECHO OFF
setlocal enabledelayedexpansion
rem echo b.cmd %datei%
for /f "delims=" %%i in ("%var%") do (  
	set "line=%%i"   
	echo !line:/=!
)
call c.cmd>kopie1.txt
goto :EOF
:EOF

und damit noch eine:
@ECHO OFF
setlocal enabledelayedexpansion
for /f "tokens=* delims=," %%i in ('type "kopie.txt" ') do set "var=%%i"  
for /f "delims=" %%i in ("%var%") do (  
	set "line=%%i"   
	echo !line:"=!  
)

goto :EOF
:EOF

das ganze funktioniert zwar, erscheint mir aber sehr sehr unschön.

Wie bekomme ich die Zeile "echo !line:"=!" direkt auf eine Variable? Oder, wie kann ich ""/\&" sonst aus der Variable "var" rauswerfen?

Ich hänge hier noch einmal die gesamte Batch an, die wichtigsten Schritte sind jetzt kommentiert:

@echo off
setlocal enabledelayedexpansion
set "Dateiname=0"  
@chcp 1252
cd /d "C:\Users\Public\Documents\Aufträge"  
for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na"  
goto :eof

REM DATEINAME EINLESEN
:processlines
set Dateiname=%~1
echo %Dateiname% >> "Aufträge.log"  
for /f "tokens=3,4,5 delims= " %%a in ("%Dateiname%") do set "Datei"="%%a %%b %%c"  

REM PDF IN TEXT WANDELN
C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf"  

REM AUFTRAGSBESCHREIBUNG KOPIEREN
if not exist "%~1.txt" echo Fehler bei Datei %~1 >> "Aufträge.log"  
for /f "tokens=1,2* delims=," %%i in ('type "%~1.txt" ^|findstr "1ST"') do set "var=%%i"  
set "var=!var:~18,-1!"  

REM BASTELEI FÜR SONDERZEICHEN
call b.cmd %var%>kopie.txt
echo call Ende

for /f "tokens=* delims=," %%i in ('type "kopie1.txt" ') do set "var=%%i"  

echo %var%
pause
if exist kopie.txt del kopie.txt
if exist kopie1.txt del kopie1.txt

REM LEERZEICHEN ELIMINIEREN IN AUFTRAGSBESCHREIBUNG
:loop1
rem echo !var!
if "%var:~0,1%"==" " set "var=%var:~1%" & goto :loop1  
:loop2
if "%var:~-1%"==" " set "var=%var:~0,-1%" & goto :loop2  
rem echo Nachher: #%var%#

REM AUFTRAGSGEBER HERRAUSFINDEN UND KOPIEREN
for /f "tokens=2 delims=:+" %%i in ('type "%~1.txt" ^|findstr "standhaltung:"') do set "nam=%%i"  
set "nam=!nam:~0,-1!"  

REM LEERZEICHEN ELIMINIEREN IN NAME AUFTRAGSGEBER
:loop11
rem echo !nam!
if "%nam:~0,1%"==" " set "nam=%nam:~1%" & goto :loop11  
:loop21
if "%nam:~-1%"==" " set "nam=%nam:~0,-1%" & goto :loop21  
rem echo Nachher: %nam%

REM DAS GANZE ZUSAMMENFÜHREN UND DIE DATEI UMBENAMSEN
for /f "Tokens=2,4" %%a in ('type "%~1.txt" ^|findstr "Auftragsnummer"') do (  
	set "Name=%%a %%b !var! %Datei% %nam%.pdf"  
	echo !Name!
	echo 	!Name! >> "Aufträge.log"  
	set "Name=%%a %%b !var! %Datei% %nam%.pdf"  
	if exist !Name! echo Datei schon vorhanden !Name!>> "Aufträge.log"	  
	ren "%~1.pdf" "!Name!"  
	del "%Dateiname%.txt"  
)
:eof

Ich hoffe das kann man so jetzt besser lesen.

Wie gesagt, es "funktioniert", sieht aber echt nicht mehr schön aus.

Grüße aus dem total verregneten Münster

Content-Key: 174552

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

Printed on: April 18, 2024 at 14:04 o'clock

Member: jeb-the-batcher
jeb-the-batcher Oct 12, 2011 at 13:24:46 (UTC)
Goto Top
Hallo don.redhorse,

zum einfachen entfernen von Sonderzeichen a'la <>&|": kann man einfach die ersetzung verwenden

setlocal EnableDelayedExpansion
set "filename=!filename:&=!"  
set "filename=!filename:<=!"  
set "filename=!filename:>=!"  
set "filename=!filename:|=!"  
set "filename=!filename:"=!"  
set "filename=!filename::=!"  
echo !filename!

Entfernt einfach diese Zeichen aus filename

jeb
Member: don.redhorse
don.redhorse Oct 13, 2011 at 06:14:05 (UTC)
Goto Top
guten Morgen,

Danke, dass funktioniert schon sehr gut, aber:

REM BASTELEI FÜR SONDERZEICHEN
rem echo vorher !var!

set "var=!var:\=!"  
set "var=!var:/=!"  
set "var=!var::=!"  

set "var=!var:?=!"  
set "var=!var:"=!"  
set "var=!var:<=!"  
set "var=!var:>=!"  
set "var=!var:|=!"  
echo !var!

so sieht das jetzt aus.
Diese Zeichen dürfen im Dateinamen nicht erscheinen.
In die Lücke gehört eigentlich noch
 * 
, nehme ich es aber mit rein wird der Inhalt von "var" gegen
*=
getauscht.

wenn ich jetzt in der Zeile die in "var" gespeichert wird ein "*" habe wird der Dateiname an dieser Stelle von einem Teil von "var" ergänzt.

Sterne werden in der Auftragsbeschreibung zwar nicht, bzw. nicht oft verwendet, aber gibts da nicht doch eine Möglichkeit?

Die betreffende Textzeile sieht so aus:

Auftrag: Bringe bitte die Bananen > Raum "D" / "C" bei < 2 Stück nur nach "A|B" \oder?  
Das wird in:
Auftrag Bringe bitte die Bananen  Raum D  C bei  2 Stück nur nach AB oder
gewandelt.

aus:
Auftrag: Bringe bitte die *Bananen > Raum "D" / "C" bei < 2 Stück nur nach "A|B" \oder?  
wird
Auftrag Bringe bitte die .06.2011.pdfBananen  Raum D  C bei  2 Stück nur nach AB oder

Grüße aus dem, tatsächlich, trockenen Münster
Member: pieh-ejdsch
pieh-ejdsch Oct 13, 2011 at 18:05:55 (UTC)
Goto Top
moin don.redhorse,

wenn in Deinen Dateinamen fehlende Ausrufezeichen keine Rolle spielen und Du von Beginn an in Deinem Batch
setlocal enabledelayedexpansion
Bis zu Diesem Teil belässt:
:Check
for /f "tokens=1*delims=*" %%i in ("!Name!") do for /f "delims=" %%k in ("%%j") do (set "Name=%%i%%j"  
  goto :Check
)
Bekommst Du alle Sternchen weg

Gruß Phil
Member: don.redhorse
don.redhorse Oct 14, 2011 at 08:29:49 (UTC)
Goto Top
Moin!

Ausrufezeichen etc. sind egal. Geht nur darum den Kurztext des Auftrages in den Dateinamen zu bekommen.

Jetzt klappt es. Danke!

Ich hänge die ganze Batch mal an:

@echo off
setlocal enabledelayedexpansion
set "Dateiname=0"  
@chcp 1252
cd /d "C:\Users\Public\Documents\Aufträge"  
for /f "delims=" %%a in ('dir /b PO*.pdf') do call :processlines "%%~na"  
goto :eof

REM DATEINAME EINLESEN
:processlines
set Dateiname=%~1
echo %Dateiname% >> "Aufträge.log"  
for /f "tokens=3,4,5 delims= " %%a in ("%Dateiname%") do set "Datei=%%a %%b %%c"  

REM PDF IN TEXT WANDELN
C:\script\pdf2txt\pdftotext.exe -layout "%~1.pdf"  

REM AUFTRAGSBESCHREIBUNG KOPIEREN
if not exist "%~1.txt" echo Fehler bei Datei %~1 >> "Aufträge.log"  
for /f "tokens=1,2* delims=," %%i in ('type "%~1.txt" ^|findstr "1ST"') do set "var=%%i"  
set "var=!var:~18,-1!"  

REM BASTELEI FÜR SONDERZEICHEN
set "var=!var:\=!"  
set "var=!var:/=!"  
set "var=!var::=!"  
set "var=!var:?=!"  
set "var=!var:"=!"  
set "var=!var:<=!"  
set "var=!var:>=!"  
set "var=!var:|=!"  

REM STERNE RAUSWERFEN
:Check
for /f "tokens=1*delims=*" %%i in ("!var!") do for /f "delims=" %%k in ("%%j") do (set "var=%%i%%j"  
	goto :Check
)

REM LEERZEICHEN ELIMINIEREN IN AUFTRAGSBESCHREIBUNG
:loop1
rem echo !var!
if "%var:~0,1%"==" " set "var=%var:~1%" & goto :loop1  
:loop2
if "%var:~-1%"==" " set "var=%var:~0,-1%" & goto :loop2  
rem echo Nachher: #%var%#

REM AUFTRAGSGEBER HERRAUSFINDEN UND KOPIEREN
for /f "tokens=2 delims=:+" %%i in ('type "%~1.txt" ^|findstr "standhaltung:"') do set "nam=%%i"  
set "nam=!nam:~0,-1!"  

REM LEERZEICHEN ELIMINIEREN IN NAME AUFTRAGSGEBER
:loop11
rem echo !nam!
if "%nam:~0,1%"==" " set "nam=%nam:~1%" & goto :loop11  
:loop21
if "%nam:~-1%"==" " set "nam=%nam:~0,-1%" & goto :loop21  

REM DAS GANZE ZUSAMMENFÜHREN UND DIE DATEI UMBENAMSEN
for /f "Tokens=2,4" %%a in ('type "%~1.txt" ^|findstr "Auftragsnummer"') do (  
	set "Name=%%a %%b !var! %Datei% %nam%.pdf"  
	rem echo !Name!
	echo 	!Name! >> "Aufträge.log"  
	set "Name=%%a %%b !var! %Datei% %nam%.pdf"  
	if exist !Name! echo Datei schon vorhanden !Name!>> "Aufträge.log"	  
	ren "%~1.pdf" "!Name!"  
	del "%Dateiname%.txt"  
)
:eof

Danke und Grüße aus Münster

ab ins Wochenende