OVH Cloud OVH Cloud

connaitre le bon fichier

10 réponses
Avatar
berthelagrandepatte
Bonjour

J'ai une liste de fichiers(environ une dizaine mais cela peut varier entre 8
et 14) dans un repertoire qui se nomme quasiment de la mème facon
:fichier.txt, fichier1.txt, fichier2.txt..... Ils nous arrivent tous
simultanément dans ce répertoire. Dans le contenu de ces fichiers, il y a
plusieurs lignes avec la date jj/mm/aaaa.
Parmi ces fichiers, je ne dois transférer que le fichier qui a la date du
jour. A savoir que le nom de ce fichier ne fait pas référence à la date.

J'ai commencé a ecrire un script en batch mais je me trouve bloqué à un
endroit.

------------------------------------------------------------------------------------------
@echo off

for /f "tokens=1-3 delims=/" %%f in ("%date%") do (
set datation=%%f/%%g/%%h
set jour=%%f
set mois=%%g
set année=%%h)

Findstr %datation% fichier*.txt >nul
-----------------------------------------------------------------------------------------
Ma démarche était donc de trouver la date dans le contenu fichier par
findstr et ensuite de connaitre le nom précis du fichier dans lequel se
trouve la date du jour. Après connaissance de ce dernier, transfert vers un
autre répertoire.

Une autre idée était de copier le contenu du fichier repérer vers unfichier
temporaire que j'aurai renommé ensuite en utilisant getlines et lmod mais
sachant que le nombre de ligne est variable, ceci complique un peu les choses.

Si vous avez des idées soit en batch ou vbscript, sachant que cela m'est
égal, n'hésitez pas.
Je precise une nouvelle fois que je ne peux trouver le bon fichier que par
la date contenu dans le fichier et non par son nom, sa taille ou l'heure.

10 réponses

Avatar
Méta-MCI
Bonjour !

Est-ce la date du fichier lui-même est utilisable ?

Si oui, le batch suivant donne le nom du fichier .txt le plus récent :

@echo off
FOR /F "usebackq" %%A IN (`DIR *.txt /B /OD`) DO set FICHIER=%%A
echo %FICHIER%

Si la date du fichier n'est pas utilisable, il faudra faire autrement. Mais
il faudra alors détailler un peu plus (genre format de date enregistrée,
séparateurs, etc.)

@+

MCI
Avatar
Georges
Bonjour,
Voici un petit script permettant de faire ce que vous désirez

Dim fso, fsofolder, collec_file, fic_file, fichier, contenu, v_date

v_date = left(now,10)

Set fso = CreateObject("Scripting.FileSystemObject")
Set fsofolder = fso.GetFolder("c:tutu")
Set collec_file = fsofolder.Files
For Each fic_file in collec_file
msgbox fic_file.name
Set fichier = fso.OpenTextFile(fic_file.name, 1)
contenu = fichier.ReadAll
fichier.close
if instr(contenu,v_date) > 0 then
fso.copyfile fic_file.name, "c:tata"
end if
Next

Cordialement
Georges


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

Bonjour

J'ai une liste de fichiers(environ une dizaine mais cela peut varier entre
8
et 14) dans un repertoire qui se nomme quasiment de la mème facon
:fichier.txt, fichier1.txt, fichier2.txt..... Ils nous arrivent tous
simultanément dans ce répertoire. Dans le contenu de ces fichiers, il y a
plusieurs lignes avec la date jj/mm/aaaa.
Parmi ces fichiers, je ne dois transférer que le fichier qui a la date du
jour. A savoir que le nom de ce fichier ne fait pas référence à la date.

J'ai commencé a ecrire un script en batch mais je me trouve bloqué à un
endroit.

------------------------------------------------------------------------------------------
@echo off

for /f "tokens=1-3 delims=/" %%f in ("%date%") do (
set datation=%%f/%%g/%%h
set jour=%%f
set mois=%%g
set année=%%h)

Findstr %datation% fichier*.txt >nul
-----------------------------------------------------------------------------------------
Ma démarche était donc de trouver la date dans le contenu fichier par
findstr et ensuite de connaitre le nom précis du fichier dans lequel se
trouve la date du jour. Après connaissance de ce dernier, transfert vers
un
autre répertoire.

