förord
mycket av informationen i detta svar har samlats in baserat på experiment som körs på en Vista-maskin. Om inte annat uttryckligen anges har jag inte bekräftat om informationen gäller för andra Windows-versioner.

findstr-utgång
dokumentationen stör aldrig att förklara resultatet av FINDSTR. Det hänvisar till det faktum att matchande linjer skrivs ut, men inget mer.,

formatet för matchande linjeutmatning är som följer:

filnamn: lineNumber:lineOffset: text

där

filnamn: = namnet på filen som innehåller matchande linje. Filnamnet skrivs inte ut om begäran var explicit för en enda fil, eller om du söker piped input eller omdirigeras input. När det skrivs ut kommer filnamnet alltid att innehålla all sökvägsinformation som tillhandahålls. Ytterligare sökvägsinformation läggs till Om alternativet/S används. Den tryckta sökvägen är alltid i förhållande till den angivna sökvägen, eller i förhållande till den aktuella katalogen om ingen anges.,

Obs! filnamnsprefixet kan undvikas vid sökning av flera filer genom att använda jokertecken som inte är standard (och dåligt dokumenterade) < och >. De exakta reglerna för hur dessa jokertecken fungerar finns här. Slutligen kan du titta på det här exemplet på hur de icke-standardiserade jokertecknen fungerar med FINDSTR.

lineNumber: = linjenumret för den matchande raden som representeras som ett decimalvärde med 1 som representerar den första raden i ingången. Endast tryckt om/N – alternativet anges.,

lineOffset: = decimalbyte offset för början av matchande linje, med 0 representerar 1: A tecknet i 1: a raden. Endast tryckt om alternativet/O har angetts. Detta är inte förskjutningen av matchen inom linjen. Det är antalet byte från början av filen till början av raden.

text=binär representation av matchande linje, inklusive alla <CR> och/eller <lf>., Ingenting lämnas ut ur binär utgång, så att detta exempel som matchar alla linjer kommer att producera en exakt binär kopia av den ursprungliga filen.

FINDSTR "^" FILE >FILE_COPY

alternativet / A anger filnamnets färg:, lineNumber: och lineOffset: endast utmatning. Texten på matchande linje matas alltid ut med den aktuella konsolfärgen. Alternativet / A har endast effekt när utmatningen visas direkt till konsolen. Alternativet / A har ingen effekt om utmatningen omdirigeras till en fil eller piped., Se redigeringen 2018-08-18 i Aacinis svar för en beskrivning av buggybeteendet när utmatningen omdirigeras till CON.

de flesta kontrolltecken och många utökade ASCII-tecken visas som punkter på XP
FINDSTR på XP visar de flesta icke-utskrivbara kontrolltecken från matchande linjer som punkter (perioder) på skärmen. Följande kontrolltecken är undantag; de visar som sig själva: 0x09 Tab, 0x0A LineFeed, 0x0b Vertical Tab, 0x0C Form Feed, 0x0D Carriage Return.

XP FINDSTR konverterar även ett antal utökade ASCII-tecken till punkter., De utökade ASCII-tecknen som visas som punkter på XP är desamma som de som omvandlas när de levereras på kommandoraden. Se avsnittet ”Teckengränser för kommandoradsparametrar-utökad ASCII-transformation”, senare i det här inlägget

kontrolltecken och utökade ASCII konverteras inte till punkter på XP om utmatningen är rörd, omdirigerad till en fil eller inom en in () – klausul.

Vista och Windows 7 visar alltid alla tecken som sig själva, aldrig som prickar.,

Returkoder (ERRORLEVEL)

  • 0 (framgång)
    • Match hittades i minst en rad med minst en fil.
  • 1 (fel)
    • ingen match hittades i någon rad i någon fil.,iv id=”b01f5d4aef”>, /D:, eller /G:
    • fil som anges av /F:file eller /G:file hittades inte
  • 255 (fel)
    • för många reguljära uttryck tecken klass termer
      se regex tecken klass term gräns och bugg i del 2 av svar

