Geleitet Variable In FINDSTR w/ Reguläre Ausdrücke und geschützte Doppelte Anführungszeichen
Ich versuche zu verstehen, eine batch-Datei, die gesendet wurde, zu mir, um zu arbeiten, um einen Fehler in einem Dritten Programm, wenn Sie das Problem beheben. Im Grunde sind Sie läuft " findstr regulären Ausdruck-Befehl, um festzustellen, ob oder nicht der string übereinstimmt. Wenn es funktioniert, dann werden die Sonderzeichen, die sollte nicht entfernt werden zurück in die Hand, bevor es übergeben wird, aus, um die ursprünglichen commandline-Programm.
Als am besten ich kann sagen, obwohl, was zur Verfügung gestellt wurde, funktioniert nicht oder ich verstehe es nicht. Ich bin einfügen den entsprechenden code-Abschnitt unten.
@echo off
setlocal
set username=%1
shift
echo %username% | findstr /r "^\"[0-9][0-9]*\"" >nul
if not errorlevel 1 (set username=";%username:~0,9%=%username:~10,4%?")
echo %username%
Die drei Stücke, die ich wirklich haben Fragen über sind wie folgt:
- Ich glaube, die unescaped interpretation der regular express oben ist
^"[0-9][0-9]*"
die ich denke, bedeutet, dass der string muss beginnen mit einer numerischen Zeichen und dann muss aus null oder mehr weitere numerische nur Zeichen, um für eine übereinstimmung zu finden. Gut, FINDSTR zu tun scheint etwas komisch mit den Anführungszeichen escaped und ich kann es nicht alles gefunden was ich ausprobiert habe. Wenn ich entfernen Sie die\"
um[0-9][0-9]*
dann kann ich es auf der Arbeit, aber es funktioniert nicht ordnungsgemäß zurückweisen von nicht-numerische Zeichen wie z.B. in einem input-string von123456789O1234
(es ist ein Buchstabe O statt einer null in diesem Beispiel-Zeichenfolge). - Was ist der Punkt, der
>nul
- Wäre es nicht besser, zu prüfen, eine errorlevel gleich 0 ist, anstelle von "not errorlevel 1", da könnte es möglicherweise ein Fehler der Ebene 2?
Sowieso, der folgende code funktioniert, aber es ist nicht so präzise wie ich es gerne hätte. Ich bin gerade auf der Suche, um zu verstehen, warum die Anführungszeichen bei den regex-string, der nicht funktioniert. Vielleicht ist dies eine Einschränkung von FINDSTR, aber ich kam nicht über etwas definitiv noch nicht.
@echo off
setlocal
set username=%1
shift
echo %username% | findstr /r "^[0-9][0-9]*" >nul
if not errorlevel 1 (set username=";%username:~0,9%=%username:~10,4%?")
echo %username%
Kann ich umgehen das problem durch wiederholen der Klasse 14 mal da, dass ist die Anzahl der Zeichen in meiner situation (mehr als 15 Klassen zum Absturz führen - ganz nach unten scrollen). Ich bin immer noch neugierig, wie das erreicht werden könnte, mehr, einfach, und natürlich die restlichen 2 Fragen.
BEARBEITEN /FUNKTIONIERENDE LÖSUNG
@echo off
setlocal enableDelayedExpansion
set username=%~1
shift
echo !username!|findstr /r /c:"^[0-9][0-9]*$" >nul
if not errorlevel 1 (set username=";!username:~0,9!=!username:~10,4!?")
echo !username!
HINWEISE:
- Als ich das erste lief es nach der änderung meiner bestehenden code mehr cloesly ähneln dbenham ist, enableDelayedExpansion gab einen Fehler, als habe die Anführungszeichen um die Einstellung der Benutzername (siehe unten). Ich kann nicht replizieren, was ich falsch gemacht habe, aber es ist alles jetzt funktioniert (dies ist im Fall kommt jemand über das gleiche Problem).
- Ich hatte versucht die
$
für die EOL-marker (das ist der Schlüssel zu zwingen, Sie mit der numerischen Inhalt nur), aber ich denke, dass die anderen Probleme wurden in der Weise erhalten, die mich denke, dass es nicht die Lösung. Auch, um sicherzustellen, die$
funktioniert, verpassen Sie nicht dieses Teil dbenham Antwort "...Sie müssen auch sicherstellen, dass es keine Leerzeichen zwischen Ihre echo-Wert und das pipe-symbol." - Kurz gesagt es ist ziemlich viel scheint, dass Sie versuchen zu setzen Anführungszeichen innerhalb eines regex für findstr ist falsch syntax/funktioniert nicht/etc... es sei denn, Sie sind eigentlich auf der Suche übereinstimmen " in der Zeichenfolge - /Dateien, die du Parsen durch. Sehen dbenham Antwort für Klarheit hier. Als er bemerkt, können Sie mit %~1 " Streifen der Zitate aus dem argument statt, indem es Ihre regex (und programmgesteuert fügen Sie Sie wieder in, wenn nötig).
Fehlermeldung
C:>sample.bat 123456789
'enableDelayedExpansion' is not recognized as an internal or external command,
operable program or batch file.
'"' is not recognized as an internal or external command,
operable program or batch file.
!username!
Referenz-Links:
- Undokumentierte features und Einschränkungen der Windows-Befehl "FINDSTR"
- Fall sesntive Anomalien mit findstr (nicht-Handhabung Fall korrekt in einigen Fällen)
- http://ss64.com/nt/findstr.html
- http://www.robvanderwoude.com/findstr.php
- http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/findstr.mspx
- Eigentlich, dass reguläre Ausdruck entspricht einer Zeichenfolge mit einem Anführungszeichen gefolgt von einem oder mehreren zahlen, gefolgt von einer schließenden Anführungszeichen. Es sei denn, ich bin Missverständnis etwas exortic über
findstr
(die ich noch nie benutzt habe), die ohne Anführungszeichen version sollte funktionieren. Sind Sie sicher, dass das ein Oh in der Ausgabe? Könnte es sein, eine null? (Tut es nicht für andere Buchstaben, die leichter zu Lesen? 🙂 - Wenn ich sagte, dass es fehlgeschlagen ist, ich meinte damit, dass er akzeptiert es als ein Spiel, wenn Sie es ablehnen sollten, da es nicht numerisch ist. Und ja, es ist auf jeden Fall ein O wie ich tippte, es selbst. In der Prüfung war ich einfach mit den Kleinbuchstaben "a". Also in diesem Fall, es sieht aus wie Sie falsch waren in der Zeichenkette zur Verfügung gestellt. Gibt es eine einfache Möglichkeit zur Definition eines Strings, lehnt alles, was nicht numerisch ist ohne Auflistung eine Klasse für jedes einzelne Zeichen?
- Nun, der reguläre Ausdruck zur Verfügung gestellt sollte alles ablehnen, was nicht zwischen 0 und 9. Ich kann mir nicht vorstellen, dass es nicht funktioniert, auch wenn
findstr
war sehr seltsam umgesetzt, oder sogar, wenn Ihre locale-Einstellungen wurden flippig. Vielleicht mit Charakter-Klassen helfen würde?findstr "[[:digit:]][[:digit:]]*"
Aber char-Klassen variieren sehr in form zwischen den verschiedenen regex-Programme, und möglicherweise nicht unterstützt. Hoffe, das hilft. - Übrigens, ich habe einige doc für
findstr
, und es entspricht meiner Erwartung. technet.microsoft.com/en-us/library/cc732459%28WS.10%29.aspx. Ich weiß nicht, was falsch sein könnte. Ich denke Schlimmste Fall ist, dass Typ [0123456789]. - Ja, ich sah das schon. Wenn Sie fügen Sie das zweite code-Abschnitt, der in eine batch-Datei, öffnen Sie eine Eingabeaufforderung, rufen Sie die batch-Datei mit einem parameter von 123456789 und 123a456789 beide verarbeitet statt des zweiten eine wird abgelehnt, weil ein Charakter, der nicht in der Klasse [0-9] (eine Ziffer Klasse nicht zu funktionieren scheint, aber das ist wahrscheinlich eine Einschränkung von FindStr).
Du musst angemeldet sein, um einen Kommentar abzugeben.
Beantworten Ihre Fragen in umgekehrter Reihenfolge:
3)
if not errorlevel 1
ist wahrscheinlich die gleiche wieif %errorlevel%==0
weil IF ERRORLEVEL if ERRORLEVEL 1 bedeutet " ist größer als oder gleich 1 ist. So setzen einen NICHT vor bedeutet wenn ERRORLEVEL ist weniger als 1. Ich glaube, FINDSTR, nie wieder einen negativen ERRORLEVEL, so dass die syntax OK sein sollte.2) Die
>nul
leitet die stdout-Ausgabe von FINDSTR, um das nul-Gerät, dh es deaktiviert die Ausgabe. Normalerweise jede passende Zeile gedruckt werden. Sie sind nur daran interessiert, den return-code - Sie nicht wollen, um die Ausgabe zu sehen.1) Die ursprünglichen regex passen jedes input-string beginnt mit einem Anführungszeichen, gefolgt von mindestens einer Ziffer, gefolgt von einem weiteren Anführungszeichen. Es ignoriert alle Zeichen, die vorkommen können, nach dem 2. Zitat.
Also die folgenden Zeichenfolgen (Zitate eingeschlossen) entsprechen:
Folgende Zeichenfolgen nicht übereinstimmen:
Den ursprünglichen code hat Probleme, wenn die Anzahl der Ziffern in die entsprechende Zeichenfolge ab einer gewissen Länge, da das Ende nennen wird abgestreift, wodurch das schließen ) zitiert zu werden und so den rest des scripts fehlschlägt.
Verstehe ich nicht die Anforderungen, so weiß ich nicht, wie man den code.
Es klingt wie Sie nicht wollen, zu entsprechen, Zeichenfolgen, die nicht Ziffern. Das bedeutet, dass Sie brauchen, um die end-of-line marker $ am Ende des regex. Aber Sie müssen auch sicherstellen, dass es keine Leerzeichen zwischen Ihre echo-Wert und das pipe-symbol.
Ich glaube, dass Sie wahrscheinlich nicht wollen Zitate in Ihrem Wert, (oder anderes sollten Sie programmgesteuert fügen Sie ganz am Ende). Sie können die Verwendung von %~1 Streifen umschließenden Anführungszeichen von der mitgelieferten argument.
Wenn Sie schauen, um zu überprüfen, ob argument 1 besteht aus nichts als Ziffern, dann können Sie verwenden:
Ich verzögert die expansion, weil Sie keine Kontrolle darüber haben, welche Zeichen sind in %1, und wenn es enthält spezielle Zeichen wie & oder | wird es Probleme verursachen, wenn Sie normale Erweiterung. Die syntax, die ich gegeben habe, ist nicht bullet proof, aber es behandelt die meisten "normalen" Situationen.
Ist es in Ihrem Fall nicht nötig, aber ich bevorzuge die Verwendung der option /c, nur im Fall, wenn Ihr Suchbegriff Leerzeichen enthält. Also, die oben geschrieben werden konnte, wie
Scheint es seltsam für mich, dass sowohl die ursprünglichen und geänderten code übergeben Sie einfach durch den Benutzernamen, wenn es nicht mit deinem regex. Vielleicht ist das deine Absicht, vielleicht auch nicht.