Une autre idée était de copier le contenu du fichier repérer vers
unfichier
temporaire que j'aurai renommé ensuite en utilisant getlines et lmod mais
sachant que le nombre de ligne est variable, ceci complique un peu les
choses.

Si vous avez des idées soit en batch ou vbscript, sachant que cela m'est
égal, n'hésitez pas.
Je precise une nouvelle fois que je ne peux trouver le bon fichier que par
la date contenu dans le fichier et non par son nom, sa taille ou l'heure.


Avatar
Jacques Barathon [MS]
"Georges" <georges.maurel_at_free.fr> wrote in message
news:On%
Bonjour,
Voici un petit script permettant de faire ce que vous désirez

Dim fso, fsofolder, collec_file, fic_file, fichier, contenu, v_date

v_date = left(now,10)

Set fso = CreateObject("Scripting.FileSystemObject")
Set fsofolder = fso.GetFolder("c:tutu")
Set collec_file = fsofolder.Files
For Each fic_file in collec_file
msgbox fic_file.name
Set fichier = fso.OpenTextFile(fic_file.name, 1)
contenu = fichier.ReadAll
fichier.close
if instr(contenu,v_date) > 0 then
fso.copyfile fic_file.name, "c:tata"
end if
Next

Cordialement
Georges


En batch, on peut faire ainsi:

--- couper ici ---
for %%f in (c:tutu*.txt) do findstr /m %date% "%%f" >>
c:tutufichiers.log
for /f "delims=:" %%f in (c:tutufichiers.log) do copy "%%f" c:tata
del fichiers.log
--- couper ici ---

Pour pouvoir gérer le cas où des noms de fichiers comporteraient des
espaces, j'ai mis les variables entre guillemets et j'ai remplacé l'espace
(délimiteur par défaut dans une boucle "for /f") par le signe ":" qu'on ne
risque pas de trouver dans un nom de fichier bien formé.

Jacques

Avatar
Georges
Bonjour M Barathon,
Je pense que votre solution conviendra mieux que la mienne vu qu'il avait
déjà fait un bout de batch et qui plus est, votre solution est plus concise.

Cordialement
Georges

"Jacques Barathon [MS]" a écrit dans le
message de news:
"Georges" <georges.maurel_at_free.fr> wrote in message
news:On%
Bonjour,
Voici un petit script permettant de faire ce que vous désirez

Dim fso, fsofolder, collec_file, fic_file, fichier, contenu, v_date

v_date = left(now,10)

Set fso = CreateObject("Scripting.FileSystemObject")
Set fsofolder = fso.GetFolder("c:tutu")
Set collec_file = fsofolder.Files
For Each fic_file in collec_file
msgbox fic_file.name
Set fichier = fso.OpenTextFile(fic_file.name, 1)
contenu = fichier.ReadAll
fichier.close
if instr(contenu,v_date) > 0 then
fso.copyfile fic_file.name, "c:tata"
end if
Next

Cordialement
Georges


En batch, on peut faire ainsi:

--- couper ici ---
for %%f in (c:tutu*.txt) do findstr /m %date% "%%f" >>
c:tutufichiers.log
for /f "delims=:" %%f in (c:tutufichiers.log) do copy "%%f" c:tata
del fichiers.log
--- couper ici ---

Pour pouvoir gérer le cas où des noms de fichiers comporteraient des
espaces, j'ai mis les variables entre guillemets et j'ai remplacé l'espace
(délimiteur par défaut dans une boucle "for /f") par le signe ":" qu'on ne
risque pas de trouver dans un nom de fichier bien formé.

Jacques




Avatar
Jacques Barathon [MS]
"Jacques Barathon [MS]" wrote in message
news:
<snip>
En batch, on peut faire ainsi:

--- couper ici ---
for %%f in (c:tutu*.txt) do findstr /m %date% "%%f" >>
c:tutufichiers.log
for /f "delims=:" %%f in (c:tutufichiers.log) do copy "%%f" c:tata
del fichiers.log
--- couper ici ---

