OVH Cloud OVH Cloud

Copie et renommage

22 réponses
Avatar
Luc Grangier
Bonjour,

J'aimerais en vbs copier un fichier à intervalle régulier vers un autre
répertoire en le renommant à chaque fois différemment pour éviter d'écraser
la copie précédente, afin d'avoir uen liste de fichiers de sauvegarde et non
1 seul fichier de sauvegarde.

Quelqu'un peut m'aider??
Merci d'avance

10 réponses

1 2 3
Avatar
Jacques Barathon [MS]
"Jean" wrote in message
news:
new-item -type directory $destination -ea SilentlyContinue


Ca c'est mieux :-)

Continuons.

On pourrait aussi remplacer

$now = [datetime]::now
$newname = $now.ToString("yyyyMMdd_HHmmss")

par

$newname = (get-date).ToString("yyyyMMdd_HHmmss")


Tout à fait. D'ailleurs, c'était ma première version, j'ai introduit la
variable $now pour faire un peu moins ésotérique.

Je n'ai pas le temps maintenant, mais une v2 pourrait inclure le nom du
fichier original en plus de la date et heure courante, par exemple:

macaveavin20060526_223500.mdb

Ce qui permettrait de faire une v3 qui accepterait plusieurs fichiers en
entrée:
copy-file.ps1 -source *.mdb -dest c:backups -i 3600

Jean, si tu as 5 minutes, sinon je m'y colle demain matin :-)

Jacques


Avatar
Jean
Tout à fait. D'ailleurs, c'était ma première version, j'ai introduit la
variable $now pour faire un peu moins ésotérique.


Je n'ai pas le temps maintenant, mais une v2 pourrait inclure le nom du
fichier original en plus de la date et heure courante, par exemple:

macaveavin20060526_223500.mdb



Je me demande si 20060526_223500macaveavins.mdb ne serait pas plus
agréable à consulter dans l'explorateur (c'est plus simple à mettre en
place aussi).


Ce qui permettrait de faire une v3 qui accepterait plusieurs fichiers en
entrée:
copy-file.ps1 -source *.mdb -dest c:backups -i 3600



J'aime assez cette idée de fichiers multiples :-)

Jean, si tu as 5 minutes, sinon je m'y colle demain matin :-)



Il faudra certainement vous y coller encore mais voici mes 5 eurocents
:-) :

# ---8<---
# copy-file.ps1
#
# copie un même fichier à intervalles réguliers
# en lui donnant la date et l'heure pour nouveau nom
#
# paramètres:
#
# source - chemin complet vers le fichier à copier
# destination - répertoire de destination
# interval - intervalle entre 2 copies (en secondes)

param (
[string]$source = $(throw "Et le fichier source?"),
[string]$destination = $(throw "Et la destination?"),
[int32]$interval = $(throw "Et l'intervalle en s.??")
)


do {
$strdate = (get-date).ToString("yyyyMMdd_HHmmss")
$sourcefiles = get-item $source
new-item -type directory $destination -ea SilentlyContinue
$sourcefiles|foreach{$newname=$strdate+$_.Name;copy-item $source
$destination$newname}
start-sleep $interval
} while ($true)
# ---8<---

Amicalement,

--
Jean - JMST
Belgium

Avatar
Jean
J'ai juste supprimé les variables intermédiaires en regroupant la
concaténation du nouveau nom au moment de la copie.


C'est moins chipo en effet.

Version avec format paramétrable plus tard ce week-end si le temps est à la
pluie :-)


Entre 2 rayons de soleil j'ai ajouté un paramètre facultatif qui permet
d'arrêter automatiquement après x secondes.

(new-timespan $starttime).TotalSeconds

pourrait être "remplacé" par

((get-date)-$starttime).TotalSeconds

# ---8<---
# copy-file.ps1
#
# copie une sélecion de fichiers à intervalles réguliers
# les copies portent date et heure en préfixe
#
# paramètres:
#
# source - chemin complet vers le fichier à copier
# destination - répertoire de destination
# interval - intervalle entre 2 copies (en secondes)

param (
[string]$source = $(throw "Et les fichiers source?"),
[string]$destination = $(throw "Et le répertoire de destination?"),
[int32]$interval = $(throw "Et l'intervalle en s.??"),
[int32]$exitafter # optionnel : quitter après x secondes
)

$starttime=get-date
do {
new-item -type directory $destination -ea SilentlyContinue
get-item $source | % {copy-item $_
($destination+""+(get-date).ToString("yyyyMMdd_HHmmss")+$_.Name)}
if($exitafter -and (new-timespan $starttime).TotalSeconds -gt
$exitafter-$interval){exit}
start-sleep $interval
} while ($true)
# ---8<---

Amicalement,

--
Jean - JMST
Belgium

Avatar
Jacques Barathon [MS]
"Jean" wrote in message
news:
J'ai juste supprimé les variables intermédiaires en regroupant la
concaténation du nouveau nom au moment de la copie.


C'est moins chipo en effet.

Version avec format paramétrable plus tard ce week-end si le temps est à
la pluie :-)


Entre 2 rayons de soleil j'ai ajouté un paramètre facultatif qui permet
d'arrêter automatiquement après x secondes.


Excellent! J'étais sur le point de poster la dernière version sur mon blog,
je vais intégrer ce paramètre.

Jacques


Avatar
Jacques Barathon [MS]
Pour info, le script est dispo dans sa dernière version sur mon blog:
http://spaces.msn.com/janel/blog/cns!9B5AA3F6FA0088C2!163.entry

Merci Jean pour le coup de main.

Jacques

"Jacques Barathon [MS]" wrote in message
news:
"Jean" wrote in message
news:
J'ai juste supprimé les variables intermédiaires en regroupant la
concaténation du nouveau nom au moment de la copie.


