Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Copier plusieurs fichiers texte dans un seul fichier texte en vbs

6 réponses
Avatar
Yannick Bernollin
Bonjour,

Voici mon problème:
- J'ai une liste de fichiers texte de structure identique que je voudrais
copier dans un seul fichier texte.

Exe: folder1\text1.txt
folder1\text2.txt
folder1\text3.txt
folder1\text5.txt
folder1\text4.txt
folder1\text6.txt
etc...

copier tous ces fichiers (le nombre total de fichiers est aléatoire) dans
folder1\text.txt

Comment réaliser cela en vbscript?

Merci pour votre aide

6 réponses

Avatar
Jacques93
Bonjour Yannick Bernollin
Yannick Bernollin a écrit :
Bonjour,

Voici mon problème:
- J'ai une liste de fichiers texte de structure identique que je voudrais
copier dans un seul fichier texte.

Exe: folder1text1.txt
folder1text2.txt
folder1text3.txt
folder1text5.txt
folder1text4.txt
folder1text6.txt
etc...

copier tous ces fichiers (le nombre total de fichiers est aléatoire) dans
folder1text.txt

Comment réaliser cela en vbscript?




La méthode FileCopy du FileSystemOBject ne permettant pas, à ma
connaissance, d'avoir plusieurs sources et une seule destination,
mais la commande COPY le permettant
(COPY Fic1+Fic2+Fic3 Fic), on peut faire un mix des deux.

Tu peux essayer ceci :

' -----------------------------------------------------
Option Explicit

CopyFiles

Sub CopyFiles()
Dim Fso, Fld, fi, ts, Rep, Cmd
Dim Wsh

Rep = "C:Folder1"
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Fld = Fso.GetFolder(Rep)

For Each fi In Fld.Files
If UCase(Left(fi.Name, 4)) = "TEXT" _
And UCase(Right(fi.Name, 3)) = "TXT" Then
Cmd = Cmd & Rep & "" & fi.Name & "+"
End If
Next

If Len(Cmd) > 0 Then
On Error Resume Next
Kill Rep & "Text.txt"
On Error GoTo 0
Set ts = Fso.CreateTextFile(Rep & "cp.bat", True)
ts.WriteLine "@Echo off"
Cmd = "Copy " & Left(Cmd, Len(Cmd) - 1) & " " & Rep & "Text.txt /B"
ts.WriteLine Cmd
ts.Close
Set ts = Nothing
Set Wsh = CreateObject("Wscript.Shell")
wsh.Run Rep & "cp.bat", 0, True
Set wsh = Nothing
Kill Rep & "cp.bat"
End If
Set Fld = Nothing
Set Fso = Nothing
End Sub


PS : il y a un forum dédié au scripting (vbs, bat, etc ...)
microsoft.public.fr.scripting

--
Cordialement,

Jacques.
Avatar
Yannick Bernollin
OK MErci
Je vais tester

"Jacques93" a écrit dans le message de news:

Bonjour Yannick Bernollin
Yannick Bernollin a écrit :
Bonjour,

Voici mon problème:
- J'ai une liste de fichiers texte de structure identique que je
voudrais copier dans un seul fichier texte.

Exe: folder1text1.txt
folder1text2.txt
folder1text3.txt
folder1text5.txt
folder1text4.txt
folder1text6.txt
etc...

copier tous ces fichiers (le nombre total de fichiers est aléatoire) dans
folder1text.txt

Comment réaliser cela en vbscript?




La méthode FileCopy du FileSystemOBject ne permettant pas, à ma
connaissance, d'avoir plusieurs sources et une seule destination,
mais la commande COPY le permettant
(COPY Fic1+Fic2+Fic3 Fic), on peut faire un mix des deux.

Tu peux essayer ceci :

' -----------------------------------------------------
Option Explicit

CopyFiles

Sub CopyFiles()
Dim Fso, Fld, fi, ts, Rep, Cmd
Dim Wsh

Rep = "C:Folder1"
Set Fso = CreateObject("Scripting.FileSystemObject")
Set Fld = Fso.GetFolder(Rep)

For Each fi In Fld.Files
If UCase(Left(fi.Name, 4)) = "TEXT" _
And UCase(Right(fi.Name, 3)) = "TXT" Then
Cmd = Cmd & Rep & "" & fi.Name & "+"
End If
Next

If Len(Cmd) > 0 Then
On Error Resume Next
Kill Rep & "Text.txt"
On Error GoTo 0
Set ts = Fso.CreateTextFile(Rep & "cp.bat", True)
ts.WriteLine "@Echo off"
Cmd = "Copy " & Left(Cmd, Len(Cmd) - 1) & " " & Rep & "Text.txt /B"
ts.WriteLine Cmd
ts.Close
Set ts = Nothing
Set Wsh = CreateObject("Wscript.Shell")
wsh.Run Rep & "cp.bat", 0, True
Set wsh = Nothing
Kill Rep & "cp.bat"
End If
Set Fld = Nothing
Set Fso = Nothing
End Sub