Pour pouvoir gérer le cas où des noms de fichiers comporteraient des
espaces, j'ai mis les variables entre guillemets et j'ai remplacé l'espace
(délimiteur par défaut dans une boucle "for /f") par le signe ":" qu'on ne
risque pas de trouver dans un nom de fichier bien formé.


Et puisque Michel n'ose pas le demander mais meurt d'envie de savoir, voici
une version possible avec Monad:

dir c:tutu*.txt | where {(type($_)) -match
[datetime]::today.toShortDateString()} | foreach {copy $_ c:tata}

Le tout tient sur une seule ligne. Dommage que la formule permettant
d'obtenir la date au format court (jj/mm/aaaa) soit un peu longue.

Ce que j'aime bien avec Monad, c'est qu'une fois qu'on a adopté la bonne
tournure d'esprit il est très facile de concevoir un enchaînement de
commandes comme ci-dessus. En gros, le raisonnement de départ est:

"Je liste tous les fichiers texte de c:tutu, je vérifie si dans leur
contenu il y a la date courante, et pour chaque fichier qui est ok je le
copie dans c:tata".

Jacques

Avatar
berthelagrandepatte

Bonjour M Barathon,
Je pense que votre solution conviendra mieux que la mienne vu qu'il avait
déjà fait un bout de batch et qui plus est, votre solution est plus concise.

Cordialement
Georges

"Jacques Barathon [MS]" a écrit dans le
message de news:
"Georges" <georges.maurel_at_free.fr> wrote in message
news:On%
Bonjour,
Voici un petit script permettant de faire ce que vous désirez

Dim fso, fsofolder, collec_file, fic_file, fichier, contenu, v_date

v_date = left(now,10)

Set fso = CreateObject("Scripting.FileSystemObject")
Set fsofolder = fso.GetFolder("c:tutu")
Set collec_file = fsofolder.Files
For Each fic_file in collec_file
msgbox fic_file.name
Set fichier = fso.OpenTextFile(fic_file.name, 1)
contenu = fichier.ReadAll
fichier.close
if instr(contenu,v_date) > 0 then
fso.copyfile fic_file.name, "c:tata"
end if
Next

Cordialement
Georges


En batch, on peut faire ainsi:

--- couper ici ---
for %%f in (c:tutu*.txt) do findstr /m %date% "%%f" >>
c:tutufichiers.log
for /f "delims=:" %%f in (c:tutufichiers.log) do copy "%%f" c:tata
del fichiers.log
--- couper ici ---

Pour pouvoir gérer le cas où des noms de fichiers comporteraient des
espaces, j'ai mis les variables entre guillemets et j'ai remplacé l'espace
(délimiteur par défaut dans une boucle "for /f") par le signe ":" qu'on ne
risque pas de trouver dans un nom de fichier bien formé.

Jacques




Merci pour toutes ces propositions. Je reviens vers vous et plus précisement vers Mr Barathon car j'ai adopté sa solution.
J'ai juste une précision à apporter + un petit soucis lors de l'execution du

script.

Je commence par le pb de script : quand il execute la ligne
for /f "delims=:" %%e in (c:fichiers.log) do copy "%%e" c: et plus
précisément au moment de la copie, il remplace %%e par "c" en précisant que
ce fichier est inexistant. ce qui est normal.

Pour les précisions :
le script s'execute sur une machine Wndows2000 pro et non XP donc j'ai du
modifier le script pour l'affichage de la date et ce n'est pas la date du
jour mais la date du jour-1(jour précédent). Petite précision que j'ai plus
tard.

Que dois je faire pour avoir la date du jour précedent?
Ou se situe le pb lors de la copie du fichier ?

Voici le script modifié
------------------------------------------------------
@echo on

set jour=%date:~5,2%
set mois=%date:~8,2%
set annee=%date:~11,4%
set ndate=%jour%%mois%%annee%

for /f "tokens=1-3 delims= " %%f in ("%ndate%") do (
set datation=%%f/%%g/%%h
set jour=%%f
set mois=%%g
set année=%%h)

for %%e in (c:toutfichier*.txt) do findstr /m %datation% "%%e" >>
c:fichiers.log
for /f "delims=:" %%e in (c:fichiers.log) do copy "%%e" c:
del c:fichiers.log

