Question

Je suis en train d'accomplir la tâche ridicule suivante:

J'ai un fichier texte contenant un ensemble de filesnames qualifiés. Je veux itérer le fichier et ajoutez chaque ligne à une variable commune, qui peut être transmis à un outil de ligne de commande. Par exemple, le fichier peut être:

  

C: \ dir \ test.txt

     

C: \ Windows \ test2.txt

     

C: \ text3.txt

et je voudrais les assigner à une variable « a » tel que:

a = "C:\dir\test.txt C:\WINDOWS\test2.txt C:\text2.txt"

Une question secondaire est - ce qui est une bonne référence de fichier batch? Je trouve des trucs dans le matériel Windows et beaucoup de sites cultivés à domicile, mais rien particulièrement complet.

Était-ce utile?

La solution

En ce qui concerne les références, SS64.com est pas mal. Rob van der Woude obtient liée assez souvent aussi.


En ce qui concerne votre problème, c'est facile:

@echo off
setlocal enableextensions enabledelayedexpansion

set LIST=
for /f %%x in (yourfile.txt) do (
    set LIST=!LIST! "%%x"
)

echo %LIST%

endlocal

Plus d'explication approfondie:

setlocal enableextensions enabledelayedexpansion

Nous permettons expansion retardée ici. Ceci est crucial car sinon nous ne serions pas en mesure de manipuler la liste des fichiers dans la boucle de for qui suit.

for /f %%x in (yourfile.txt) do (
    set LIST=!LIST! "%%x"
)

for /f itère sur les lignes dans un fichier, donc exactement ce que nous avons besoin ici. Dans chaque itération de la boucle, nous ajoutons la ligne suivante à la variable LIST. Notez l'utilisation de !LIST! au lieu de la %LIST% habituelle. Cela signale l'expansion retardée et assure que la variable est ré-évaluée chaque fois que cette commande est exécutée.

En général cmd développe des variables à leurs valeurs dès qu'une ligne est lu et analysé. Pour cmd une seule ligne est soit une ligne ou tout ce qui compte comme une ligne, ce qui arrive à vrai pour les blocs délimités par des parenthèses comme celui que nous avons utilisé. Donc, pour cmd le bloc complet est une seule instruction qui est lu et analysé une fois, quelle que soit la fréquence à laquelle l'intérieur des pistes en boucle.

Si nous avons utilisé %LIST% ici au lieu de !LIST! la variable aurait été remplacée immédiatement par sa valeur (vide à ce moment-là) et la boucle aurait ressemblé à ceci:

for /f %%x in (yourfile.txt) do (
    set LIST= "%%x"
)

est manifestement pas ce que nous voulions. expansion retardée fait en sorte qu'une variable est étendue que lorsque sa valeur est vraiment nécessaire. Dans ce cas, lorsque l'intérieur des pistes en boucle et construit une liste de noms de fichiers.

Ensuite, la variable %LIST% ou !LIST! (maintenant il n'a pas vraiment plus question que d'utiliser) contient la liste des lignes du fichier.

Curieusement, l'aide pour la commande set comprend exactement cet exemple pour l'expansion retardée:

  

Enfin, le soutien retardé   agrandissement variable d'environnement a   été ajoutée. Ce soutien est toujours   désactivée par défaut, mais peut être   activé / désactivé par l'intermédiaire de la commande / V   Commutateur de ligne de CMD.EXE. Voir CMD /?

     

environnement de détente variable différée   est utile pour se déplacer dans la   limites de l'expansion actuelle   qui se produit quand une ligne de texte est   lecture, pas quand il est exécuté. le   exemple suivant illustre la   problème avec la variable immédiate   extension:

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "%VAR%" == "after" @echo If you see this, it worked
)
     

ne serait jamais afficher le message, depuis   le% VAR% dans les déclarations IF est DEUX   substitué lorsque le premier SI   déclaration est lue, car logiquement   comprend le corps de l'IF, qui est   une instruction composée. Ainsi, le SI   à l'intérieur de l'instruction composée est   vraiment comparer « avant » avec « après »   qui ne sera jamais égale. De même,   l'exemple suivant ne fonctionnera pas comme   attendu:

set LIST=
for %i in (*) do set LIST=%LIST% %i
echo %LIST%
     

en ce qu'elle ne construira pas une liste de   fichiers dans le répertoire courant, mais   au lieu sera simplement définir la liste   variable au dernier fichier trouvé.   Encore une fois, cela est parce que la liste%% est   juste une fois élargi lorsque FOR   déclaration est lu, et à ce moment-là   la variable est vide. Alors le   réelle boucle FOR nous exécutons est:

for %i in (*) do set LIST= %i
     

qui ne cesse mise à la LISTE   dernier fichier trouvé.

     

environnement de détente variable différée   vous permet d'utiliser un autre   caractère (le point d'exclamation) à   développer des variables d'environnement à   temps d'exécution. Si la variable retardée   l'expansion est activé, ce qui précède   Les exemples pourraient être rédigés comme suit   de travailler comme prévu:

set VAR=before
if "%VAR%" == "before" (
    set VAR=after
    if "!VAR!" == "after" @echo If you see this, it worked
)

set LIST=
for %i in (*) do set LIST=!LIST! %i
echo %LIST%

Autres conseils

Qu'est-ce que vous êtes après peut être fait avec un POUR commande / F.

Voici une bonne ressource que je l'ai utilisé plusieurs fois:

http://www.robvanderwoude.com/batchfiles.php

Un bon livre: Windows NT Shell Scripting par Tim Hill. L'édition que j'ai été publié en 1998, mais elle est toujours valide pour les programmes de commande Windows dans Windows 2008.

type *commonfilepart* >> concat_result_file

OS: Windows Server 2003

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top