PS : il y a un forum dédié au scripting (vbs, bat, etc ...)
microsoft.public.fr.scripting

--
Cordialement,

Jacques.


Avatar
Gloops
Jacques93 a écrit :
La méthode FileCopy du FileSystemOBject ne permettant pas, à ma
connaissance, d'avoir plusieurs sources et une seule destination,
mais la commande COPY le permettant
(COPY Fic1+Fic2+Fic3 Fic), on peut faire un mix des deux.



Bonjour,

A propos de cette syntaxe, on peut noter au passage qu'elle peut servir
à modifier les date et heure du fichier, pour les mettre aux date et
heure du système.

On procède ainsi (en ligne de commandes) :
COPY TEST.TXT+,,

Le fichier Test.Txt conserve son contenu et est réputé avoir été modifié
à l'heure de la commande.

Toutefois, se méfier de cette possibilité dans le cas d'un fichier binaire.

Même si ça n'a qu'un rapport lointain avec la question, ça m'a paru
intéressant de le signaler.



Pour revenir à la question de mettre plusieurs fichiers les uns à la
suite des autres, je pense que ce que dit Jacques devrait faire
l'affaire, mais je pense aussi à une procédure écrite par ng pour
fractionner un fichier en plusieurs, il me semble qu'un algorithme
proche pourrait faire l'inverse.

http://groups.google.fr/group/microsoft.public.fr.vb/browse_thread/thread/56053a6dd752d529/7982c9171ef72065?lnk=st&q=%22'%2F%2Fattention+il+faut+mettre+un+%5C+%C3%A0+la+fin+des+chemins+de+r%C3%A9pertoire%22&rnum=1&hl=fr#7982c9171ef72065
Avatar
Gloops
Jacques93 a écrit :
For Each fi In Fld.Files
If UCase(Left(fi.Name, 4)) = "TEXT" _
And UCase(Right(fi.Name, 3)) = "TXT" Then
Cmd = Cmd & Rep & "" & fi.Name & "+"
End If
Next



Salut Jacques,

A propos, il ne faut pas oublier de se méfier :
- de la longueur de la ligne de commande
- de la longueur du chemin

Toutefois si on met plusieurs chemins à la suite sur une ligne de
commande, ça risque plus d'être la longueur de la ligne de commande qui
pose problème. Si tous les fichiers sont dans le même répertoire, ça
peut aider de le sélectionner avant la boucle (en utilisant ChDrive et
ChDir), et de ne mentionner que le nom du fichier dans la ligne de commande.


Une chose à prendre en compte aussi en utilisant des lignes de
commandes, c'est que les noms de fichiers, si ils comportent des
espaces, doivent être soit encadrés par des guillemets, soit convertis
en noms courts.

Si on utilise un nom court pour créer un nouveau fichier, peut-être
pourra-t-on avoir envie de le renommer ensuite.
Avatar
Jacques93
Bonjour Gloops,
Gloops a écrit :
Jacques93 a écrit :
For Each fi In Fld.Files
If UCase(Left(fi.Name, 4)) = "TEXT" _
And UCase(Right(fi.Name, 3)) = "TXT" Then
Cmd = Cmd & Rep & "" & fi.Name & "+"
End If
Next



Salut Jacques,

A propos, il ne faut pas oublier de se méfier :
- de la longueur de la ligne de commande
- de la longueur du chemin

Toutefois si on met plusieurs chemins à la suite sur une ligne de
commande, ça risque plus d'être la longueur de la ligne de commande qui
pose problème. Si tous les fichiers sont dans le même répertoire, ça
peut aider de le sélectionner avant la boucle (en utilisant ChDrive et
ChDir), et de ne mentionner que le nom du fichier dans la ligne de
commande.


Une chose à prendre en compte aussi en utilisant des lignes de
commandes, c'est que les noms de fichiers, si ils comportent des
espaces, doivent être soit encadrés par des guillemets, soit convertis
en noms courts.




Tes remarques sont tout à fait justifiées. Je suis parti des données
indiquées par Yannick Bernollin :

folder1text2.txt

etc ...

et n'ai indiqué qu'une des voies possibles. Tout est perfectible ;-)

HS : Sauf le CPE !!!



--
Cordialement,

Jacques.
Avatar
Gloops
Jacques93 a écrit :
HS : Sauf le CPE !!!



:)

(en général les émoticônes sont jaunes ; donc, rien à ajouter)