källa till data för att söka (uppdaterad baserat på tester med Windows 7)
findstr kan söka data från endast en av följande källor:

  • filnamn anges som argument och/eller använda /F:file alternativet.,

  • stdin via omdirigeringfindstr "searchString" <file

  • dataström från ett rörtype file | findstr "searchString"

argument / alternativ har företräde framför omdirigering, vilket har företräde framför piped data.

Filnamnsargument och/F:file kan kombineras. Argument för flera filnamn kan användas. Om flera /F:file – alternativ anges, används endast den sista. Wild-kort är tillåtna i filnamn argument, men inte i filen pekas av /F:file.,

Söksträngskälla (uppdaterad baserat på tester med Windows 7)
alternativen/G:file och/C:string kan kombineras. Flera alternativ för /C:string kan anges. Om flera/G:file – alternativ anges används endast den sista. Om /G:file eller /C:string används, antas alla icke-alternativargument vara filer att söka efter., Om varken /G:file eller /C:string används, behandlas det första icke-alternativargumentet som en avgränsad lista över söktermer.

filnamn får inte citeras i filen när du använder alternativet/F:FILE.
filnamn kan innehålla mellanslag och andra specialtecken. De flesta kommandon kräver att sådana filnamn Citeras. Men alternativet FINDSTR/F:files.txt kräver att filnamn i filer.txt får inte Citeras. Filen kommer inte att hittas om namnet Citeras.

bugg – kort 8.,3 filnamn kan bryta/D och/S alternativ
som med alla Windows-kommandon försöker FINDSTR matcha både det långa namnet och det korta 8.3-namnet när man letar efter filer att söka. Antag att den aktuella mappen innehåller följande icke-tomma filer:

b1.txtb.txt2c.txt

följande kommando kommer att hitta alla 3 filer:

findstr /m "^" *.txt

b.txt2 matchar eftersom motsvarande kortnamn B9F64~1.TXT matchar., Detta överensstämmer med beteendet hos alla andra Windows-kommandon.

men en bugg med alternativen /D och /S gör att följande kommandon bara kan hittas b1.txt

findstr /m /d:. "^" *.txtfindstr /m /s "^" *.txt

felet förhindrar att b.txt2 hittas, liksom alla andra kommandon.filnamn som sorterar efter b.txt2 I samma katalog. Ytterligare filer som sorteras tidigare, som a.txt, hittas., Ytterligare filer som sorteras senare, som d.txt, saknas när felet har utlösts.

varje katalog som söks behandlas oberoende av varandra. Till exempel skulle alternativet/S framgångsrikt börja söka i en underordnad mapp efter att ha misslyckats med att hitta filer i föräldern, men när felet orsakar att ett kort filnamn saknas i barnet, skulle alla efterföljande filer i den underordnade mappen också missas.

kommandona fungerar felfritt om samma filnamn skapas på en maskin som har NTFS 8.3 namngenerering inaktiverad., Naturligtvis skulle b.txt2inte hittas, menc.txt skulle hittas korrekt.

inte alla korta namn utlöser felet. Alla instanser av buggat beteende jag har sett involverar ett tillägg som är längre än 3 tecken med ett kort 8.3-namn som börjar samma som ett normalt namn som inte kräver ett 8.3-namn.

felet har bekräftats på XP, Vista och Windows 7.,

icke-utskrivbara tecken och alternativet /P
alternativet /Pgör att FINDSTR hoppar över alla filer som innehåller någon av följande decimala byte-koder:
0-7, 14-25, 27-31.

sätt ett annat sätt, alternativet/P hoppar bara över filer som innehåller icke-utskrivbara kontrolltecken. Kontrolltecken är koder mindre än eller lika med 31 (0x1F)., FINDSTR behandlar följande kontrolltecken som utskrivbara:

 8 0x08 backspace 9 0x09 horizontal tab10 0x0A line feed11 0x0B vertical tab12 0x0C form feed13 0x0D carriage return26 0x1A substitute (end of text)

alla andra kontrolltecken behandlas som icke utskrivbara, vars närvaro gör att alternativet/P hoppar över filen.

