2008-09-24 11 views

Trả lời

43

Đây là tệp lô có mục đích chung để in đầu các dòng n từ một tệp như tiện ích GNU head, thay vì chỉ một dòng.

@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 

Ví dụ:

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 

Nó hiện không đếm dòng trống. Nó cũng phụ thuộc vào giới hạn độ dài dòng hàng loạt là 8 KB.

+8

FYI: "GOTO: EOF" Đó là một nhãn đặc biệt sẽ thoát khỏi tập lệnh mà không cần phải xác định nhãn ": thoát" đặc biệt. Nó cũng hữu ích khi xác định các chương trình con trong loạt (bạn nói gì? Subroutines? Yep) – Steven

+3

Điều này dường như bom ra trên một số tập tin văn bản GB của tôi ... Trên một tập tin nó đã cho tôi một lỗi "Out of Memory" khi cố gắng trả về 10 dòng, trên tập tin khác nó chỉ trả lại một dòng trống khi yêu cầu nó trả về 10 dòng. có ai biết tại sao việc này lại xảy ra? – Dan

+0

Cùng một vấn đề ở đây .. –

9

Bạn có thể cung cấp cho một thử này:

@echo off 

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

chỉnh sửa Hoặc, nói rằng bạn có bốn cột dữ liệu và muốn từ hàng thứ 5 xuống phía dưới, hãy thử này:

@echo off 

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

Điều này đã cho tôi manh mối tôi cần nhưng không hoàn toàn đúng. Không chắc chắn các thủ tục thích hợp là gì nhưng tôi kết hợp giải pháp này vào giải pháp cuối cùng. xem http://stackoverflow.com/questions/130116#130209 –

+2

Vấn đề của giải pháp này là nó phân tách trên không gian thay vì dòng mới, và bạn không thể có một tên tập tin có dấu cách. Bạn có thể khắc phục những vấn đề này với các tùy chọn delims và usebackq trong vòng lặp for. – indiv

3

Hơi xây dựng dựa trên câu trả lời của người khác. Bây giờ cho phép bạn chỉ định các tập tin bạn muốn đọc từ và biến bạn muốn kết quả đưa vào:

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

Điều này có nghĩa bạn có thể sử dụng trên như thế này (giả sử bạn gọi nó là getline.bat)

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

Một lót, hữu ích cho stdout redirect với ">":

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

Điều này dường như không hoạt động trong Win 8.1: -/ –

0

Lưu ý, phương pháp tiếp cận tập tin thực thi sẽ được giới hạn ở những giới hạn dòng cho bộ vi xử lý lệnh DOS - xem What is the command line length limit?. Vì vậy, nếu cố gắng xử lý tệp có bất kỳ dòng nào nhiều hơn, thì các ký tự, tập lệnh sẽ chỉ bỏ qua chúng vì không thể giữ giá trị.

15

Uh bạn guys ...

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

Nếu tệp có nhiều hơn 11 dòng, nó sẽ in nhiều hơn số đầu tiên, như: 1 :, 11 :, 21 :, v.v. –

+1

Bắt tốt Cesar ! Tôi luôn cố gắng tránh những dấu ngoặc kép bởi vì họ làm phiền tôi, nhưng trong trường hợp này đó là một ý tưởng tồi. Để sửa lỗi, thay đổi thành 'findstr '^ 1:" 'và tăng độ ấm và bảo vệ dấu ngoặc kép. Hoặc, nếu bạn khinh thường những dấu ngoặc kép như tôi và muốn sống nguy hiểm, hãy sử dụng 'findstr/b 1:' –

+4

nếu bạn muốn nó mà không có dấu ngoặc kép và không có tùy chọn/b thì chỉ cần thoát dấu nháy: 'findstr ^^ 1'. – dbenham

174

uh? imo này là đơn giản hơn nhiều

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

+1, Đây là cách tốt nhất khi nó hoạt động :-) Nó có các giới hạn sau 1) Độ dài dòng tối đa là 1021 byte, không bao gồm EOL. 2) Tệp phải sử dụng EOL kiểu Windows của CarriageReturn LineFeed.3) Ký tự điều khiển tra cứu sẽ bị tước khỏi dòng – dbenham

+2

Ngoài ra, văn bản phải được xác định rõ ràng trước khi đọc tệp chỉ trong trường hợp dòng đầu tiên trống. – dbenham

+0

Không hoạt động .... nền tảng giành chiến thắng 7 – Jai

1

Vấn đề với giải pháp EXIT/B, khi thực tế nhiều bên trong một tập tin thực thi như chỉ là một phần của nó là như sau. Không có quá trình xử lý tiếp theo trong tập tin batch đã nói sau EXIT/B. Thông thường có nhiều hơn nữa để lô hơn chỉ là một, nhiệm vụ hạn chế.

Để đối phó với vấn đề mà

@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 

(Tuy nhiên, các nhân vật độc cái gọi sẽ vẫn là một vấn đề.)

Thông tin thêm về chủ đề nhận một dòng cụ thể với các lệnh theo lô:
  "23} Làm cách nào để nhận dòng thứ nhất, dòng đầu tiên và dòng cuối cùng của tệp văn bản?"
  http://www.netikka.net/tsneti/info/tscmd023.htm

[Added 28-Aug-2012] Người ta cũng có thể có

@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

Tập hợp/p texte =

1

Hãy thử điều này

@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

Một cách khác

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

Tôi khuyên bạn nên sử dụng tệp .bat chỉ là phương sách cuối cùng. Nếu tất cả có thể, luôn luôn cố gắng sử dụng một ngôn ngữ kịch bản "thực": Powershell, WSH, Python ... BẤT KTH nhưng các tệp .bat. – paulsm4

+0

Hàng loạt không phải là * xấu * (khi bạn biết, bạn làm gì, giống như với mọi ngôn ngữ khác). hhay: mã của bạn không hoạt động. – Stephan

+0

tại sao nó liều không hoạt động ở lần đầu tiên? – hhay