fichier batch Windows XP concat
-
19-09-2019 - |
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.
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:
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