2016-12-06 2 views
2

Nach dem Trawling durch S.O. Ich habe es geschafft, meine Funktion so zusammenzusetzen, dass sie funktioniert, aber ich verstehe nichts davon. Ich versuche grundsätzlich sicherzustellen, dass eine Datei, die ich verwenden möchte, keine doppelten Anführungszeichen enthält. Ich habe findstr mit der Option/m verwendet, die den Dateinamen zurückgibt.Warum muss ich in einer for-Schleife in einer Batchdatei meine bereits gemerdete Suchzeichenfolge ausschließen?

Wenn ich den Befehl von der cmd Zeile funktioniert es mit diesem:

findstr /V /L /m "\"" filename.txt 

Wenn Dateiname hat keine doppelte Anführungszeichen es den Dateinamen zurückgibt, wenn es doppelte Anführungszeichen hat es leer/null/was auch immer zurückgibt. Genau das, was ich will.

Also wollte ich dieses Ergebnis in einer Variablen erfassen, mit einer Lösung auf dieser Website. Ich habe entdeckt, das funktioniert:

setlocal enabledelayedexpansion 
set test= 
for /F %%a in ('findstr /V /L /m ^"^\^"^" filename.txt') do (@set test=!test! %%a) 

echo %test% 

Also meine Frage: Mein braucht Suchtext entkommen sein, so geht aus:

"\"" 

und wird:

^"^\^"^" 

aber ich don‘ Ich verstehe, warum ich das tun muss. Kann jemand das erklären?

+1

Technisch muss nur das erste Zitat maskiert werden, also können Sie einfach sagen '^" \ "" ' – SomethingDark

+2

Das hat für mich gut funktioniert:' für/F %% G in ('findstr/V/M^" "" * .txt ') echo %% G' – Squashman

+0

ahhhh richtig ok, nur dieses erste Zitat .. danke. , die es zumindest leichter zu lesen macht. –

Antwort

1

Um Ihre Frage zu beantworten, ist der Grund, warum Ihr Suchstring escaped sein muss (^ escaped), ... keiner. In Ihrem Fall muss die Suchzeichenfolge nicht maskiert werden.

@echo off 
    setlocal enableextensions disabledelayedexpansion 

    for /f "delims=" %%a in (' 
     findstr /l /m /v "\"" *.txt 
    ') do echo %%a 

Sie müssen die \" Flucht, weil das findstr Argument (mehr here), aber die ^" scaping ist nicht erforderlich Handhabung.

Aber es gibt einige Fälle, in denen die ^ Zitat Scaping benötigt wird. Der Grund für das Entweichen in diesen Fällen ist, dass der Befehl innerhalb der for /f in einer separaten cmd Instanz ausgeführt wird. Dies begann Beispiel könnte (oder auch nicht) seinen eigenen Satz von Anführungszeichen

cmd /c " ...... " 

und die Zitate in Ihrem Befehl umfasst im cmd Parsing des Befehls stören könnte auszuführen.

Aber wenn Sie die Anführungszeichen entkommen (cmd entkommen, das heißt ^"), werden sie nicht als das Schließen/Öffnen Anführungszeichen analysiert werden, sondern als eine wörtliche ohne eine besondere Bedeutung für den cmd Parser, so könnten sie später hadled werden.

+0

nun, das ist peinlich :) Im bestimmten ID versucht, aber offensichtlich nicht danke, dass du es aufgezeigt hast. –

Verwandte Themen