Piped och Omdirigerad inmatning kan ha<CR><LF> bifogat
om inmatningen är piped in och det sista tecknet i strömmen inte är<LF>, kommer FINDSTR automatiskt att lägga till<CR><LF> till ingången. Detta har bekräftats på XP, Vista och Windows 7., (Jag brukade tro att Windows-röret var ansvarigt för att ändra inmatningen, men jag har sedan upptäckt att FINDSTR faktiskt gör modifieringen.)

detsamma gäller för Omdirigerad inmatning på Vista. Om det sista tecknet för en fil som används som Omdirigerad ingång inte är <LF>, kommer FINDSTR automatiskt att lägga till <CR><LF> till ingången. XP och Windows 7 ändrar dock inte Omdirigerad ingång.

FINDSTR hänger på XP och Windows 7 om Omdirigerad ingång inte slutar med <LF>
Detta är en otäck” funktion ” på XP och Windows 7., Om det sista tecknet för en fil som används som Omdirigerad inmatning inte slutar med <LF>, kommer FINDSTR att hänga på obestämd tid när den når slutet av den omdirigerade filen.

den sista raden av Piped data kan ignoreras om den består av ett enda tecken
om inmatningen är piped in och den sista raden består av ett enda tecken som inte följs av<LF>, ignorerar FINDSTR helt den sista raden.,

exempel – det första kommandot med ett enda tecken och inget <LF> matchar inte, men det andra kommandot med 2 tecken fungerar bra, liksom det tredje kommandot som har ett tecken med att avsluta newline.

> set /p "=x" <nul | findstr "^"> set /p "=xx" <nul | findstr "^"xx> echo x| findstr "^"x

rapporteras av dostips user Sponge Belly på nya findstr bugg. Bekräftat på XP, Windows 7 och Windows 8. Jag har inte hört talas om Vista än. (Jag har inte längre Vista att testa).

option syntax
optionsbrev är inte skiftlägeskänsliga, så/i och/I är likvärdiga.,

alternativ kan prefixeras med antingen/ eller-alternativ kan sammanfogas efter en enda/ eller-. Den sammanlänkade alternativlistan kan dock innehålla högst ett multikaraktärsalternativ som OFF eller F:, och alternativet med flera tecken måste vara det sista alternativet i listan.,

Följande är alla likvärdiga sätt att uttrycka ett fall okänslig regex sökning efter en rad som innehåller både ”hej” och ”adjö” i valfri ordning

  • /i /r /c:"hello.*goodbye" /c:"goodbye.*hello"

  • -i -r -c:"hello.*goodbye" /c:"goodbye.*hello"

  • /irc:"hello.*goodbye" /c:"goodbye.*hello"

om en söksträng börjar med en / eller - bokstavligt måste alternativet /C eller /G användas. Tack vare Stephan för att rapportera detta i en kommentar (sedan borttagen).,

söksträngens längdgränser
i Vista är den maximala tillåtna längden för en enda söksträng 511 byte. Om någon söksträng överstiger 511 är resultatet ettFINDSTR: Search string too long. fel med ERRORLEVEL 2.

När du gör en reguljär uttryckssökning är den maximala söksträngens längd 254. Ett reguljärt uttryck med längd mellan 255 och 511 resulterar i ett FINDSTR: Out of memory – fel med ERRORLEVEL 2. Ett reguljärt uttryckslängd >511 resulterar i feletFINDSTR: Search string too long..,

i Windows XP är söksträngens längd tydligen kortare. Findstr error: ”söksträngen för lång”: hur man extraherar och matchar substring i ”för” loop?XP-gränsen är 127 byte för både bokstavliga och regex-sökningar.

Linjelängdsgränser
filer som anges som kommandoradsargument eller via filalternativet / F:har ingen känd linjelängdsgräns. Sökningar kördes framgångsrikt mot en 128 MB fil som inte innehöll en enda <LF>.

Piped data och Omdirigerad inmatning är begränsad till 8191 byte per rad., Denna gräns är en” funktion ” av FINDSTR. Det är inte inneboende för rör eller omdirigering. FINDSTR använder Omdirigerad stdin eller piped input kommer aldrig att matcha någon linje som är > =8k byte. Rader>= 8K generera ett felmeddelande till stderr, men ERRORLEVEL är fortfarande 0 om söksträngen finns i minst en rad med minst en fil.

