2008-10-15 11 views
80

Comment lire un fichier (texte ou binaire) à partir d'un fichier batch? Il y a un moyen de le lire en mode binaire ou en mode texte?Fichiers batch: comment lire un fichier?

+0

@ RookieTEC9: oui, je sais que ce sont 2 choses complètement différentes, mais j'avais besoin d'une réponse qui a fonctionné dans msdos, pas windows nt (ou versions plus récentes), aussi cette question a été posée il y a 7 ans –

+0

@ RookieTEC9: Je pense que vous avez raison, cela fait un moment que cela. Je vais juste enlever la balise ms-dos –

+0

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

Répondre

37

Vous pouvez utiliser la commande pour:

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

Type de

for /? 

à l'invite de commande. En outre, vous pouvez parse ini files!

+14

Ceci est un exemple assez complexe, analysant des informations très spécifiques à partir d'un fichier texte particulièrement formaté, sans donner d'explication. Selon 'pour /?' La commande * analyserait chaque ligne dans monfichier.txt, ignorant les lignes qui commencent par un point-virgule, passant le deuxième et le troisième jeton de chaque ligne au corps, avec des jetons délimités par des virgules et/ou des espaces . * –

57

Sous cmd.exe style NT, vous pouvez boucler à travers les lignes d'un fichier texte avec

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

Tapez « l'aide » à l'invite de commande pour plus d'informations. (Ne sais pas si cela fonctionne dans tout ce "DOS" vous utilisez)

+15

Cela devrait être '%% i'. –

+25

Cette commande quitterait la lecture d'une ligne si elle trouvait un caractère d'espace. J'ai finalement fini par utiliser FOR/F "tokens = *" %% i IN (fichier.txt) DO @ECHO %% i – Jason

+8

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

31

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 de plus de ~ 8190 sont problématiques. L'expansion fonctionne seulement fiable, si l'expansion retardée est désactivée.

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

Direct La lecture binaire semble donc presque impossible.

Le problème avec les lignes vides peut être résolu avec une astuce. Préfixe chaque ligne avec un numéro de ligne, en utilisant la commande findstr, et après la lecture, supprime 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 
) 

Basculement entre activer et désactivé l'expansion retardée neccessaire pour le coffre-fort de travailler avec des chaînes, comme ! ou ^^^xy!z.
C'est parce que la ligne set "var=%%a" n'est sûre 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 var n'est sûre qu'avec EnabledDelayedExpansion, car même un call %%var%% échouera avec un contenu tel que "&"&.

EDIT: Ajout défini/variante p
Il y a 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 supprime les caractères de contrôle à la fin de la ligne .
Mais l'avantage est, vous ne l'avez pas besoin du basculement retardé et il est plus facile à stocker des valeurs dans les 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 lire « binaire » dans une représentation hexagonale
Vous pouvez regarder SO: converting a binary file to HEX representation using batch file

+0

Merci pour le pointeur sur l'utilisation de 'set/p'. J'ai utilisé 'set/p value = SteveC

+0

Jeb, j'ai posé une question connexe basée sur votre solution ci-dessus dans http://stackoverflow.com/questions/11408295/with-dos -batch-file-comment-analyser-un-fichier-et-sortir-partie-vers-un-fichier-partie-vers-un – Nicholas

+0

Qu'en est-il du caractère EOF (fin de fichier), ASCII '0x1A' ? est-ce que 'for/F' se comporte de la même manière qu'avec les caractères NUL (' 0x00')? – aschipfl

-4

si vous voulez juste pour l'afficher sur cmd, vous pouvez utiliser ceci:

cat myfile.txt 
+6

'cat' n'est pas une commande Windows , vous devriez utiliser 'type' pour ça. –

0

bien al theres ot de différentes façons, mais si vous voulez seulement afficher le texte et entreposez pas partout, vous utilisez juste: findstr /v "randomtextthatnoonewilluse" filename.txt

0

Un moyen très facile de le faire est d'utiliser la commande suivante:

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

Cette volonté affiche uniquement la première ligne de texte dans un fichier texte. L'autre façon, vous pouvez 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!

Questions connexes