evinben
Goto Top

Anführungszeichen in der Suchzeichenkette des Befehls findstr maskieren

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:

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


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

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


Gruß
evinben

Content-Key: 196220

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

Printed on: April 25, 2024 at 20:04 o'clock

Member: Hitman4021
Hitman4021 Dec 24, 2012 at 11:58:31 (UTC)
Goto Top
Hallo,

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

Gruß
Member: rubberman
rubberman Dec 24, 2012 updated at 14:04:43 (UTC)
Goto Top
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.
setlocal EnableDelayedExpansion
echo("!Name-Suffix_of_Differential-VHD!"|findstr /rc:"..*[<>|\\/:?\"].*." >nul &&echo Mist.  
endlocal
Ich bin mir nicht ganz sicher ob das schon der Weisheit letzter Schluss ist. Teste mal ein bisschen.

Grüße
rubberman
Member: evinben
evinben Dec 24, 2012, updated at Dec 25, 2012 at 12:51:25 (UTC)
Goto Top
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...):

FINDSTR: >nul kann nicht ge”ffnet werden.
FINDSTR: &&echo kann nicht ge”ffnet werden.
FINDSTR: Mist. kann nicht ge”ffnet werden.

Der Code-Abschnitt sieht momentan so aus:
	:Bei unzulässigen Zeichen in der Bezeichnung (in dem Dateinamen) Warnung ausgeben und erneut zur Eingabe auffordern.
	setlocal EnableDelayedExpansion
	ECHO !Name-Suffix_of_Differential-VHD! | findstr /r "[<>|\\/:\"?]" && (  
		ECHO Ein Dateiname darf keines der folgenden Zeichen enthalten: \/:*?"<>|  
		goto :M5
		)
		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
Member: rubberman
rubberman Dec 24, 2012 at 19:03:39 (UTC)
Goto Top
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
Member: Friemler
Friemler Dec 25, 2012 updated at 01:13:24 (UTC)
Goto Top
Hallo evinben,

ich schlage eine Lösung mit Inline-VBScript vor:
@echo off & setlocal

:: Irgendwelche Befehle
:: die
:: den Dateinamen erzeugen

set "Name-Suffix_of_Differential-VHD=Irgendwas"  


set "VBScript=%TEMP%\CheckFilename.vbs"  

> "%VBScript%" echo.intResult = 0  
>>"%VBScript%" echo.  
>>"%VBScript%" echo.If WScript.Arguments.Count ^> 0 Then  
>>"%VBScript%" echo.  Set objRegExp     = new RegExp  
>>"%VBScript%" echo.  objRegExp.Pattern = "[\\/:\*?<>""]"  
>>"%VBScript%" echo.  If objRegExp.Test(WScript.Arguments(0)) Then intResult = 1  
>>"%VBScript%" echo.End If  
>>"%VBScript%" echo.  
>>"%VBScript%" echo.WScript.Quit intResult  

cscript /nologo "%VBScript%" "%Name-Suffix_of_Differential-VHD%"  

if ERRORLEVEL 1 (
  echo Ein Dateiname darf keines der folgenden Zeichen enthalten: \/:*?^<^>^|"  
) else (
  echo Alles klar
)

del "%VBScript%"  

Gruß
Friemler
Member: evinben
evinben Dec 25, 2012 updated at 13:43:37 (UTC)
Goto Top
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.
face-wink 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:
:M5
set Name-Suffix_of_Differential-VHD=
set /p Name-Suffix_of_Differential-VHD=etwas eingeben: 

setlocal EnableDelayedExpansion
echo "!Name-Suffix_of_Differential-VHD!"|findstr /r ".[\\/:*?\"^<^>^|]."  
if "%errorlevel%"=="0" (  
	echo Ein Dateiname darf keines der folgenden Zeichen enthalten: \/:*?^"^<^>:^|  
	goto :M5
	)
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
Member: evinben
evinben Dec 25, 2012 at 12:46:51 (UTC)
Goto Top
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
Member: pieh-ejdsch
pieh-ejdsch Dec 25, 2012, updated at Dec 28, 2012 at 23:02:01 (UTC)
Goto Top
moin,

einen hab ich noch - eine Alternative:
@echo off

:Eingabe
set /p "X=Dateiname Eingeben: " ||goto :Eingabe  
setlocal enabledelayedexpansion
for /f tokens^=2delims^=\/:*?^<^>^|^" %%i in (" !x! ") do endlocal&echo Falsche Eingabe&goto :Eingabe  
if !os! equ %OS% endlocal
echo rem Hier gehts weiter.

pause

Gruß Phil
Member: evinben
evinben Dec 26, 2012 at 12:59:46 (UTC)
Goto Top
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 face-wink?
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