standardtyp för sökning: bokstavligt vs Reguljärt uttryck
/C:"string" – Standardvärdet är /L bokstavligt. Uttryckligen kombinera / l alternativet med / C:” string ” fungerar verkligen men är överflödig.,

"string argument" – standardinställningen beror på innehållet i den allra första söksträngen. (Kom ihåg att <space> används för att avgränsa söksträngar.) Om den första söksträngen är ett giltigt Reguljärt uttryck som innehåller minst ett un-escaped meta-tecken behandlas alla söksträngar som reguljära uttryck. Annars behandlas alla söksträngar som Literaler., Till exempel kommer"51.4 200" att behandlas som två reguljära uttryck eftersom den första strängen innehåller en un-escaped dot, medan"200 51.4" kommer att behandlas som två Literaler eftersom den första strängen inte innehåller några metatecken.

/G:file – standard beror på innehållet i den första icke-tomma raden i filen. Om den första söksträngen är ett giltigt Reguljärt uttryck som innehåller minst ett un-escaped meta-tecken behandlas alla söksträngar som reguljära uttryck., Annars behandlas alla söksträngar som Literaler.

rekommendation-ange alltid uttryckligen/L bokstavligt alternativ eller/R Reguljärt uttryck när du använder"string argument" eller/G:file.

BUG – ange flera bokstavliga söksträngar kan ge opålitliga resultat

följande enkla FINDSTR exempel misslyckas med att hitta en match, även om det borde.

echo ffffaaa|findstr /l "ffffaaa faffaffddd"

detta fel har bekräftats på Windows Server 2003, Windows XP, Vista och Windows 7.,

baserat på experiment kan FINDSTR misslyckas om alla följande villkor är uppfyllda:

  • sökningen använder flera bokstavliga söksträngar
  • söksträngarna är av olika längder
  • en kort söksträng har en viss överlappning med en längre söksträng
  • sökningen är skiftlägeskänslig (ingen /I alternativ)

i varje sökning är misslyckande jag har sett, det är alltid en av de kortare söksträngarna som misslyckas.

För mer information se varför hittar inte detta FINDSTR-exempel med flera bokstavliga söksträngar en matchning?,

citat och backslahses inom kommandoradsargument
Note – User MC nds kommentarer återspeglar de faktiska fasansfullt komplicerade reglerna för det här avsnittet. Det finns tre olika analysfaser:

  • första cmd.,exe kan kräva att vissa citat flydde som ^” (egentligen ingenting att göra med FINDSTR)
  • nästa FINDSTR använder pre 2008 MS c/c++ argument parser, som har särskilda regler för ” och \
  • efter argumentet parser är klar, FINDSTR dessutom behandlar \ följt av en Alfa-numerisk karaktär som bokstavlig, men \ följt av icke-Alfa-numerisk karaktär som en flykt karaktär

resten av detta markerade avsnitt är inte 100% korrekt. Det kan fungera som en guide för många situationer, men ovanstående regler krävs för total förståelse.,

Fly citat i kommandoradsöksträngar
citat i kommandoradsöksträngar måste rymmas med backslash som\". Detta gäller för både bokstavliga och regex-söksträngar. Denna information har bekräftats på XP, Vista och Windows 7.

Obs! citatet kan också behöva rymmas för CMD.EXE parser, men detta har ingenting att göra med FINDSTR., Till exempel, för att söka efter asingle-citat som du kan använda:

FINDSTR \^" file && echo found || echo not found

flyr Backslash inom kommandoraden bokstavliga söksträngar
Backslash i en bokstavlig söksträng kan normalt representeras som\ eller som \\. De är vanligtvis likvärdiga. (Det kan finnas ovanligtfall i Vista där backslash måste alltid fly, men jag nolonger har en Vista-maskin att testa).

men det finns några speciella fall:

När du söker efter efterföljande backslashes måste alla utom de sista varabildade., Den sista backslash kan eventuellt rymmas.

  • \\ kan kodas som \\\ eller \\\\
  • \\\ kan kodas som \\\\\ eller \\\\\\

söka efter en eller flera bakslag innan ett citat är bisarrt. Logicwould föreslå att citatet måste undkomma, och var och en av de leadingbackslashes skulle behöva fly, men det fungerar inte!, Istället måste var och en av de ledande backslashesna vara dubbelrymd och quoteis flydde normalt:

  • \" måste kodas som \\\\\"
  • \\" måste kodas som \\\\\\\\\"

som tidigare nämnts kan en eller flera förrymda citat också kräva att fly med ^ för CMD-tolken

informationen i det här avsnittet har bekräftats på XP och Windows 7.,

Fly Backslash inom kommandoraden regex search strings

  • Vista only: Backslash i en regex måste vara antingen dubbel flydde som \\\\, eller annars enda flydde inom en teckenklass som

  • XP och Windows 7: Backslash i en regex kan alltid representeras som . Det kan normalt representeras som \\. Men det här fungerar aldrig om backslashen föregår ett rymt citat.,aped citat måste antingen bedouble rymt, eller annars kodas som

    • \" kan kodas som \\\\\" eller \"
    • \\" kan kodas som \\\\\\\\\" eller \" eller \\\"

Fly citat och backslash inom /g:file literal search strings
fristående citat och backslashes inom en bokstavlig söksträngsfil som specificeras av /G:filen behöver inte rymmas, men de kan vara.,

" och\" är likvärdiga.

\ och\\ är likvärdiga.

om avsikten är att hitta \\, måste åtminstone den ledande backslashen rymmas. Både\\\ och\\\\ fungerar.

om avsikten är att hitta ” måste åtminstone den ledande backslashen undkomma. Både\\" och\\\" fungerar.,

Fly citat och Backslash inom / g:FILE regex search strings
det här är det enda fallet där escape-sekvenserna fungerar som förväntat baserat på dokumentationen. Citat är inte en regex metakaraktär, så det behöver inte undgå (men kan vara). Backslash är en regex metakaraktär, så det måste rymmas.

Teckengränser för kommandoradsparametrar – utökad ASCII-omvandling
null-tecknet (0x00) kan inte visas i någon sträng på kommandoraden. Alla andra enstaka byte-tecken kan visas i strängen (0x01 – 0xFF)., FINDSTR konverterar dock många utökade ASCII-tecken inom kommandoradsparametrar till andra tecken. Detta har en stor inverkan på två sätt:

  1. många utökade ASCII-tecken matchar inte sig själva om de används som en söksträng på kommandoraden. Denna begränsning är densamma för bokstavliga och regex-sökningar. Om en söksträng måste innehålla utökad ASCII ska alternativet /G:FILE användas istället.

  2. FINDSTR kan misslyckas med att hitta en fil om namnet innehåller utökade ASCII-tecken och filnamnet anges på kommandoraden., Om en fil som ska sökas innehåller utökad ASCII i namnet ska alternativet /F:FILE användas istället.

här är en komplett lista över utökade ASCII-teckentransformationer som FINDSTR utför på kommandoradssträngar. Varje tecken representeras som decimalvärdet för byte-kod. Den första koden representerar tecknet som anges på kommandoraden, och den andra koden representerar tecknet det omvandlas till. OBS ! Denna lista sammanställdes på en amerikansk maskin. Jag vet inte vilken inverkan andra språk kan ha på denna lista.,

