File batch che copia le prime 2 righe di un file di testo in un altro file di testo


4

Ho un file di testo A.txt

Pinging [xx.xx.xx.xx] with 32 bytes of data:

Request timed out.

Ping statistics for xx.xx.xx.xx:
Packets: Sent = 1, Received = 0, Lost = 1 (100% loss)

Vorrei copiare le prime 2 righe di questo file in un altro file B.txt, ad es.

Pinging [xx.xx.xx.xx] with 32 bytes of data:
Request timed out.

So che posso usare FOR / F per scorrere le righe nel file. So come saltare le prime due righe, ma non solo leggerle. Ho anche provato a farlo usando FOR / F con un DO ECHO e il comando FIND relativo e anche un comando FINDSTR diretto (in entrambi i casi cercando "Pinging" e "Request") ma non riesco a far funzionare correttamente.


potresti usare gnuwin32 il comando head, digitare file.a | head -n 2 ma questo è veramente un comando * nix. ma è interessante sapere se può essere fatto in batch / windows.
barlop

Risposte:


6

Ho pubblicato l'intero codice qui sotto, ma la vera carne è qui:

:: set counter
set c=0
for /f "delims=|" %%i in (%1) do (
:: increment counter for each line read
  set /a c=!c!+1
  if !c! leq %3 echo %%i >> %2
)

Fondamentalmente si imposta la variabile contatore c su 0, quindi si incrementa per ogni riga letta dal file di testo. Testare il contatore rispetto alle linee massime e farlo eco al file di output se è minore o uguale.

Il "delims=|" il parametro nel ciclo for lo impedisce di spezzare la linea in token su caratteri spazio e quindi di emettere solo una linea parziale. L'insolito !c! variabile indica come fare riferimento a variabili che utilizzano l'espansione ritardata. Se hai appena usato %c%, il valore non cambierebbe mai nel for ciclo continuo.

Fornisci lo script con tre parametri: file di input, file di output e # di linee da produrre. % 1,% 2 e% 3 rappresentano ciascuno di questi parametri di input nello script.

 @echo off

REM ======================================================================
REM
REM NAME: 
REM
REM AUTHOR: Scott McKinney
REM DATE  : 
REM
REM PURPOSE: 
REM COMMENT: 
REM DEPENDENCIES:
REM
REM Revisions:
REM
REM ======================================================================

setlocal ENABLEEXTENSIONS
setlocal ENABLEDELAYEDEXPANSION

set a=%1
if "%1"=="" goto HELP
if "%a:~0,2%"=="/?" goto HELP
if "%a:~0,2%"=="-?" goto HELP
if "%a:~0,2%"=="/h" goto HELP
if "%a:~0,2%"=="/H" goto HELP
if "%a:~0,2%"=="-h" goto HELP
if "%a:~0,2%"=="-H" goto HELP
if "%a:~0,3%"=="--h" goto HELP
if "%a:~0,3%"=="--H" goto HELP

:: set counter
set c=0
for /f "delims=|" %%i in (%1) do (
:: increment counter for each line read
  set /a c=!c!+1
  if !c! leq %3 echo %%i >> %2
)
goto END

:HELP
echo.
echo Usage: %0 ^<input file^> ^<output file^> ^<n lines^>
echo.
echo. Outputs the first ^<n^> lines from ^<input file^> to ^<output file^>.
echo.
:END

Solo una nota per riferimenti futuri, ma se abiliti le estensioni di comando ( setlocal enableextensions ) Puoi usare if /i fare una corrispondenza insensibile alle maiuscole e minuscole. Questo taglierà alcune linee di codice per te e renderà le cose più facili da mantenere.
Bacon Bits

@Bacon Bits aggiungerei a quello che hai detto, le estensioni cmd sono abilitate di default. btw l'espansione ritardata non è ..
barlop

+1 Ho testato questa risposta e sembra funzionare e vedo la logica di ciò
barlop

Grazie, Scott. Posso chiederti cos'è "Espansione ritardata"?
SC.

1
Normalmente, quando una variabile di ambiente viene utilizzata in un file batch, il valore viene espanso una volta prima dell'esecuzione. Successivamente non viene controllato per vedere se è cambiato ogni volta che viene chiamato. In particolare con i loop è possibile incorrere in problemi con variabili che non cambiano. Espansione ritardata ( setlocal enabledelayedexpansion ) consente di dire al sistema di attendere per espandere la variabile. Specificare una variabile ritardata con ! invece di %, quindi diresti !variable! invece di %variable%. Vedere setlocal /? e set /?. Sono tecnicamente più lenti da elaborare, ma non l'ho mai notato.
Bacon Bits
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.