9
votes

DOS Batch pour la boucle avec Find.exe se déshabille des lignes vides?

Ce script de lot DOS désactive les lignes vides et ne montre pas les lignes vides dans le fichier, même si j'utilise la commande Type.exe pour convertir le fichier pour vous assurer que le fichier est ASCII afin que la commande de recherche soit compatible. avec le fichier. Quelqu'un peut-il me dire comment faire ce script inclut des lignes vides?

@ECHO off
FOR /F "USEBACKQ tokens=*" %%A IN (`TYPE.exe "build.properties" ^| FIND.exe /V ""`) DO (
  ECHO --%%A--
)
pause


0 commentaires

5 Réponses :


19
votes

C'est le comportement conçu pour / f - il ne renvoie jamais de lignes vides. Le travail autour est d'utiliser Rechercher ou Rechercher pour préfixer la ligne avec le numéro de ligne. Si vous ne pouvez garantir aucune ligne de départ avec le délimiteur de numéro de ligne, vous définissez simplement le délimiteur approprié et gardez les jetons 1 * mais utilisez uniquement le 2e jeton.

setlocal enableDelayedExpansion
type "file.txt">"file.txt.tmp"
for /f %%N in ('find /c /v "" ^<"file.txt.tmp"') do set cnt=%%N
<"file.txt.tmp" (
  for /l %%N in (1 1 %cnt%) do(
    set "ln="
    set /p "ln="
    echo(!ln!
  )
)
del "file.txt.tmp"


9 commentaires

Pas de problème là-bas, mais je suis d'accord que ça a l'air mauvais. C'est une option plus fiable que echo. . Il existe des situations obscures où écho. peut échouer, alors que echo ( ne manque jamais. Le point de la syntaxe permet de permettre la sortie d'une ligne vide.


Pouvez-vous expliquer la ligne "echo (! Ln!"? N'y a-t-il pas un problème avec une parenthèse de fermeture? De plus, la ligne ci-dessus manque la fermeture! Char?


Enfin, ça marche. Vos connaissances dans ce domaine sont géniales. Merci.


@ Didzis / Tom / Xlant - sauf si vous savez pourquoi Je vois des résultats qui suggèrent que la déclaration de cet utilisateur "{dans toutes les versions de Windows} sauter des lignes vierges est une fonctionnalité conçue "est incorrecte , je ne suis pas sûr de savoir pourquoi mon édition suggérée de corriger cela a été rejetée ??


@dbenham, y a-t-il une raison pour laquelle vous devez utiliser la commande type , puis tuez-la dans la commande trouver ? Pourquoi ne pas réduire de moitié l'accès au fichier et il suffit d'utiliser pour 's ' skip la commande avec la commande trouver comme suit: pour / f "jetons = 1 * Skip = 2 Delims =] "%% x in ('Rechercher x.txt / n / v" "") do @if "% y" == "" (echo %%) de cette façon, les données sont uniquement lues à partir du disque une fois.


@Jamesk - J'utilise le type pour vous assurer que le contenu est ASCII. Relisez la question de l'OP puis lisez le 4ème paragraphe de ma réponse (ignorant le code). Je m'adresse à vos préoccupations.


Modifier - Réponse corrigée à Adresse FindStr avec une entrée redirigée ou canalisée déposant de longues lignes et a ajouté une variante qui conserve de longues lignes.


Y a-t-il une solution de contournement si les lignes sont plus longues à 1021 octets?


@Jcarlos - Non, la technique SET / P a une limite d'octets de 1021 durs.



0
votes

Merci à DBENHAM, cela fonctionne, bien qu'il soit légèrement différent de sa suggestion:

::preserve blank lines using FIND, no limitations
for /f "USEBACKQ delims=" %%A in (`type "file.properties" ^| find /V /N ""`) do (
  set "ln=%%A"
  setlocal enableDelayedExpansion
  set "ln=!ln:*]=!"
  echo(!ln!
  endlocal
)


2 commentaires

Qu'est-ce qui ne fonctionne pas? Que vois-tu? Je vois un problème. echo! ln! imprimera echo est désactivé si la ligne est vide! C'est pourquoi j'ai utilisé echo (! Ln!


Ok, je l'ai mis à jour. Ça fonctionne maintenant. Merci beaucoup! Maintenant, j'ai juste besoin d'intégrer cela dans mon projet.



2
votes

J'ai écrit un programme très simple qui peut servir de remplacement de Rechercher et Commandes FindStr lorsqu'ils sont utilisés à cette fin. Mon programme s'appelle pipe.com et il suffit d'insérer un espace vide dans des lignes vides. Toutes les lignes peuvent donc être traitées directement par pour la commande sans ajustements supplémentaires (aussi longtemps comme l'espace inséré ne se soucie pas). Ici, il est: xxx

edit : addendum en tant que réponse au nouveau commentaire

Créer un programme de 88 octets appelé pipe.com, qui essentiellement un processus équivalent à ce code pseudo-batch: xxx

de cette façon, des lignes vides dans le fichier d'entrée sont modifiées par Des lignes avec un espace, donc la commande / f net plus omettez-leur. Cela fonctionne "tant que l'espace inséré ne se soucie pas" Comme je l'ai dit dans ma réponse.

Notez que le programme Pipe.com ne fonctionne pas dans les versions de 64 bits Windows. < p> antonio


6 commentaires

Merci pour l'aide aussi de DOS TIPS


Excuse-moi. Pourriez-vous confirmer si mon programme de pipe.com a résolu votre problème?


@Aacini - Pourriez-vous décrire comment cette solution fonctionne plus en détail?


@Aacini - merci. Bien que je ne suive pas tout cela (je crois que je réalise maintenant que % tuyau% contient le code compilé d'un programme exécutable, cependant). Si cela ne vous dérange pas, pourriez-vous expliquer: ce que le C est dans set / pc char = et comment ¿Cette ligne ne prend qu'un seul caractère?; où le contenu de % nouvelle ligne% est défini; que le echo ne jointe pas au caractère / espace et à une nouvelle ligne de fin sur % ligne% ; Et enfin, quelle variable est ce que tous les caractères individuels sont joints à un par un à un second ¿secondes? itération. En outre, une version 64 bits ne peut-elle pas être créée?


@ user66001: Comme je l'ai dit dans ma réponse, c'est un code pseudo-batch, pas code réel. C'est juste un moyen de vous expliquer ce que pipe.com est à la place de: "Lisez le caractère suivant, si ce n'est pas NL Ajoutez à la ligne actuelle, sinon montrer la ligne actuelle, mais s'il est vide, insérez un espace». Ce processus ne peut pas être réalisé par un fichier de commandes précisément parce que les détails que vous mentionnez. Le programme d'origine.ASM a été écrit en langage de montage.


@Aacini - D'accord; Désolé; Merci.



1
votes

lignes de sortie, y compris les lignes vierges strong>

Voici une méthode que j'ai développée pour mon propre usage. p>

enregistrer le code sous forme de fichier de commandes, Showall.bat em> strong> et transmettez le fichier source en tant que paramètre de ligne de commande. P>

sortie peut être redirigé ou pipi. P>

for /f "tokens=1,* delims=]" %%a in ('find /n /v "" "%~1"') do echo.%%ba


2 commentaires

Nice, mais il strace leader ] des caractères des lignes et echo. échouera si une ligne existe comme \ .. \ \ \ System32 \ \. calc.exe


@JEB, en fait, sous Windows 7 au moins, il ne dépasse pas tous les caractères ] . Juste le premier, ou jusqu'à ce qu'il rencontre le * .



0
votes

Comme mentionné dans Cette répondez à la question ci-dessus, il ne semble pas que les lignes soient ignorées par défaut en utilisant pour / f code> In (au moins) Windows XP code> (communauté - Veuillez mettre à jour cette réponse en testant les commandes de lot ci-dessous sur votre version et service pack de Windows code >). de
de
de
EDIT: STRUT> PAR Jeb 'S Commentaire ci-dessous , il semble que la commande ping code>, dans au moins Windows XP code>, est
causant pour / f code> pour produire code> est au lieu de lignes vides (si quelqu'un sait spécifiquement pourquoi, serait
Appréciez-le s'ils pouvaient mettre à jour cette réponse ou cette réponse).

En tant que solution de contournement, il semble que le deuxième jeton délimité par défaut ( code> / %% b code> L'exemple)
retourne comme vierge code>, qui a fonctionné pour ma situation d'élimination des lignes vides à la manière d'un "parent"
si code> conditionnel sur le deuxième jeton au début du pour / f code>, comme celui-ci: p> xxx pré>


de
Utilisation du code ci-dessous: P>

@echo off
systeminfo | findstr /b /c:"OS Name" /c:"OS Version" 
echo.&echo.
ping -n 1 google.com
echo.&echo.
for /f %%a in ('ping -n 1 google.com') do ( echo "%%a" )
echo.&echo.&echo --------------&echo.&echo.
find /?
echo.&echo.
for /f %%a in ('find /?') do ( echo "%%a" )
echo.&echo.
pause


5 commentaires

Comme Dbenham a dit: des bandes pour / f toujours des lignes vides. Dans votre cas, il semble que XP ne dépasse pas les lignes vides, mais en réalité, vous obtenez une ligne avec seulement une seule citation entre "pinging" et "Répondre" . Mais cela ne signifie pas que pour / f récupère une ligne vide. La ligne contient un caractère , donc le curseur saute sur la ligne de départ et que la première citation est écrasée par la dernière citation, c'est tout. La commande ping sous xp est simplement buggy


Merci @jeb. Je suis venu sur cette page en raison du problème avec (ce que je pensais à l'époque était) des espaces supplémentaires, mais réalisez maintenant (corrigé par vous), ils ne sont que des retours de transport étant donné sur XP. Pouvez-vous aussi peut-être aussi conseiller comment on testerait-on pour le dans un si non "x %% a" = "" énoncé?


Pour supprimer cr , vous pouvez appeler une fonction comme : tondeuse définir "trim =% 1" Ceci fonctionne, car tout CR est supprimé après la phase d'expansion en pourcentage. Mais pour plus de questions, vous devriez ouvrir une propre question


Votre n'utilise pas le personnage '~' correctement. Il élimine les citations sur l'extérieur des cordes pour vous. Comprendre cela pourrait être la racine de votre problème. Au lieu de "%% A", vous devez utiliser '%% ~ a'.


@djangofan n'a pas compris au début, je n'utilisais pas du tout, sans parler correctement. Cependant, après l'avoir inséré comme indiqué dans Cette capture d'écran Je dois le faire mal. Le problème est que je pense que JEB a correctement identifié ci-dessus, que pour / f n'ignore pas complètement les lignes vides, je suppose que c'est supprimer le lf , mais pas le < Code> Cr sur Win XP. Je viens de l'enfermer dans des citations pour voir ce qu'il s'agit de la sortie.