158 treated as 080 199 treated as 221 226 treated as 071169 treated as 170 200 treated as 043 227 treated as 112176 treated as 221 201 treated as 043 228 treated as 083177 treated as 221 202 treated as 045 229 treated as 115178 treated as 221 203 treated as 045 231 treated as 116179 treated as 221 204 treated as 221 232 treated as 070180 treated as 221 205 treated as 045 233 treated as 084181 treated as 221 206 treated as 043 234 treated as 079182 treated as 221 207 treated as 045 235 treated as 100183 treated as 043 208 treated as 045 236 treated as 056184 treated as 043 209 treated as 045 237 treated as 102185 treated as 221 210 treated as 045 238 treated as 101186 treated as 221 211 treated as 043 239 treated as 110187 treated as 043 212 treated as 043 240 treated as 061188 treated as 043 213 treated as 043 242 treated as 061189 treated as 043 214 treated as 043 243 treated as 061190 treated as 043 215 treated as 043 244 treated as 040191 treated as 043 216 treated as 043 245 treated as 041192 treated as 043 217 treated as 043 247 treated as 126193 treated as 045 218 treated as 043 249 treated as 250194 treated as 045 219 treated as 221 251 treated as 118195 treated as 043 220 treated as 095 252 treated as 110196 treated as 045 222 treated as 221 254 treated as 221197 treated as 043 223 treated as 095198 treated as 221 224 treated as 097

alla tecken>0 inte i listan ovan behandlas som sig själv, inklusive<CR> och<LF>. Det enklaste sättet att inkludera udda tecken som <CR>och<LF> är att få dem till en miljövariabel och använda fördröjd expansion inom kommandoradsargumentet.,

Teckengränser för strängar som finns i filer som anges av /G:FILE and / F: FILE options
nul-tecknet (0x00) kan visas i filen, men det fungerar som C string terminator. Alla tecken efter ett nul-tecken behandlas som en annan sträng som om de vore på en annan linje.

<CR> och<LF> tecken behandlas som linjeterminatorer som avslutar en sträng och ingår inte i strängen.

alla andra enstaka byte-tecken ingår perfekt i en sträng.,

sökning av Unicode-filer
FINDSTR kan inte korrekt söka i de flesta Unicode (UTF-16, UTF-16LE, UTF-16BE, UTF-32) eftersom det inte går att söka efter nul bytes och Unicode innehåller vanligtvis många nul bytes.

kommandot TYPE konverterar UTF-16LE med BOM till en enda byte-teckenuppsättning, så ett kommando som följande fungerar med UTF-16LE med BOM.

type unicode.txt|findstr "search"

Observera att Unicode-Kodpunkter som inte stöds av din aktiva kodsida konverteras till? tecken.,

det är möjligt att söka UTF-8 så länge söksträngen bara innehåller ASCII. Konsolutgången för alla UTF-8-tecken med flera byte kommer dock inte att vara korrekt. Men om du omdirigerar utmatningen till en fil, blir resultatet korrekt kodat UTF-8. Observera att om UTF-8-filen innehåller en BOM, kommer BOM att betraktas som en del av den första raden, vilket kan kasta bort en sökning som matchar början på en rad.

det är möjligt att söka flera byte UTF-8 tecken om du lägger din söksträng i en UTF-8-kodad sökfil (utan BOM) och använder alternativet / G.,

slutet av raden
FINDSTR bryter linjer direkt efter varje<LF>. Närvaron eller frånvaron av <CR> påverkar inte radbrytningar.

sökning över radbrytningar
som förväntat matchar. regex metacharacter inte<CR> eller<lf>. Men det är möjligt att söka över en radbrytning med hjälp av en kommandoradsöksträng., Både<CR> och<LF> tecken måste matchas explicit. Om en multi-line match hittas skrivs endast 1: a raden av matchen ut. FINDSTR fördubblar sedan tillbaka till 2: a raden i källan och börjar sökningen igen – typ av en ”look ahead” – typfunktion.

anta TEXT.,TXT har dessa innehåll (kan vara Unix eller Windows stil)

AAABAA

då detta skript

ger dessa resultat

1:A2:A5:A

söka över radbrytningar med hjälp av filalternativet /G:är oprecise eftersom det enda sättet att matcha <CR> eller <lf> är via ett regex character class range-uttryck som smörgåsar EOL-tecknen.,

  • matches <LF>, but it also matches <TAB> and <0x0B>

  • matches <CR>, but it also matches <0x0C> and !

Note – the above are symbolic representations of the regex byte stream since I can’t graphically represent the characters.,

svaret fortsatte i del 2 nedan…

Articles

Lämna ett svar

Din e-postadress kommer inte publiceras. Obligatoriska fält är märkta *