2008-09-24 9 views

Répondre

43

Voici un fichier batch général pour imprimer les lignes supérieures n à partir d'un fichier comme l'utilitaire GNU head, au lieu d'une seule ligne.

@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 

Par exemple:

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 

Il ne compte pas des lignes vides. Il est également soumis à la restriction de longueur de ligne de 8 KB.

+8

FYI: "GOTO: EOF" C'est une étiquette spéciale qui va quitter le script sans avoir à définir une étiquette spéciale ": exit". C'est aussi utile lors de la définition des sous-routines dans le batch (que dis-tu? Sous-programmes? Yep) – Steven

+3

Cela semble exploser sur mes nombreux fichiers texte GB ... Dans un fichier, il m'a donné une erreur "Mémoire insuffisante" renvoie 10 lignes, sur l'autre fichier il vient de renvoyer une seule ligne vide en lui demandant de retourner 10 lignes. Des idées pour lesquelles cela arrive? – Dan

+0

Même problème ici .. –

9

Vous pourriez donner à ce essayer:

@echo off 

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

modifier Ou, disons que vous avez quatre colonnes de données et que vous voulez à partir de la 5ème ligne vers le bas au fond, essayez ceci:

@echo off 

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

Cela m'a donné l'indice dont j'avais besoin mais n'était pas tout à fait exact. Je ne savais pas quelle était la procédure correcte mais j'ai incorporé cette solution dans la solution finale. voir http://stackoverflow.com/questions/130116#130209 –

+2

Le problème de cette solution est qu'elle délimite l'espace au lieu de newline, et vous ne pouvez pas avoir un nom de fichier avec des espaces. Vous pouvez résoudre ces problèmes avec les options delims et usebackq de la boucle for. – indiv

3

S'appuyant légèrement sur les réponses des autres personnes. Maintenant, vous permettant de spécifier le fichier que vous voulez lire et la variable que vous voulez que le résultat mis en:

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

Cela signifie que vous pouvez utiliser ce qui précède comme celui-ci (en supposant que vous l'appeliez getline.bat)

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

Un liner, utile pour stdout redirigent avec « > »:

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

Cela ne semble pas fonctionner dans Win 8.1: -/ –

0

Remarque, les approches de fichiers par lots sera limitée à la limite de la ligne pour le processeur de commande DOS - voir What is the command line length limit?. Donc, si vous essayez de traiter un fichier qui a plus de lignes que caractères, le script les ignorera car la valeur ne peut pas être tenue.

15

Euh ... vous les gars

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 le fichier a plus de 11 lignes, il imprimera plus que le premier, comme: 1: 11, 21 :, etc –

+1

Bonne capture Cesar ! J'essaie toujours d'éviter les citations parce qu'elles m'agacent, mais dans ce cas c'était une mauvaise idée. Pour corriger, changez en 'findstr"^1: "' et gagnez la chaleur et la protection des guillemets. Ou, si vous méprisez des citations comme moi et que vous voulez vivre dangereusement, utilisez 'findstr/b 1:' –

+4

si vous le voulez sans guillemets et sans option/b alors échappez juste au signe: 'findstr ^^ 1'. – dbenham

174

uh? imo cela est beaucoup plus simple

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

+1, C'est le meilleur quand cela fonctionne :-) Il a des limites suivantes 1) Longueur de ligne maximale de 1021 octets, sans compter EOL. 2) Le fichier doit utiliser Windows Style EOL de CarriageReturn LineFeed.3) Les caractères de contrôle de fin seront supprimés de la ligne – dbenham

+2

De plus, le texte doit être explicitement indéfini avant de lire le fichier juste au cas où la première ligne est vide. – dbenham

+0

Ne fonctionne pas ... plate-forme win 7 – Jai

1

Le problème avec les solutions EXIT/B, lorsque plus réaliste dans un fichier batch que seulement une partie de celui-ci est le suivant. Il n'y a pas de traitement ultérieur dans le fichier batch après la commande EXIT/B. Habituellement, il y a beaucoup plus à faire que la tâche unique et limitée.

Pour contrer ce problème

@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 

(Cependant, les caractères de poison soi-disant sera toujours un problème.)

Plus sur le sujet d'obtenir une ligne particulière avec des commandes de lots:
  « ? 23} Comment puis-je obtenir le n'th, la première et la dernière ligne d'un fichier texte »
  http://www.netikka.net/tsneti/info/tscmd023.htm

[Ajouté le 28 août 2012] On peut aussi avoir

@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

Le set/p texte =

1

Essayez cette

@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

Une autre façon

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

Je recommanderais d'utiliser un fichier .bat uniquement en dernier recours. Si c'est possible, essayez toujours d'utiliser un langage de script «réel»: Powershell, WSH, Python ... N'IMPORTE QUEL fichier .bat. – paulsm4

+0

Le lot n'est pas * mauvais * (quand vous savez, ce que vous faites, comme dans toutes les autres langues). hhay: votre code ne fonctionne pas. – Stephan

+0

pourquoi la dose ne fonctionne pas à la première fois? – hhay