C'est moins chipo en effet.

Version avec format paramétrable plus tard ce week-end si le temps est à
la pluie :-)


Entre 2 rayons de soleil j'ai ajouté un paramètre facultatif qui permet
d'arrêter automatiquement après x secondes.


Excellent! J'étais sur le point de poster la dernière version sur mon
blog, je vais intégrer ce paramètre.

Jacques






Avatar
Jean
http://spaces.msn.com/janel/blog/cns!9B5AA3F6FA0088C2!163.entry


Salut Jacques, belles explications :-)

Comme retour :

Il manque
[int32]$exitafter,
dans le bloc param

et le bloc

default {
throw '"pre", "post" et "none" sont les seules valeurs possibles
pour -nameposition!'
}

ne sera amha jamais exécuté parcequ'il y a une valeur par défaut "pre"
pour ce paramètre facultatif.

Comme suggestion :

il serait peut être bien d'indiquer que si on respecte l'ordre des
paramètres on peut se passer des commutateurs, par ex. :

copy-file.ps1 c:textes*.txt d:oldtextes 10 60

fonctionnera si le script est écrit comme ci-dessous :

# ---8<---
param (
[string]$source = $(throw "Et les fichiers source?"),
[string]$target = $(throw "Et le dossier cible?"),
[int32]$wait = $(throw "Et le temps d'attente en s.??"),
#++++++++++++++++++
[int32]$exitafter,
#++++++++++++++++++
[string]$nameposition = "pre",
[string]$dateformat = "yyyyMMdd_HHmmss",
[switch]$nodate
)

$starttime = get-date
do {
new-item -type directory $target -ea SilentlyContinue
foreach ($sourcefile in (get-item $source)) {
$copyname = $sourcefile.Name
if (!$nodate) {
switch ($nameposition) {
"pre" {
$sourcefile.Name -match "(?<name>.*)." >$nul
$copyname =
$matches["name"]+(get-date).ToString($dateformat)+$sourcefile.Extension
}
"post" {
$copyname = (get-date).ToString($dateformat)+$sourcefile.Name
}
"none" {
$copyname = (get-date).ToString($dateformat)+$sourcefile.Extension
}
#------------------
#default {
# throw '"pre", "post" et "none" sont les seules valeurs possibles
pour -nameposition!'
#}
#------------------
}
}
copy-item $sourcefile ($target+""+$copyname)
}
if (((get-date) - $starttime).TotalSeconds -gt $exitafter - $interval)
{exit}
start-sleep $wait
} while ($true)
# ---8<---

Amicalement,

--
Jean - JMST
Belgium

Avatar
Jean
et le bloc

default {
throw '"pre", "post" et "none" sont les seules valeurs possibles pour
-nameposition!'
}

ne sera amha jamais exécuté parcequ'il y a une valeur par défaut "pre" pour
ce paramètre facultatif.


oups non ... je retire ce que j'ai dit :-)
Ca s'exécutera si on passe un paramètre erronné.

--
Jean - JMST
Belgium

Avatar
Jacques Barathon [MS]
"Jean" wrote in message
news:
http://spaces.msn.com/janel/blog/cns!9B5AA3F6FA0088C2!163.entry


Salut Jacques, belles explications :-)

Comme retour :

Il manque
[int32]$exitafter,
dans le bloc param


Bien vu! Ca m'apprendra à avoir plusieurs versions d'un même script ouvertes
en même temps...

et le bloc

default {
throw '"pre", "post" et "none" sont les seules valeurs possibles
pour -nameposition!'
}

ne sera amha jamais exécuté parcequ'il y a une valeur par défaut "pre"
pour ce paramètre facultatif.


Voir ton propre correctif... :-) Ce bloc est utile pour avertir
l'utilisateur si une autre valeur est saisie.

Comme suggestion :

il serait peut être bien d'indiquer que si on respecte l'ordre des
paramètres on peut se passer des commutateurs, par ex. :

copy-file.ps1 c:textes*.txt d:oldtextes 10 60


Bonne idée. Je vais mettre à jour mes explications en même temps que je
corrigerai le défaut d'exitafter.

Merci,
Jacques


Avatar
Méta-MCI
Bonsoir !


J'arrive après la bataille (la faute à la Belgique et à ses travaux
perpétuels sur les autoroutes).

Mais, voici une version Batch :

::copie-reguliere.bat fichier intervalle heure_de_fin
@echo off
setlocal
set /Anum00
:LOOP
set /Anum=num+1
sleepm %2000
copy %1 C:SAUVEFICHIER.%num:~1,3% /Y >null
if /I %time% LSS %3 goto :LOOP
endlocal


Utilisation :
copie-reguliere "fichier a.copier" 60 20:30

Cela copiera le fichier "fichier a.copier" (guillemets car espace) toutes
les 60 secondes, et jusqu'à 20h.30
La copie sera faite dans C:SAUVE sous les noms FICHIER.001 FICHIER.002
FICHIER.003 etc.

Évidemment, c'est moins compliqué qu'en PowerShell ; mais, dans le sud, on
préfère les choses simples et pragmatiques ;-))


Michel Claveau
Avatar
Méta-MCI
Re !


Une alternative intéressante serait d'utiliser robocopy.

Exemple :
c:robocopy . C:SAUVE "fichier a copier.txt" FICHIER.BAK /MON:1
/MOT:1


Copiera le fichier, mais seulement s'il a changé. Un test est faite à chaque
minute (/MOT:1). Ici aussi, il faudra arrêter par Ctrl-C

Bon, l'exemple est simpliste. Mais, rien n'interdit d'extrapoler.


@-salutations

Michel Claveau
1 2 3