-------------------------------------------------------------

Merci pour vos réponses



Avatar
Jacques Barathon [MS]
"berthelagrandepatte" wrote
in message news:
<snip>
Je commence par le pb de script : quand il execute la ligne
for /f "delims=:" %%e in (c:fichiers.log) do copy "%%e" c: et plus
précisément au moment de la copie, il remplace %%e par "c" en précisant
que
ce fichier est inexistant. ce qui est normal.


Euh... Pour une raison qui m'échappe, fichiers.log semble contenir le chemin
complet d'accès aux fichiers (c:toutfichierxxx.txt). Comme j'ai mis ":"
comme délimiteur, la commande passe donc ce qui précède ":", c'est-à-dire
"c". Il faut donc mettre un autre délimiteur, par exemple "/" (là, il
faudrait faire très fort pour avoir ce caractère dans le chemin complet).

Pour les précisions :
le script s'execute sur une machine Wndows2000 pro et non XP donc j'ai du
modifier le script pour l'affichage de la date et ce n'est pas la date du
jour mais la date du jour-1(jour précédent). Petite précision que j'ai
plus
tard.


Alors là, ça se complique... Je ne crois pas qu'on puisse facilement faire
des opérations d'addition et encore moins de soustraction sur des variables
en ligne de commande. Il faudrait en plus tenir compte des changements de
mois voire d'année (par exemple, la veille du 01/01/2006 est le 31/12/2005),
et autres problèmes d'années bissextiles.

Bref, il vaudrait mieux revenir à la solution en vbs (ou éventuellement en
Monad :-) ) pour pouvoir faire des calculs sur la date du jour. Par exemple,
dans le script de Georges (voir sa réponse de 15h23) il suffit de remplacer
la ligne où il assigne la date du jour à la variable v_date:

v_date = date -1

Aujourd'hui, 17/02/2006, cela me retourne bien "16/02/2006". Pour tester les
changements de mois, j'ai essayé en faisant "date -17", ça me donne bien
"31/01/2006", donc à priori ça devrait rouler.

Jacques

Avatar
berthelagrandepatte
J'ai suivi vos conseils et j'ai donc utilié le script de georges en modifiant
eux trois choses et il fonctionne bien a part un petit détail. Ci dessus mon
script:

-------------------------------
Option Explicit

Dim fso, fsofolder, collec_file, fic_file, fichier, cont, v_date, WshNetwork
v_date = Date-1
Const OverwriteExisting = True

Set fsofolder = fso.GetFolder("d:archive")
Set collec_file = fsofolder.Files
For Each fic_file In collec_file

Set fso = CreateObject("Scripting.FileSystemObject")
fso.CopyFile "d:toutscriptscript_maehduryyaa*.txt" , "d:Archive" ,
OverwriteExisting


Set fichier = fso.OpenTextFile(fic_file.name, 1)
cont = fichier.ReadAll
fichier.close
if instr(cont,v_date) > 0 Then
fso.movefile fic_file.name, "d:archivecoucou.txt"
end If

If fso.FileExists ("d:archivecoucou.txt") Then
fso.CopyFile "d:archivecoucou.txt" , "c:dgn"
End If

Next
---------------------------------------------------------------------
Mon problème se situe à la fin du script, à la copie du fichier coucou.txt
en vérifiant qu'il existe bien au préalable. Si je spécifie la racine c:
comme destination, la copie se fait bien.
Si je spécifie c:toto par exemple et quelque soit le nom du repertoire, le
script m'indique une erreur permission refusée. Les droits sur les
repertoires sont correctes.
Si vous avez une idée

merci


"Jacques Barathon [MS]" wrote in message
news:
<snip>
En batch, on peut faire ainsi:

--- couper ici ---
for %%f in (c:tutu*.txt) do findstr /m %date% "%%f" >>
c:tutufichiers.log
for /f "delims=:" %%f in (c:tutufichiers.log) do copy "%%f" c:tata
del fichiers.log
--- couper ici ---

