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
GELÖST

Anführungszeichen in der Suchzeichenkette des Befehls findstr maskieren

Frage Entwicklung Batch & Shell

Mitglied: evinben

evinben (Level 2) - Jetzt verbinden

24.12.2012, aktualisiert 25.12.2012, 5043 Aufrufe, 9 Kommentare

Frohe Weihnachtszeit,

falls jemand ein Tipp auf der Schnelle parat hat, wäre es schön...

Das Anführungszeichen in der Suchzeichenkette des Befehls findstr lässt sich nicht maskieren:

01.
	:Bei unzulässigen Zeichen in der Bezeichnung (in dem Dateinamen) Warnung ausgeben und erneut zur Eingabe auffordern. 
02.
	ECHO "%Name-Suffix_of_Differential-VHD%" | findstr "\ / : * ? " < > |" && ( 
03.
		ECHO Ein Dateiname darf keines der folgenden Zeichen enthalten: \/:*?"<>| 
04.
		goto :M5 
05.
		)

Folgendes habe ich probiert, jedoch ohne Erfolg:
\"
^"
""

Alternative Lösungsvorschläge wären natürlich möglich.


Gruß
evinben
Mitglied: Hitman4021
24.12.2012 um 12:58 Uhr
Hallo,

sicher das \" nicht funktioniert?
http://www.robvanderwoude.com/escapechars.php

Gruß
Bitte warten ..
Mitglied: rubberman
24.12.2012, aktualisiert um 15:04 Uhr
Hallo evinben,

