Top-Themen

Aktuelle Themen (A bis Z)

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

Mitglied: Randolph

Randolph (Level 1) - Jetzt verbinden

20.09.2013 um 19:38 Uhr, 1834 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 ..
Ähnliche Inhalte
Batch & Shell
Nur findstr Erstfund ausgeben
gelöst Frage von neusterBatch & Shell18 Kommentare

Bin komplett neu hier und kenne mich überhaupt nicht aus. Kann man mit dem Befehl findstr auch nur den ...

Windows Tools
Findstr und regex
gelöst Frage von tobmesWindows Tools5 Kommentare

Hi Experten, ich habe ziemlich viele PDF-Dateien, die ich mittels eines Batch-Files nach einem Bestimmten Muster durchsuchen möchte. Die ...

Windows 7
Txt Datei mit findstr durchsuchen
gelöst Frage von 126594Windows 72 Kommentare

Hallo zusammen! Leider komme ich gerade an meine Grenzen und weiß nicht mehr weiter, jetzt hoffe ich hier, den ...

Mac OS X

Terminal Befehlseingabe liefert nur ein Pfeil nach rechts

gelöst Frage von H41mSh1C0RMac OS X5 Kommentare

Hi@All, es ist mal wieder soweit ich muss mal wieder was direkt auf dem MacOSX machen. Ziel: aus dem ...

Neue Wissensbeiträge
Humor (lol)
Administrator.de Perlen
Tipp von DerWindowsFreak2 vor 4 TagenHumor (lol)6 Kommentare

Hallo, Heute beim stöbern auf dieser Seite bin auf folgenden Thread aus dem Jahre 2006 gestossen: Was meint ihr? ...

Erkennung und -Abwehr
OpenSSH-Backdoor Malware erkennen
Tipp von Frank vor 5 TagenErkennung und -Abwehr

Sicherheitsforscher von Eset haben 21 Malware-Familien untersucht. Die Malware soll Hintertüren via OpenSSH bereitstellen, so dass Angreifer Fernzugriff auf ...

iOS
WatchChat für Whatsapp
Tipp von Criemo vor 8 TageniOS5 Kommentare

Ziemlich coole App für WhatsApp User in Verbindung mit der Apple Watch. Gibts für iOS sowohl als auch für ...

iOS
IOS hat nen Cursor!
Tipp von Criemo vor 9 TageniOS5 Kommentare

Nette Funktion im iOS. iPhone-Mauszeiger aktivieren „Nichts ist nerviger, als bei einem Tippfehler zu versuchen, den iOS-Cursor an die ...

Heiß diskutierte Inhalte
Samba
Windows 10 Client in Samba-Domäne hinzufügen scheitert
Frage von diwaffmSamba31 Kommentare

Hi Leute, ich habe einen Samba Server in der Version 4.9.3 auf einer OpenSuse Maschine laufen. Damit sind momentan ...

Windows Systemdateien
Verknüpfungen nach Pfadwechsel
Frage von Hendrik2586Windows Systemdateien17 Kommentare

Guten Morgen meine lieben Kollegen und Kolleginnen, ich hab da mal eine Frage die Ihr sicher schon kennt. Es ...

Batch & Shell
CMD-Fenster nach Task schließen
gelöst Frage von Hyperlink.93Batch & Shell16 Kommentare

Hallo, ich habe ein Skript was über einen Task bei jeder User Anmeldung läuft. Der Task startet eine CMD ...

Netzwerkmanagement
Sehr langsame Netzverbindung in einem bestimmten Subnet
gelöst Frage von gabeBUNetzwerkmanagement15 Kommentare

Hallo Zusammen Ich habe das folgende Problem: Unser Netzwerk, dass aus verschiedenen Subnetzwerken aufgebaut ist, ist nicht in jedem ...