Pour pouvoir gérer le cas où des noms de fichiers comporteraient des
espaces, j'ai mis les variables entre guillemets et j'ai remplacé l'espace
(délimiteur par défaut dans une boucle "for /f") par le signe ":" qu'on ne
risque pas de trouver dans un nom de fichier bien formé.


Et puisque Michel n'ose pas le demander mais meurt d'envie de savoir, voici
une version possible avec Monad:

dir c:tutu*.txt | where {(type($_)) -match
[datetime]::today.toShortDateString()} | foreach {copy $_ c:tata}

Le tout tient sur une seule ligne. Dommage que la formule permettant
d'obtenir la date au format court (jj/mm/aaaa) soit un peu longue.

Ce que j'aime bien avec Monad, c'est qu'une fois qu'on a adopté la bonne
tournure d'esprit il est très facile de concevoir un enchaînement de
commandes comme ci-dessus. En gros, le raisonnement de départ est:

"Je liste tous les fichiers texte de c:tutu, je vérifie si dans leur
contenu il y a la date courante, et pour chaque fichier qui est ok je le
copie dans c:tata".

Jacques








Avatar
Jacques Barathon [MS]
"berthelagrandepatte" wrote
in message news:
J'ai suivi vos conseils et j'ai donc utilié le script de georges en
modifiant
eux trois choses et il fonctionne bien a part un petit détail. Ci dessus
mon
script:
<snip>

If fso.FileExists ("d:archivecoucou.txt") Then
fso.CopyFile "d:archivecoucou.txt" , "c:dgn"
End If
<snip>

Mon problème se situe à la fin du script, à la copie du fichier
coucou.txt
en vérifiant qu'il existe bien au préalable. Si je spécifie la racine c:
comme destination, la copie se fait bien.
Si je spécifie c:toto par exemple et quelque soit le nom du repertoire,
le
script m'indique une erreur permission refusée. Les droits sur les
repertoires sont correctes.
Si vous avez une idée


Ajoutez un "" à la fin de chemin de destination, comme par exemple:

fso.CopyFile "d:archivecoucou.txt", "c:dgn"

Sans le "" final, CopyFile considère c:dgn comme un fichier dans lequel il
doit copier le contenu de coucou.txt, ce qui évidemment n'est pas possible
puisque c:dgn est un répertoire.

Jacques

Avatar
berthelagrandepatte
Merci pour cette précision.
J'ai modifié et testé hier soir le petit paramètre manquant et cela change
tout.
mon script fonctionne bien sur Windows Xp mais moins bien sur Windows 2000
car c'est sur windows 2000 pro qu'il doit fonctionner. il bloque à la ligne
"Set fichier = fso.OpenTextFile(fic_file.name,1)" en precisant "fichier
introuvable".Quand il analyse le contenu du repertoire, il voit bien le
premier fichier du repertoire et puis suite au "next" il plante à la ligne
citée plus haut et affiche le message d'erreur. Les versios de wsh sont
identiques.

je ne comprend ce qui se passe.

Merci de vos réponses lumineuses


"berthelagrandepatte" wrote
in message news:
J'ai suivi vos conseils et j'ai donc utilié le script de georges en
modifiant
eux trois choses et il fonctionne bien a part un petit détail. Ci dessus
mon
script:
<snip>

If fso.FileExists ("d:archivecoucou.txt") Then
fso.CopyFile "d:archivecoucou.txt" , "c:dgn"
End If
<snip>

Mon problème se situe à la fin du script, à la copie du fichier
coucou.txt
en vérifiant qu'il existe bien au préalable. Si je spécifie la racine c:
comme destination, la copie se fait bien.
Si je spécifie c:toto par exemple et quelque soit le nom du repertoire,
le
script m'indique une erreur permission refusée. Les droits sur les
repertoires sont correctes.
Si vous avez une idée


Ajoutez un "" à la fin de chemin de destination, comme par exemple:

fso.CopyFile "d:archivecoucou.txt", "c:dgn"

Sans le "" final, CopyFile considère c:dgn comme un fichier dans lequel il
doit copier le contenu de coucou.txt, ce qui évidemment n'est pas possible
puisque c:dgn est un répertoire.

Jacques