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:

  1. 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 von 123456789O1234 (es ist ein Buchstabe O statt einer null in diesem Beispiel-Zeichenfolge).
  2. Was ist der Punkt, der >nul
  3. 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:

  • 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).
InformationsquelleAutor Saint Ronin | 2012-05-17
Schreibe einen Kommentar