dein Script hat einen entscheidenden Knackpunkt:
Du schickst einen in Anführungszeichen eingepackten String an FINDSTR und prüfst anschließend, ob Anführungszeichen vorhanden sind. Ja klar sind dann Anführungszeichen vorhanden. Zudem wirst du das Ganze ohne DelayedExpansion wohl kaum sicher hinbekommen.
01.
setlocal EnableDelayedExpansion 
02.
echo("!Name-Suffix_of_Differential-VHD!"|findstr /rc:"..*[<>|\\/:?\"].*." >nul &&echo Mist. 
03.
endlocal
Ich bin mir nicht ganz sicher ob das schon der Weisheit letzter Schluss ist. Teste mal ein bisschen.

Grüße
rubberman
Bitte warten ..
Mitglied: evinben
24.12.2012, aktualisiert 25.12.2012
Hallo rubberman,

auch mit regulärem Ausdruck in findtsr und mit der Option setlocal EnableDelayedExpansion habe ich probiert, jedoch alles ohne Erfolg.

Auch deine Methode 1:1 habe ich übernommen, jedoch wird folgende Ausgabe jeweils generiert
(paar Minuten habe ich mit verschiedenen anderen Varianten der Maskierungen in findstr probiert...):

01.
FINDSTR: >nul kann nicht ge”ffnet werden. 
02.
FINDSTR: &&echo kann nicht ge”ffnet werden. 
03.
FINDSTR: Mist. kann nicht ge”ffnet werden.
Der Code-Abschnitt sieht momentan so aus:
01.
	:Bei unzulässigen Zeichen in der Bezeichnung (in dem Dateinamen) Warnung ausgeben und erneut zur Eingabe auffordern. 
02.
	setlocal EnableDelayedExpansion 
03.
	ECHO !Name-Suffix_of_Differential-VHD! | findstr /r "[<>|\\/:\"?]" && ( 
04.
		ECHO Ein Dateiname darf keines der folgenden Zeichen enthalten: \/:*?"<>| 
05.
		goto :M5 
06.
07.
		endlocal

Du schickst einen in Anführungszeichen eingepackten String an FINDSTR und prüfst anschließend, ob Anführungszeichen vorhanden sind

Sorry für die Verwirrung, dies war natürlich nicht absichtlich. Ich bin gar nicht so weit gekommen, daher sind mir die Anführungszeichen in der Variable gar nicht aufgefallen.

Gruß
evinben
Bitte warten ..
Mitglied: rubberman
24.12.2012 um 20:03 Uhr
Hallo evinben,

dein letzter Code weicht doch erheblich von dem ab, was ich gepostet hatte. Vielleicht gibst du uns mal den String mit auf den Weg, bei dem du diese Fehlermeldung bekommen hast.

Grüße
rubberman
Bitte warten ..
Mitglied: Friemler
25.12.2012, aktualisiert um 02:13 Uhr
Hallo evinben,

ich schlage eine Lösung mit Inline-VBScript vor:
01.
@echo off & setlocal 
02.
 
03.
:: Irgendwelche Befehle 
04.
:: die 
05.
:: den Dateinamen erzeugen 
06.
 
07.
set "Name-Suffix_of_Differential-VHD=Irgendwas" 
08.
 
09.
 
10.
set "VBScript=%TEMP%\CheckFilename.vbs" 
11.
 
12.
> "%VBScript%" echo.intResult = 0 
13.
>>"%VBScript%" echo. 
14.
>>"%VBScript%" echo.If WScript.Arguments.Count ^> 0 Then 
15.
>>"%VBScript%" echo.  Set objRegExp     = new RegExp 
16.
>>"%VBScript%" echo.  objRegExp.Pattern = "[\\/:\*?<>""]" 
17.
>>"%VBScript%" echo.  If objRegExp.Test(WScript.Arguments(0)) Then intResult = 1 
18.
>>"%VBScript%" echo.End If 
19.
>>"%VBScript%" echo. 
20.
>>"%VBScript%" echo.WScript.Quit intResult 
21.
 
22.
cscript /nologo "%VBScript%" "%Name-Suffix_of_Differential-VHD%" 
23.
 
24.
if ERRORLEVEL 1 ( 
25.
  echo Ein Dateiname darf keines der folgenden Zeichen enthalten: \/:*?^<^>^|" 
26.
) else ( 
27.
  echo Alles klar 
28.
29.
 
30.
del "%VBScript%"
Gruß
Friemler
Bitte warten ..
Mitglied: evinben
25.12.2012, aktualisiert um 14:43 Uhr
Gruß rubberman,

dein letzter Code weicht doch erheblich von dem ab, was ich gepostet hatte.
wie geschrieben ich habe ja weiter experimentiert und das ist einfach der letzte Modifizierungsstand meines Codeabschnittes gewesen, ansonsten nichts weiteres und mehr wollte ich damit ausdrucken.

Vielleicht gibst du uns mal den String mit auf den Weg, bei dem du diese Fehlermeldung bekommen hast.
ich habe ja oben geschrieben:
"Auch deine Methode 1:1 habe ich übernommen, jedoch wird folgende Ausgabe jeweils generiert"
Die Ausgabe, welche mit deinem Code bei mir generiert wird (1:1 übernommen), habe ich dir ja oben bereits gezeigt.

Jedoch, weil du etwas mistrauisch reagiert hast, habe ich noch eine Weile mit dem Vorschlag experimentiert und einen Erfolg erlebt!
Und so funktioniert es:
01.
:M5 
02.
set Name-Suffix_of_Differential-VHD= 
03.
set /p Name-Suffix_of_Differential-VHD=etwas eingeben:  
04.
 
05.
setlocal EnableDelayedExpansion 
06.
echo "!Name-Suffix_of_Differential-VHD!"|findstr /r ".[\\/:*?\"^<^>^|]." 
07.
if "%errorlevel%"=="0" ( 
08.
	echo Ein Dateiname darf keines der folgenden Zeichen enthalten: \/:*?^"^<^>:^| 
09.
	goto :M5 
10.
11.
endlocal


Mit deiner Reihenfolge der Zeichen in der Suche geht es auch: "..*[<>|\\/:?\"].*."
Jedoch so reduziert ebenso: ".[<>|\\/:?\"]."
(Der Schalter /c: kann doch überall erspart werden)

Und an alle:
Was haben wir davon gelernt? Wird die Reihenfolge dieser Sonderzeichen in der Suchzeichenkette getauscht, so müssen einige von denen doch maskiert werden. Da mir dieser Zusammenhang der Sonderzeichen nicht vollständig klar ist (warum, wenn z. B. "<" vorne steht keine Maskierung zwingend notwendig ist (obwohl diese nicht stört) aber wenn das Zeichen hinten seht, dann nur mit Maskierung möglich ist), kann ich noch keine Regel daraus ziehen. Daher wie der rubberman@ oben vorgeschlagen hat einfach experimentieren.

findstr mag anscheinend nicht, wenn bei Verwendung regulärer Ausdrücke noch etwas auf seiner Zeile dahinten steht (und konkret: etwa ">nul" oder "&& echo misst" und sonstiges am Ende, verursacht die fehlerhafte Ausgabe wie oben), daher wurde das Ausweichmanöver mit %ERRORLEVEL% in der nächsten Zeile angewendet.
Das einzige Problem, das eventuell jemanden bei so einem ähnlichen Vorhaben stören könnte, ist also dass bei der Eingabe dieser unerwünschten Sonderzeichen die Rückmeldung findstr mit >nul nicht unterdrückt werden kann. Für das momentane Vorhaben ist dies natürlich überhaupt nicht störend, da die Eingabe von Sonderzeichen ja ein Sonderfall ist. Wenn es jedoch umgekehrt sein sollte, dann wird es sicherlich sehr spannend die richtige Lösung zu finden die Rückmeldung zu unterdrücken…

Gruß
evinben
Bitte warten ..
Mitglied: evinben
25.12.2012 um 13:46 Uhr
Gruß Friemler,

deinen Lösungsvorschlag werde ich gerne im Auge behalten, falls es mit bereits funktionierenden schlanken Batch-Lösung doch zu Engpässe kommen sollte.

Gruß
evinben
Bitte warten ..
Mitglied: pieh-ejdsch
25.12.2012, aktualisiert 29.12.2012
moin,

einen hab ich noch - eine Alternative:
01.
@echo off 
02.
 
03.
:Eingabe 
04.
set /p "X=Dateiname Eingeben: " ||goto :Eingabe 
05.
setlocal enabledelayedexpansion 
06.
for /f tokens^=2delims^=\/:*?^<^>^|^" %%i in (" !x! ") do endlocal&echo Falsche Eingabe&goto :Eingabe 
07.
if !os! equ %OS% endlocal 
08.
echo rem Hier gehts weiter. 
09.
 
10.
pause
Gruß Phil
Bitte warten ..
Mitglied: evinben
26.12.2012 um 13:59 Uhr
Hallo Phil,

deine Lösung…. ja.., die funktioniert.... Ich blicke zwar nicht durch, und konkret warum in (" !x! ") unbedingt zwei Leerzeichen sein müssen und wie du überhaupt drauf gekommen bist, wenn laut den Regeln von FOR-Schleife dies eigentlich völlig egal sein sollte …? Und so etwas, wie tokens^=2delims^= (also ohne die Optionen der FOR-Schleife in Anführungszeichen und die Maskierungen schon vor dem Gleichheitszeichen zu setzen), hat mich per Knockout lahmgelegt…
Das was mich am meisten sehr verwirrt sind die ausergewöhnlichen Tricks, die du hier rausgrabst… Du warst bestimmt an der Entwicklung von FOR.EXE beteiligt, stmimmt's ?
Weil eigentlich offiziell es so sein soll:
FOR /F ["Optionen"] %Variable IN (Dateiensatz) DO Befehl [Parameter]
FOR /F ["Optionen"] %Variable IN ("Zeichenfolge") DO Befehl [Parameter]
FOR /F ["Optionen"] %Variable IN (Befehl) DO Befehl [Parameter]

oder, unter Verwendung der Option "usebackq":

FOR /F ["Optionen"] %variable IN (`Befehl`) DO Befehl [Parameter]

Jetzt haben wir dich erwischt...

Danke sehr!

Gruß
evinben
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
Maskieren von Anführungszeichen in CMD (4)

Frage von Marc92 zum Thema Batch & Shell ...

Batch & Shell
gelöst Findstr - code für schwieriger Abfrage gesucht (9)

Frage von reissaus73 zum Thema Batch & Shell ...

Batch & Shell
gelöst Mal eine neue Art von Abfrage mit findstr (8)

Frage von DaTobsn zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows Server
Mailserver auf Windows Server 2012 (8)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...