114 votes

Fichiers par lots : Comment lire un fichier ?

Comment lire un fichier (texte ou binaire) à partir d'un fichier batch ? Il existe un moyen de le lire en mode binaire ou en mode texte ?

0 votes

@RookieTEC9 : oui, je sais qu'il s'agit de deux choses complètement différentes, mais j'avais besoin d'une réponse qui fonctionnait sous msdos, pas sous Windows nt (ou des versions plus récentes), et cette question a été posée il y a 7 ans, gardez cela à l'esprit.

0 votes

@RookieTEC9 : Je pense que tu as raison, ça fait un moment que ça n'a pas été fait. Je vais juste enlever le tag ms-dos.

1 votes

Vous pouvez utiliser la commande TYPE [fileName] pour MS-Dos.

81voto

devio Points 22981

Sous cmd.exe de style NT, vous pouvez parcourir en boucle les lignes d'un fichier texte avec

FOR /F %%i IN (file.txt) DO @echo %%i

Tapez "help for" à l'invite de commande pour plus d'informations. (je ne sais pas si cela fonctionne avec le "DOS" que vous utilisez).

38 votes

Cette commande cessait de lire une ligne si elle trouvait un caractère d'espacement. J'ai fini par utiliser FOR /F "tokens=*" %%i IN (file.txt) DO @ECHO %%i

11 votes

Cela fonctionne ! et Si vous utilisez la console, essayez %i si vous utilisez un fichier bat, essayez %%i .

44voto

jeb Points 26035

Le FOR-LOOP fonctionne généralement, mais il y a quelques problèmes. Le FOR n'accepte pas les lignes vides et les lignes avec plus de ~8190 sont problématiques. L'expansion ne fonctionne que de manière fiable, si l'expansion retardée est désactivée.

La détection des CR/LF par rapport à une seule LF semble également un peu compliquée.
Les caractères NUL sont également problématiques, car un FOR-Loop annule immédiatement la lecture.

Direct La lecture binaire semble donc presque impossible.

Le problème des lignes vides peut être résolu grâce à une astuce. Préfixez chaque ligne avec un numéro de ligne, en utilisant la commande findstr, et après la lecture, supprimez le préfixe.

@echo off
SETLOCAL DisableDelayedExpansion
FOR /F "usebackq delims=" %%a in (`"findstr /n ^^ t.txt"`) do (
    set "var=%%a"
    SETLOCAL EnableDelayedExpansion
    set "var=!var:*:=!"
    echo(!var!
    ENDLOCAL
)

Il est nécessaire de basculer entre l'activation et la désactivation de l'expansion retardée. pour travailler en toute sécurité avec des chaînes de caractères, comme ! o ^^^xy!z .
C'est parce que la ligne set "var=%%a" n'est sûr qu'avec DisabledDelayedExpansion sinon, les points d'exclamation sont supprimés et les carets sont utilisés comme caractères d'échappement (secondaires) et sont également supprimés.
Mais en utilisant la variable var n'est sûr qu'avec EnabledDelayedExpansion car même un call %%var%% échouera avec un contenu comme "&"& .

EDIT : Ajout de la variante set/p
Il existe une deuxième façon de lire un fichier avec set /p Les seuls inconvénients sont qu'il est limité à ~1024 caractères par ligne et qu'il supprime les caractères de contrôle en fin de ligne.
Mais l'avantage est que vous n'avez pas besoin du basculement différé et qu'il est plus facile de stocker des valeurs dans des variables.

@echo off
setlocal EnableDelayedExpansion
set "file=%~1"

for /f "delims=" %%n in ('find /c /v "" %file%') do set "len=%%n"
set "len=!len:*: =!"

<%file% (
  for /l %%l in (1 1 !len!) do (
    set "line="
    set /p "line="
    echo(!line!
  )
)

Pour le lire de façon "binaire" dans une représentation hexagonale
Vous pourriez regarder SO : conversion d'un fichier binaire en représentation HEX à l'aide d'un fichier batch

0 votes

Merci pour l'indication de l'utilisation de set /p . J'ai utilisé set /p value=< result.txt récupérer la première ligne d'un fichier texte

0 votes

Jeb, j'ai posé une question connexe basée sur votre solution ci-dessus dans stackoverflow.com/questions/11408295/

0 votes

Qu'en est-il du caractère EOF (end-of-file), ASCII 0x1A ? fait for /F se comportent de la même manière qu'avec NUL ( 0x00 ) des personnages ?

39voto

johnstok Points 16139

Vous pouvez utiliser la commande for :

FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k

Type

for /?

à l'invite de commande. Vous pouvez également analyser les fichiers ini !

31 votes

Il s'agit d'un exemple assez complexe, qui analyse des informations très spécifiques à partir d'un fichier texte particulièrement formaté, sans donner aucune explication. D'après for /? le commandement analyserait chaque ligne de monfichier.txt, en ignorant les lignes qui commencent par un point-virgule, en passant le 2ème et le 3ème jeton de chaque ligne au corps de for, les jetons étant délimités par des virgules et/ou des espaces.

4 votes

Votre exemple est tiré de l'aide de cmd.exe. Vous devriez ajouter un indice pour cela ou copier toute la description.

15voto

J. Bond Points 396

Une façon très simple de le faire est d'utiliser la commande suivante :

set /p mytextfile=< %pathtotextfile%\textfile.txt
echo %mytextfile%

Cela n'affichera que la première ligne de texte d'un fichier texte. L'autre façon de procéder est d'utiliser la commande suivante :

type %pathtotextfile%\textfile.txt

Cela permet d'afficher à l'écran toutes les données du fichier texte. J'espère que cela vous aidera !

1voto

NetvorMcWolf Points 16

Il existe de nombreuses façons de procéder, mais si vous souhaitez uniquement afficher le texte et ne pas le stocker quelque part, il suffit d'utiliser la méthode suivante : findstr /v "randomtextthatnoonewilluse" filename.txt

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X