web-dev-qa-db-fra.com

Fichiers batch: Comment lire un fichier?

Comment vous pouvez lire un fichier (texte ou binaire) à partir d'un fichier de commandes? Il y a un moyen de le lire en mode binaire ou en mode texte?

91

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 !

40
johnstok

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

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

Tapez "aide pour" sur la commande Invite pour plus d'informations. (Je ne sais pas si cela fonctionne dans le "DOS" que vous utilisez)

65
devio

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

La détection de CR/LF par rapport à un seul LF semble également un peu compliquée.
Les caractères NUL posent également problème, 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, à l'aide de la commande findstr, puis supprimez le préfixe après l'avoir lu.

@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 les extensions retardées activée et désactivée pour pouvoir utiliser des chaînes en toute sécurité, 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 supprimés aussi.
Mais l'utilisation de la variable var n'est sécurisée qu'avec EnabledDelayedExpansion , car même un call %%var%% échouera avec un contenu tel que "&"& .

EDIT: Ajout de la variante set/p
Il existe une seconde façon de lire un fichier avec set /p, le seul inconvénient est 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 de la bascule différée et 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 représentation hexadécimale
Vous pourriez regarder SO: convertir un fichier binaire en représentation HEX à l'aide d'un fichier de commandes

36
jeb

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!

6
J. Bond

Eh bien, il y a beaucoup de façons différentes, mais si vous voulez seulement AFFICHER le texte et non le STOCKER n'importe où, vous devez simplement utiliser: findstr /v "randomtextthatnoonewilluse" filename.txt

1
NetvorMcWolf

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
0
Celes