Fichiers batch: comment lire un fichier?

97

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?

Lucas Gabriel Sánchez
la source
@ RookieTEC9: oui, je sais que ce sont 2 choses complètement différentes, mais j'avais besoin d'une réponse qui fonctionnait dans msdos, pas windows nt (ou versions plus récentes), cette question a également été posée il y a 7 ans, gardez cela à l'esprit
Lucas Gabriel Sánchez
@ RookieTEC9: Je pense que vous avez raison, cela fait un moment depuis. Je vais simplement supprimer le tag ms-dos
Lucas Gabriel Sánchez
1
Vous pouvez utiliser la commande TYPE [fileName]pour MS-Dos.
RookieTEC9
essayez ceci, cela a fonctionné pour moi - stackoverflow.com/a/31919715/4534414
Anurag_BEHS

Réponses:

40

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. En outre, vous pouvez analyser les fichiers ini !

Johnstok
la source
25
C'est un exemple assez complexe, analysant des informations très spécifiques à partir d'un fichier texte particulièrement formaté, sans donner aucune explication. Selon for /?la commande , analyser chaque ligne de myfile.txt, en ignorant les lignes commençant par un point-virgule, en passant le 2ème et le 3ème jeton de chaque ligne au corps for, avec des jetons délimités par des virgules et / ou des espaces.
Martin Prikryl
2
Votre exemple provient de l'aide de cmd.exe. Vous devriez ajouter un indice pour cela ou copier toute la description.
Th. Thielemann
70

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

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

Tapez «help for» sur l'invite de commande pour plus d'informations. (je ne sais pas si cela fonctionne sous n'importe quel "DOS" que vous utilisez)

devio
la source
22
Ça devrait être %%i.
Jim Fell le
32
Cette commande arrêterait 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
Jason
9
Ça marche! et Si vous utilisez la console, essayez% i si vous utilisez un fichier bat puis essayez %% i.
Steven Du
41

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 de manière fiable que si l'expansion retardée est désactivée.

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

La lecture binaire directe semble donc presque impossible.

Le problème des lignes vides peut être résolu avec une astuce. Préfixez chaque ligne avec un numéro de ligne, à l'aide de 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
)

Le basculement entre l'expansion retardée activée et désactivée est nécessaire pour travailler en toute sécurité avec des chaînes, comme !ou ^^^xy!z.
C'est parce que la ligne set "var=%%a"n'est sécurisée qu'avec DisabledDelayedExpansion , sinon les points d'exclamation sont supprimés et les carets sont utilisés comme caractères d'échappement (secondaires) et ils sont également supprimés.
Mais l'utilisation de la variable varn'est sûre 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 à la fin de la 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 "binaire" en une représentation hexadécimale
Vous pouvez regarder SO: convertir un fichier binaire en représentation HEX en utilisant un fichier batch

jeb
la source
Merci pour le pointeur sur l'utilisation de set /p. J'avais l'habitude d' set /p value=< result.txtobtenir la première ligne d'un fichier texte
SteveC
Jeb, j'ai posé une question connexe basée sur votre solution ci-dessus dans stackoverflow.com/questions/11408295/...
Nicholas
Qu'en est-il du caractère EOF (fin de fichier), ASCII 0x1A? ne for /Fse comportent de la même manière que NUL ( 0x00personnages)?
aschipfl
@aschipfl Je suppose que le 0x1A se comporte dans certains cas comme un saut de ligne (ou mieux, il est traduit en un saut de ligne). Existe-t-il un moyen de créer un SUB sans utiliser de fichier temporaire?
jeb
cela devrait être la réponse acceptée, elle est infaillible même si les lignes commencent par :ou ;ou contiennent!
HackingAddict1337
11

Un moyen 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 dans un fichier texte. L'autre façon de le faire est d'utiliser la commande suivante:

type %pathtotextfile%\textfile.txt

Cela mettra toutes les données dans le fichier texte à l'écran. J'espère que cela t'aides!

J. Bond
la source
1

Eh bien, il existe de nombreuses façons différentes, mais si vous voulez seulement AFFICHER le texte et ne pas le STOCKER n'importe où, utilisez simplement: findstr /v "randomtextthatnoonewilluse" filename.txt

NetvorMcWolf
la source
0

Code corrigé:

setlocal enabledelayedexpansion
for /f "usebackq eol= tokens=* delims= " %%a in (`findstr /n ^^^^ "name with spaces.txt"`) do (
    set line=%%a
    set "line=!line:*:=!"
    echo(!line!
)
endlocal
pause
Celes
la source
Du code principal de la page. Les guillemets ne sont pas positionnés correctement, le code n'est pas adapté aux fichiers dont le nom est avec des espaces. Le mien est. Je donne ici le truc du ^^^^
Celes
Vous avez raison avec les guillemets autour du nom de fichier, mais votre code a quelques problèmes: eol=et delims=sont superflus, set line=%%adevraient utiliser des guillemets et sans basculer le mode d'expansion différée, le code ne peut pas lire les points d'exclamation
jeb
-5

Un code qui affiche le contenu du fichier myfile.txt à l'écran

set% filecontent% = 0
type% filename% >>% filecontent%
echo% filecontent%

Jani Pierwszy
la source
3
veuillez au moins essayer le code avant de poster. C'est juste un non-sens.
Stephan
Qu'est-ce qui se passe ici? Je n'ai aucun sens
Gerhard