2008-09-24 40 views

Respuesta

43

Aquí hay un archivo por lotes de propósito general para imprimir las líneas superiores n de un archivo como la utilidad GNU head, en lugar de solo una línea.

@echo off 

if [%1] == [] goto usage 
if [%2] == [] goto usage 

call :print_head %1 %2 
goto :eof 

REM 
REM print_head 
REM Prints the first non-blank %1 lines in the file %2. 
REM 
:print_head 
setlocal EnableDelayedExpansion 
set /a counter=0 

for /f ^"usebackq^ eol^=^ 

^ delims^=^" %%a in (%2) do (
     if "!counter!"=="%1" goto :eof 
     echo %%a 
     set /a counter+=1 
) 

goto :eof 

:usage 
echo Usage: head.bat COUNT FILENAME 

Por ejemplo:

Z:\>head 1 "test file.c" 
; this is line 1 

Z:\>head 3 "test file.c" 
; this is line 1 
    this is line 2 
line 3 right here 

actualmente no cuentan las líneas en blanco. También está sujeto a la restricción de longitud de línea de archivo por lotes de 8 KB.

+8

FYI: "GOTO: EOF" Esa es una etiqueta especial que saldrá de la secuencia de comandos sin tener que definir una etiqueta especial ": exit". También es útil al definir subrutinas en el lote (¿qué es lo que dices? ¿Subrutinas?) – Steven

+3

Esto parece explotar en mis varios archivos de texto GB ... En un archivo me dio un error de "Memoria insuficiente" al intentar devuelve 10 líneas, en el otro archivo simplemente devolvió una sola línea en blanco al pedirle que devuelva 10 líneas. ¿Alguna idea de por qué sucede esto? – Dan

+0

Mismo problema aquí .. –

9

Es posible probar esto:

@echo off 

for /f %%a in (sample.txt) do (
    echo %%a 
    exit /b 
) 

edición O, supongamos que tiene cuatro columnas de datos y desea de la 5ª fila hasta la parte inferior, intente esto:

@echo off 

for /f "skip=4 tokens=1-4" %%a in (junkl.txt) do (
    echo %%a %%b %%c %%d 
) 
+0

Esto me dio la pista que necesitaba pero no estaba del todo bien. No estoy seguro de cuál fue el procedimiento correcto, pero incorporé esta solución en la solución final. vea http://stackoverflow.com/questions/130116#130209 –

+2

El problema de esta solución es que delimita en espacio en lugar de línea nueva, y no puede tener un nombre de archivo con espacios. Puede solucionar estos problemas con las opciones delims y usebackq en el ciclo for. – indiv

3

Basándose en las respuestas de otras personas. Ahora que le permite especificar el archivo que desea leer y la variable que desea el resultado pone en:

@echo off 
for /f "delims=" %%x in (%2) do (
set %1=%%x 
exit /b 
) 

Esto significa que puede utilizar lo anterior como esto (suponiendo que llamaste getline.bat)

c:\> dir > test-file 
c:\> getline variable test-file 
c:\> set variable 
variable= Volume in drive C has no label. 
3

Un forro, útil para redirigir la salida estándar con ">":

@for /f %%i in ('type yourfile.txt') do @echo %%i & exit 
+1

Esto no parece funcionar en Win 8.1: -/ –

0

Nota, los enfoques de archivos por lotes se limitará a la línea de límite para el procesador de comandos DOS - ver What is the command line length limit?.

De modo que si intenta procesar un archivo que tiene alguna línea más que caracteres, la secuencia de comandos saltará simplemente porque no se puede retener el valor.

15

Uh ustedes ...

C:\>findstr /n . c:\boot.ini | findstr ^1: 

1:[boot loader] 

C:\>findstr /n . c:\boot.ini | findstr ^3: 

3:default=multi(0)disk(0)rdisk(0)partition(1)\WINNT 

C:\> 
+2

Si el archivo tiene más de 11 líneas imprimirá más que el primero, como: 1 :, 11 :, 21 :, etc ... –

+1

Good catch Cesar ! Siempre trato de evitar las comillas porque me molestan, pero en este caso fue una mala idea. Para solucionarlo, cambie a "findstr"^1: "' y gane la calidez y la protección de comillas dobles. O bien, si desprecias las comillas como yo y quieres vivir peligrosamente, usa 'findstr/b 1:' –

+4

si lo quieres sin comillas y sin la opción/b, simplemente escapa del símbolo de intercalación: 'findstr ^^ 1'. – dbenham

174

eh? imo esto es mucho más simple

set /p texte=< file.txt 
    echo %texte% 
+7

+1, esto es lo mejor cuando funciona :-) Tiene los siguientes límites 1) Longitud máxima de línea de 1021 bytes, sin incluir EOL. 2) El archivo debe usar EOL de estilo de Windows de CarriageReturn LineFeed.3) Los caracteres de control de rastreo se eliminarán de la línea – dbenham

+2

Además, texte debe definirse explícitamente antes de leer el archivo, en caso de que la 1ra línea esté en blanco. – dbenham

+0

No funciona .... platform win 7 – Jai

1

El problema con las soluciones EXIT/B, cuando más realista dentro de un archivo por lotes que sólo una parte de la misma es la siguiente. No hay procesamiento posterior dentro de dicho archivo por lotes después de EXIT/B. Por lo general, hay mucho más en lotes que solo una tarea limitada.

Para contrarrestar ese problema

@echo off & setlocal enableextensions enabledelayedexpansion 
set myfile_=C:\_D\TEST\My test file.txt 
set FirstLine= 
for /f "delims=" %%i in ('type "%myfile_%"') do (
    if not defined FirstLine set FirstLine=%%i) 
echo FirstLine=%FirstLine% 
endlocal & goto :EOF 

(Sin embargo, los llamados caracteres veneno seguirá siendo un problema.)

Más sobre el tema de conseguir una determinada línea con comandos por lotes:
  "? 23} ¿Cómo consigo el enésimo, la primera y la última línea de un archivo de texto"
  http://www.netikka.net/tsneti/info/tscmd023.htm

[Agregado 28-Ago-2012] También se puede tener

@echo off & setlocal enableextensions 
set myfile_=C:\_D\TEST\My test file.txt 
for /f "tokens=* delims=" %%a in (
    'type "%myfile_%"') do (
    set FirstLine=%%a& goto _ExitForLoop) 
:_ExitForLoop 
echo FirstLine=%FirstLine% 
endlocal & goto :EOF 
+0

El set/p texte =

1

Prueba este

@echo off 
setlocal enableextensions enabledelayedexpansion 
set firstLine=1 
for /f "delims=" %%i in (yourfilename.txt) do (
    if !firstLine!==1 echo %%i 
    set firstLine=0 
) 
endlocal 
0

Otra forma

setlocal enabledelayedexpansion 
@echo off 
for /f "delims=" %%i in (filename.txt) do (
if 1==1 (
set first_line=%%i 
echo !first_line! 
goto :eof 
)) 
+2

Recomendaría usar un archivo .bat SOLAMENTE como último recurso. Si es posible, siempre intente usar un lenguaje de scripting "real": Powershell, WSH, Python ... CUALQUIER COSA menos archivos .bat. – paulsm4

+0

El lote no es * tan * malo (cuando sabe, lo que hace, igual que con cualquier otro idioma). hhay: tu código no está funcionando. – Stephan

+0

¿por qué la dosis no funciona la primera vez? – hhay

Cuestiones relacionadas