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

Problem mit FINDSTR und Pfeil-nach-links Zeichen

Frage Entwicklung Batch & Shell

Mitglied: Randolph

Randolph (Level 1) - Jetzt verbinden

20.09.2013 um 19:38 Uhr, 1766 Aufrufe, 8 Kommentare

Hallo allerseits!

Ich habe ein Problem mit folgendem Progrämmchen:

@ECHO off
SETLOCAL enabledelayedexpansion
FOR /f "delims=" %%i IN (inputfile.txt) DO (
SET textline=%%i
echo !textline! | findstr SearchString
)
ECHO Done^^!

Wenn in der zu durchsuchenden Datei (inputfile.txt) das Zeichen "<" vorkommt, dann erzeugt das folgende Fehlermeldung:
"Das System kann die angegebene Datei nicht finden"
Wir wohl irgendwie als Redirector interpretiert...

Hat jemand eine Lösung für dieses Problem?
Bin sehr dankbar für Anregungen.

Danke+viele Grüsse
Randolph
Mitglied: bastla
20.09.2013, aktualisiert um 20:38 Uhr
Hallo Randolph und willkommen im Forum!

Was hast Du denn genau vor (denn nur zum Ausgeben der passenden Zeilen würdest Du ja einfach
findstr SearchString inputfile.txt
verwenden )?

Grundsätzlich könntest Du das ansonsten etwa so versuchen:
echo !textline! | findstr SearchString >nul && echo !textline!
Grüße
bastla

P.S.: Bitte zum Posten von Code die passende Formatierung einsetzen ...
Bitte warten ..
Mitglied: Randolph
20.09.2013 um 21:30 Uhr
Hallo bastla,

Danke für die schnelle Antwort!
hoffe ich hab das verstanden wie das mit der Formatierung funtioniert. Hier mal ein Test:

01.
ECHO off 
02.
SETLOCAL enabledelayedexpansion 
03.
FOR /f "delims=" %%i IN (inputfile.txt) DO ( 
04.
SET textline=%%i 
05.
echo !textline! | findstr SearchString 
06.
07.
ECHO Done^^!
Hab meine Anwendung so weit wie möglich minimiert, damit jeder schnell sehen kann um was es geht.

In meiner Anwendung will ich in der Datei inputfile.txt bei den Zeilen, welche den SearchString enthalten die Zeilenenden (ab der Position des SearchStrings) durch einen festen Text ersetzen. Und da ich diese Fehlermeldungen bekomme kann ich nicht sicher sein, dass das Ersetzen in allen Fällen richtig funktioniert.
Ohne Fehlermeldungen wär mir schon lieber.

viele Grüsse
Randolph
Bitte warten ..
Mitglied: Endoro
20.09.2013 um 23:18 Uhr
Hi,
das Problem ist die Pipe |, da bleiben die Sonderzeichen hängen.
Mein Vorschlag (case-insensitiv):
01.
@ECHO OFF &SETLOCAL 
02.
FOR /f "delims=" %%i IN (inputfile.txt) DO ( 
03.
	SET "textline=%%i" 
04.
	SETLOCAL ENABLEDELAYEDEXPANSION 
05.
	if "!textline!" neq "!textline:SearchString=!" echo(!textline! 
06.
	ENDLOCAL 
07.
08.
ECHO Done!
Bei dieser Technik der Forschleife werden übrigens alle Leerzeilen eliminiert.
lg.
Bitte warten ..
Mitglied: bastla
20.09.2013, aktualisiert um 23:45 Uhr
Hallo Randolph!

Zur Unterscheidung, ob eine Zeile bearbeitet werden muss oder unverändert ausgegeben werden kann, lässt sich der oben gezeigte Ansatz verwenden:
01.
echo !textline! | findstr SearchString >nul && ( 
02.
    echo !textline! bearbeiten 
03.
) || ( 
04.
    echo !textline! unveraendert ausgeben 
05.
)
- schematisch dann also etwa so:
01.
@ECHO off 
02.
set "SearchString=DeinString" 
03.
set "FixText=DeinZusatz" 
04.
set "Ausgabe=DeineDatei.txt" 
05.
 
06.
SETLOCAL enabledelayedexpansion 
07.
(FOR /f "delims=" %%i IN (inputfile.txt) DO ( 
08.
    SET "textline=%%i" 
09.
    echo "!textline!" | findstr "%SearchString%">nul && ( 
10.
        set "Teil2=!textline:*%SearchString%=!" 
11.
        call set "textline=%%textline:!Teil2!=%FixText%%%" 
12.
13.
    echo !textline! 
14.
))>"%Ausgabe%" 
15.
ECHO Done^^!
Falls auch der SearchString selbst ersetzt werden soll, müsste die Zeile 10 so aussehen:
call set "textline=%%textline:%SearchString%!Teil2!=%FixText%%%"
Grüße
bastla
Bitte warten ..
Mitglied: Randolph
22.09.2013 um 11:11 Uhr
Hallo zusammen,

vielen Dank für die Beiträge, hat mich schon einee Schritt weitergebracht.

@bastla: Da dein Code pipes verwendet fürchte ich, dass mir die "<"-Zeichen in dem zu parsenden inputfile wieder in die Quere kommen.

Also habe ich erst mal auf dem Vorschlag von Endoro aufgesetzt. Funktioniert soweit, Problem mit "<"-Zeichen ist weg.

Beim nächsten Schritt hakt es aber wieder: Die Startposition des Suchstrings in der Zeile ermitteln.

Ich hab dazu eine Routine im Web gefunden, die ohne pipes auskommt, allerdings bekomme ich mit dem folgenden code keinen Positionswert zurück:

01.
@ECHO off  
02.
SETLOCAL 
03.
 
04.
SET "searchstring1=CONTACT_FORMAT" 
05.
 
06.
FOR /f "delims=" %%i IN (inputfile.txt) DO ( 
07.
	SET "textline=%%i" 
08.
	SETLOCAL enabledelayedexpansion 
09.
	if "!textline!" neq "!textline:%searchstring1%=!" ( 
10.
		CALL :findString "!textline!" %searchstring1% position 
11.
		echo The last position of "CONTACT" in the line is %pos%	 
12.
		) ELSE ( 
13.
		REM Do nothing 
14.
15.
	ENDLOCAL 
16.
17.
GOTO :ENDE 
18.
 
19.
:findString -- returns position of first occurrence of a string in another string 
20.
::          -- %~1: in - varible name of a string to be searched 
21.
::          -- %~1: in - string to be found 
22.
::          -- %~3: out- return variable name, will be set to position or undefined if string not found 
23.
 
24.
SETLOCAL ENABLEDELAYEDEXPANSION 
25.
set "pos=" 
26.
set "str=!%~1!" 
27.
 
28.
for /L %%a in (0,1,1023) do ( 
29.
   set "s=!str:~%%a!" 
30.
   if not defined pos if "%~2!s:*%~2=!"=="!s!" set "pos=%%a" 
31.
32.
ENDLOCAL ( 
33.
IF "%~3" NEQ "" SET "%~3=%pos%" 
34.
35.
GOTO:EOF 
36.
 
37.
:ENDE 
38.
ECHO Done^^!
Mir ist auch nicht klar, warum in der Subroutine die Variablennamen mit Tilde verwendet werden: %~3 (statt %3).
Kann mir das jemand erklären?

Ich hab das also wieder vereinfacht, um rauszukriegen was da schief läuft:

01.
@ECHO off  
02.
SETLOCAL 
03.
 
04.
SET "searchstring1=CONTACT_FORMAT" 
05.
set pos=100 
06.
 
07.
FOR /f "delims=" %%i IN (inputfile.txt) DO ( 
08.
	SET "textline=%%i" 
09.
	SETLOCAL enabledelayedexpansion 
10.
	if "!textline!" neq "!textline:%searchstring1%=!" ( 
11.
		CALL :findString 15 34 %pos% 
12.
		echo The last position of "CONTACT_FORMAT": %pos% 
13.
		) ELSE ( 
14.
		REM Do nothing 
15.
16.
	ENDLOCAL 
17.
18.
GOTO :ENDE 
19.
 
20.
:findString -- returns position of first occurrence of a string in another string, case sensitive, maximum string length is 1023 characters 
21.
::          -- %~1: in - varible name of a string to be searched 
22.
::          -- %~1: in - string to be found 
23.
::          -- %~3: out- return variable name, will be set to position or undefined if string not found 
24.
SETLOCAL ENABLEDELAYEDEXPANSION 
25.
set var1=%1 
26.
set var2=%2 
27.
set var3=%3 
28.
set %3=199 
29.
echo %var1% and %var2% and %var3% 
30.
ENDLOCAL ( 
31.
set %3=199 
32.
33.
GOTO:EOF 
34.
 
35.
:ENDE 
36.
ECHO Done^^!
Die Variable pos bzw. auch %3 in der Subroutine bleiben immer auf dem Wert 100. Der Wert 199 wird nie übernommen
Bin jetzt wieder am Ende mit meinem Latein. Kann mir jemand einen Tip geben ?

Wär klasse !

Danke+Grüsse
Randolph
Bitte warten ..
Mitglied: bastla
22.09.2013 um 13:45 Uhr
Hallo Randolph!
fürchte ich, dass mir die "<"-Zeichen in dem zu parsenden inputfile wieder in die Quere kommen.
Du ziehst Befürchtungen einem Test vor?

Grüße
bastla
Bitte warten ..
Mitglied: Randolph
22.09.2013 um 23:21 Uhr
Hallo bastla,

du hast völlig recht. Du hast dir die Mühe gemacht und die Antwort plus Code dazu verfasst, dann sollte ich das zumindest mal antesten.
Habe einfach der Antwort von Endoro Glauben geschenkt, dass das Problem mit den pipes zusammenhängt.
Da habe ich dein Lösung erst mal verworfen, weil diese pipes benutzt.

Ich glaube inzwischen, dass es mit der String-Substitution zusammenhängt und eher nicht mit den pipes.
Was meinst du dazu ?

Auf jeden Fall habe ich jetzt nach einigen Stunden rumprobieren ein Progrämmchen, welches genau das tut was ich will und welches ich der Vollständigkeit halber hier poste.
Es ersetzt Zeilenenden von Zeilen, die einen bestimmten Suchstring enthalten mit einem definierbaren Fixtext.
Es benutzt keine pipes und auch keine CALL-Aufrufe.

01.
@ECHO off  
02.
SETLOCAL 
03.
echo Starte Fakturama auf deutsch 
04.
SET "fakturama_workdir=D:\Daten\Fakturama\Database\" 
05.
SET "fakturama_progdir=C:\Programme\Fakturama\" 
06.
SET "quell_datei=Database.script" 
07.
SET "ziel_datei=Database.script.tmp" 
08.
SET "searchstring4='CONTACT_FORMAT_GREETING_COMMON'," 
09.
SET "searchstring3='CONTACT_FORMAT_GREETING_MR'," 
10.
SET "searchstring2='CONTACT_FORMAT_GREETING_MS'," 
11.
SET "searchstring1='CONTACT_FORMAT_GREETING_COMPANY'," 
12.
SET "replacement4='Sehr geehrte Damen und Herren')" 
13.
SET "replacement3='Sehr geehrter Herr {lastname}')" 
14.
SET "replacement2='Sehr geehrte Frau {lastname}')" 
15.
SET "replacement1='Sehr geehrte Damen und Herren')" 
16.
 
17.
REM Loeschen der Ausgabedatei, falls sie (noch) existiert 
18.
IF EXIST %ziel_datei% (DEL /f %ziel_datei% 1>NUL 2>NUL) 
19.
 
20.
FOR /f "delims=" %%i IN (%fakturama_workdir%%quell_datei%) DO ( 
21.
	SET "textline=%%i" 
22.
	SETLOCAL enabledelayedexpansion 
23.
	IF "!textline!" neq "!textline:%searchstring1%=!" ( 
24.
		call set rest=%%textline:*!searchstring1!=%% 
25.
		call set anfang=%%textline:!rest!=%% 
26.
		set NeueZeile=!anfang!!replacement1! 
27.
		ECHO !NeueZeile!>>%ziel_datei% 
28.
		) ELSE ( 
29.
				IF "!textline!" neq "!textline:%searchstring2%=!" ( 
30.
				call set rest=%%textline:*!searchstring2!=%% 
31.
				call set anfang=%%textline:!rest!=%% 
32.
				set NeueZeile=!anfang!!replacement2! 
33.
				ECHO !NeueZeile!>>%ziel_datei% 
34.
				) ELSE ( 
35.
						IF "!textline!" neq "!textline:%searchstring3%=!" ( 
36.
						call set rest=%%textline:*!searchstring3!=%% 
37.
						call set anfang=%%textline:!rest!=%% 
38.
						set NeueZeile=!anfang!!replacement3! 
39.
						ECHO !NeueZeile!>>%ziel_datei% 
40.
						) ELSE ( 
41.
							IF "!textline!" neq "!textline:%searchstring4%=!" ( 
42.
							call set rest=%%textline:*!searchstring4!=%% 
43.
							call set anfang=%%textline:!rest!=%% 
44.
							set NeueZeile=!anfang!!replacement4! 
45.
							ECHO !NeueZeile!>>%ziel_datei% 
46.
							) ELSE ( 
47.
								REM Write original line 
48.
								ECHO !textline!>>%ziel_datei% 
49.
									))))							 
50.
ENDLOCAL 
51.
52.
DEL %fakturama_workdir%%quell_datei% 
53.
REN %fakturama_workdir%%ziel_datei% %quell_datei%	 
54.
START %fakturama_progdir%Fakturama.exe -nl de_DE
Die Frage, warum das "<"-Zeichen Probleme bei FINDSTR bzw. Stringsubstitution macht ist allerdings noch nicht geklärt.
Deshalb weiss ich nicht, ob man das Thema auf gelöst setzen kann.

Wie setzt man denn ein Thema auf gelöst und wer macht das üblicherweise?

Vielen Dank und viele Grüsse
Randolph
Bitte warten ..
Mitglied: Endoro
23.09.2013 um 00:12 Uhr
Hi Randolph,
Zitat von Randolph:
Die Frage, warum das "<"-Zeichen Probleme bei FINDSTR bzw. Stringsubstitution macht ist allerdings noch nicht
geklärt.
Weil die Schutzfunktion von delayed expansion sich nicht auf die Pipe erstreckt.
Deshalb müssen dann die gefährlichen Sonderzeichen <>&| wieder escaped werden.
Entweder wie @bastla es gemacht hat ("ZollZeichen") oder ^Carets^.

Wie setzt man denn ein Thema auf gelöst und wer macht das üblicherweise?
Das macht üblicherweise der Threadstarter. Wie steht in der FAQ
lg.
Bitte warten ..
Neuester Wissensbeitrag
Windows 10

Powershell 5 BSOD

(8)

Tipp von agowa338 zum Thema Windows 10 ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
gelöst Server erkennt Client nicht wenn er ausserhalb des DHCP Pools liegt (28)

Frage von Mar-west zum Thema LAN, WAN, Wireless ...

Outlook & Mail
gelöst Outlook 2010 findet ost datei nicht (19)

Frage von Floh21 zum Thema Outlook & Mail ...

Microsoft
Ordner mit LW-Buchstaben versehen und benennen (19)

Frage von Xaero1982 zum Thema Microsoft ...

Netzwerkmanagement
gelöst Anregungen, kleiner Betrieb, IT-Umgebung (18)

Frage von Unwichtig zum Thema Netzwerkmanagement ...