IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

VBScript Discussion :

Déplacement dossier + Rename avec incrément s'il existe


Sujet :

VBScript

  1. #1
    Nouveau membre du Club
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    36
    Détails du profil
    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut Déplacement dossier + Rename avec incrément s'il existe
    Bonjour à tous !

    J'ai un petit soucis de création de VBS qui ne paraitra que broutille pour la plupart d'entre vous...

    J'ai le besoin de déplacer des fichiers et dossiers automatiquement d'un dossier à un autre.
    Précision, les noms des fichiers et dossiers déposé dans le répertoire source ne sont pas connus (il s'agit d'un FTP).

    Bien entendu, si le fichier ou dossier existe déjà dans la destination, le besoin est de le renommer en incrémentant un numéro de type "_01", "_02", etc...
    Je ne suis pas très doué en VBS mais je bidouille un peu et en glanant de ci de là des morceaux de scripts, j'ai réussi à obtenir à peu près ce que je voulais.
    La seule chose qui me manque aujourd'hui est l'incrément pour les dossiers !

    Cela fonctionne pour les fichiers mais je n'y parviens pas pour les dossiers...
    Résultat, les dossiers déposé dans la source et qui existent déjà dans la destination sont déplacé mais écrasent les existants...

    Je suppose que ce n'est pas sorcier mais je ne trouve pas le moyen de le faire marcher.

    Pourrais-t-on m'aider svp ?

    Par ailleurs, si vous trouvez moyen, de votre oeil d'expert, de simplifier ce script constitué surement inutilement de plusieurs sections (traitement fichiers, puis dossiers, etc...), je suis preneur.

    Merci d'avance à qui voudra bien m'aider.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    Const cnMax = 99
     
      Dim goFS    : Set goFS    = CreateObject("Scripting.FileSystemObject")
     
      Dim oSrcDir : Set oSrcDir = goFS.GetFolder("\\SERVEUR\Dossier\Source")
      Dim sDstDir : sDstDir     = "\\SERVEUR\Dossier\Destination"
      Dim oFile, nInc, sNFSpec
      For Each oFile In oSrcDir.Files
          nInc    = 0
          sNFSpec = getNewFSpec(oFile.Name, sDstDir, nInc)
          Do While goFS.FileExists(sNFSpec) And nInc <= cnMax
             sNFSpec = getNewFSpec(oFile.Name, sDstDir, nInc)
          Loop
          If nInc > cnMax Then
     
          Else
     
             oFile.Move sNFSpec
          End If
      Next
     
      Set FSO = CreateObject("scripting.FileSystemObject")
     
        For Each item In oSrcDir.SubFolders
    		FSO.CopyFolder oSrcDir, sDstDir, True
    		FSO.DeleteFolder "\\SERVEUR\Dossier\Source\*", True
      Next
     
    Function getNewFSpec(ByVal sFName, sDstDir, ByRef nInc)
      If 0 < nInc Then
         Dim sSfx
         sSfx = goFS.GetExtensionName(sFName)
         If "" <> sSfx Then sSfx = "." & sSfx
         sSfx = "_" & Right("00" & nInc, 2) & sSfx
         sFName = goFS.GetBaseName(sFName) & sSfx
      End If
      nInc        = nInc + 1
      getNewFSpec = goFS.BuildPath(sDstDir, sFName)
    End Function

  2. #2
    Nouveau membre du Club
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    36
    Détails du profil
    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Personne n'a la moindre petite idée svp ?

  3. #3
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Seine Saint Denis (Île de France)

    Informations professionnelles :
    Activité : Responsable déploiement (SCCM, InTune, GPO)
    Secteur : Transports

    Informations forums :
    Inscription : Juillet 2014
    Messages : 3 183
    Points : 5 754
    Points
    5 754
    Par défaut
    Voici comment j'aurai fait.

    Code vbs : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    src = "\\SERVEUR\Dossier\Source"
    dst = "\\SERVEUR\Dossier\Destination"
     
    set fso = CreateObject("Scripting.FileSystemObject")
    set oDst = fso.GetFolder(src)
     
    For Each oFile In oDst.Files
    	newFileName = GetNewFileName(oFile.Name, dst)
    	oFile.Move(dst & "\" & newFileName)
    Next
     
    For Each oFolder In oDst.SubFolders
    	newFolderName = GetNewFolderName(oFolder.Name, dst)
    	oFolder.Move(dst & "\" & newFolderName)
    Next
    wscript.quit
     
    ' Trouve un nom de fichier dans le dossier folder
    Function GetNewFileName(originalName, folder)
    	base = fso.GetBaseName(originalName)
    	extension = fso.GetExtensionName(originalName)
    	If (extension <> "") Then extension = "." + extension
    	newName = fso.GetFileName(originalName)
     
    	cnt = 1
    	While (fso.FileExists(folder & "\" & newName) Or fso.FolderExists(folder & "\" & newName))
    		cnt = cnt + 1
    		newName = base & " (" & cnt & ")" & extension
    	Wend
     
    	GetNewFileName = newName
    End Function
     
    ' Trouve un nom de dossier dans le dossier folder
    Function GetNewFolderName(originalName, folder)
    	originalName = fso.GetFileName(originalName)
    	newName = originalName
     
    	cnt = 1
    	While (fso.FileExists(folder & "\" & newName) Or fso.FolderExists(folder & "\" & newName))
    		cnt = cnt + 1
    		newName = originalName & " (" & cnt & ")"
    	Wend
     
    	GetNewFolderName = newName
    End Function

    PS : L'incrémentation de nom de fichier retenue est celle de Windows 7.

  4. #4
    Nouveau membre du Club
    Administrateur systèmes et réseaux
    Inscrit en
    Avril 2013
    Messages
    36
    Détails du profil
    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Avril 2013
    Messages : 36
    Points : 26
    Points
    26
    Par défaut
    Salut !

    Merci mille fois pour ce script bien plus propre que le mien !

    Problème, la partie sur le déplacement des dossiers ne fonctionne pas : "Permission refusée".
    En fait, il s'agit du déplacement de dossiers d'un serveur A à un serveur B...
    Après quelques recherches, visiblement, ce type de déplacement n'est pas autorisé entre différents serveurs.

    J'ai vainement tenté de mapper des lecteurs réseaux pour déplacer les dossiers via des chemins d'accès locaux plutôt qu'UNC, toujours rien...

    En fait, visiblement la seule option est un Copy/Delete du dossier...
    Du coup, un check pour voir si un dossier du même nom existe dans la destination, puis, si tel est le cas, un renommage du dossier avec un incrément avant de le Copy/Delete...

    J'ai retouché ton script pour obtenir ça, pour ceux que ça intéresse :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    On Error Resume Next
     
    src = "\\SERVEUR_A\Dossier\Source"
    dst = "\\SERVEUR_B\Dossier\Destination"
     
    set fso = CreateObject("Scripting.FileSystemObject")
    set oDst = fso.GetFolder(src)
     
    For Each oFile In oDst.Files
    	newFileName = GetNewFileName(oFile.Name, dst)
    	oFile.Move(dst & "\" & newFileName)
    Next
     
    For Each oFolder In oDst.SubFolders
    	newFolderName = GetNewFolderName(oFolder.Name, dst)
    	If fso.FolderExists (dst & "\" & oFolder.Name) Then
    		Set oNet = CreateObject("WScript.Network")
    		oNet.MapNetworkDrive "S:", src
    		oNet.MapNetworkDrive "T:", dst
    		fso.MoveFolder ("S:\" & oFolder.Name), ("S:\" & newFolderName)
    		fso.CopyFolder src, dst, True
    		fso.DeleteFolder (src & "\*"), True
    		oNet.RemoveNetworkDrive "S:", True
    		oNet.RemoveNetworkDrive "T:", True
    	Else
    		fso.CopyFolder src, dst, True
    		fso.DeleteFolder (src & "\*"), True
    	End If
    Next
    wscript.quit
     
    ' Trouve un nom de fichier dans le dossier folder
    Function GetNewFileName(originalName, folder)
    	base = fso.GetBaseName(originalName)
    	extension = fso.GetExtensionName(originalName)
    	If (extension <> "") Then extension = "." + extension
    	newName = fso.GetFileName(originalName)
     
    	cnt = 1
    	While (fso.FileExists(folder & "\" & newName) Or fso.FolderExists(folder & "\" & newName))
    		cnt = cnt + 1
    		newName = base & " (" & cnt & ")" & extension
    	Wend
     
    	GetNewFileName = newName
    End Function
     
    ' Trouve un nom de dossier dans le dossier folder
    Function GetNewFolderName(originalName, folder)
    	originalName = fso.GetFileName(originalName)
    	newName = originalName
     
    	cnt = 1
    	While (fso.FileExists(folder & "\" & newName) Or fso.FolderExists(folder & "\" & newName))
    		cnt = cnt + 1
    		newName = originalName & " (" & cnt & ")"
    	Wend
     
    	GetNewFolderName = newName
    End Function
    Ça doit pouvoir être perfectible, mais ça marche !

    Merci beaucoup ericlm128, tu as bien fait avancer mon problème pour permettre de le résoudre complètement !

    Résolu, encore merci !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 2
    Dernier message: 25/05/2014, 17h40
  2. Déplacement dossiers en VBS avec variable user
    Par enermax31 dans le forum VBScript
    Réponses: 2
    Dernier message: 12/09/2013, 15h00
  3. Déplacement de fichier avec rename
    Par laurentSc dans le forum Langage
    Réponses: 27
    Dernier message: 10/05/2010, 13h28
  4. Variante de TUpDown avec incrément réel
    Par Bernard Grosdoy dans le forum Composants VCL
    Réponses: 6
    Dernier message: 20/10/2004, 16h40
  5. Update ou insert avec incrément d'un champ
    Par dany13 dans le forum ASP
    Réponses: 5
    Dernier message: 15/10/2004, 12h53

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo