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 :

Script déplacement données perso


Sujet :

VBScript

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 38
    Par défaut Script déplacement données perso
    Bonjour,

    Je suis en train de mettre au point un script destiné à effectuer automatiquement le déplacement vers une autre partition des répertoires de données personnelles (documents, images, etc.) que Windows crée par défaut dans C:\Utilisateurs\nom_utilisateur. Il est sensé fonctionner pour toutes les versions à partir de Wndows 7. Comme il est peu gros j'ai mis le code ici.

    Tout se passe bien sauf pour le répertoire "Mes documents". Le déplacement de son contenu vers le répertoire cible ne s'effectue pas et dans celui-ci apparaît un répertoire "Ma musique" vide. Je précise que le contenu du répertoire source 'Ma musique" est correctement transféré dans son répertoire cible.

    J'ai testé sur deux machines différentes, l'une sous W7 intégrale l'autre sous W7 familial. Le comportement est identique sur les deux.

    Pour faciliter les tests la fin de la boucle for next (modifications du registre et suppression des dossiers source) a été mise en commentaire et un msgbox de contrôle a été ajouté.

    Merci d'avance à ceux qui voudront bien se pencher sur ce problème.

    Heffgé

  2. #2
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Tes fichiers directement dans Documents sont bien copiés j'imagine ?!


    Je pense que le problème doit être du au fait que dans le dossier Documents tu as 3 jonctions NTFS.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    <JUNCTION>     Ma musique [C:\Users\ericlm128\Music]
    <JUNCTION>     Mes images [C:\Users\ericlm128\Pictures]
    <JUNCTION>     Mes vidéos [C:\Users\ericlm128\Videos]

    Si c'est bien le problème, le plus sage serait de me pas les copier en parcourant le dossier source, voici un exemple qui s'appuie sur les attributs pour les détecter :
    Code vbs : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    document = Wscript.CreateObject("Wscript.Shell").SpecialFolders("MyDocuments")
    set objFolder = CreateObject("Scripting.FileSystemObject").GetFolder(document)
     
    For Each item in objFolder.SubFolders
    	IsAlias = ((item.Attributes And 1024) = 1024)
    	result = result & item.name & " (" & item.Attributes & ") : Est un Alias = " & IsAlias & vbcrlf
    Next
     
    msgbox result, 0, "Résultat"


    Apparemment pour les faire disparaitres une suppression du dossier semble suffire :
    Lien pour le batch mais le principe reste le même : https://superuser.com/questions/2855...t-in-windows-7

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 38
    Par défaut
    Merci de t'être penché sur ce problème.

    Tes fichiers directement dans Documents sont bien copiés j'imagine ?
    Il faut que je recommence le test mais de mémoire non. Cependant tu as vu juste.

    Nom : alias.png
Affichages : 229
Taille : 4,6 Ko

    Je ne connaissais pas cette notion de jonction et, après lecture de l'article que tu indiques, j'avoue ne pas en comprendre l'utilité. J'ai vérifié pour les autres répertoires, seuls "Mes documents" semble concerné.

    Ces bidules m'enquiquinent bien. Examiner le contenu de "Mes documents" pour les déceler semble être la bonne solution. Je vais quand même avant de procéder ainsi tenter le xcopy via un run et tant pis pour le purisme.

    À noter que lorsqu'on effectue ce type de déplacement avec l'assistant de Windows ces jonctions sont absentes dans le répertoire cible et disparaissent puique le répertoire source est supprimé dans la foulée. Ce qui ne fait qu'ajouter à mon interrogation sur leur utilité dans le cas présent.

    Je te tiens au courant de mes essais.

    Heffgé

  4. #4
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Eh bien c'est une fonctionnalité proposé par le NTFS, Windows s'en sert un peu pour ce type de dossier. Tu en as aussi dans C:\Users

    C'est peu utilisé mais ça peut être pratique mais a utilisé avec parcimonie, c'est comme un raccourci mais en mieux car géré par le système de fichier donc transparent.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    07/12/2019  10:30    <SYMLINKD>     All Users [C:\ProgramData]
    07/12/2019  10:30    <JUNCTION>     Default User [C:\Users\Default]

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 38
    Par défaut
    Je continue de galérer avec ces jonctions. J'arrive maintenant à copier tout le contenu de "mes documents" mais je ne peux pas le supprimer. J'ai toujours une erreur 70.

    Nom : err70.png
Affichages : 216
Taille : 5,6 Ko

    J'ai essayé de modifier l'attribut sans succès. Il reste à 1024. J'ai essayé avec fsutil (cf. ci-dessous) mais toujours pareil.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    set objrep = monsysfic.GetFolder(src)
    set colsrep = objrep.subfolders 
    	For Each srep in colsrep
    		jonc = (srep.Attributes And 1024) = 1024
    		if not jonc then
    			monSysfic.copyfolder src & "\" & srep.name, dest & "\"
    		else
    			Monshell.run "fsutil reparspoint delete" & src & "\" & srep.name, 0, true
    		end if
    	Next
    set objrep = nothing
    set objsrep = nothing
    J'ai pensé que cela pouvait peut-être provenir de l'ordre dans lequel je traitais ces répertoires. Documents étant en dernier les répertoires indiqués en tant que jonction sont déjà supprimés. J'ai donc modifié mon script pour le traiter en premier. J'ai toujours la même erreur et comme je sors de ma boucle for le contenu des autres répetoire n'est pas copié.

    Je suis loin d'avoir tout compris sur ces jonctions et je dois être à côté de la plaque quand je tente de les supprimer.

    Merci d'avance pour une suggestion.

    Heffgé

  6. #6
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Peut être que le dossier Mes Documents est verrouillé par le système ou ton script.

    As tu une erreur avec une tentative de suppression manuel ?
    Et après une réouverture de session (après avec redéfinit le chemin de Mes documents)



    Sinon sur mon Windows 10 en francais j'ai une jonction de Mes documents -> Documents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    <JUNCTION>     Mes documents [C:\Users\Rico\Documents]
    Je ne sais pas si c'est bloquant mais tu pourrais essayer de supprimer Mes documents puis Documents

  7. #7
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Par contre je ne vois pas ton code de suppression

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 38
    Par défaut
    Désolé de faire trâiner ce fil. J'avance à petits pas et je tenais à être à peu près sûr de mon fait avant de faire part de mes conclusions.

    Ce sont bien ces jonctions qui sont la cause de mes ennuis. Il faut les supprimer et pour cela passer une commande "fsutil reparsepoint delete". La jonction est transformée en répertoire lamda et plus rien n'empêche alors de supprimer le répertoire documents. Dans une fenêtre console ouverte en tant qu'administrateur cela ne pose aucun problème mais au travers d'un script vbs "fsutil" ne passe pas, même si l'utiisateur est administrateur. On bute sur un problème d'autorisation comme le montre ce petit script de test.

    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
    Set MonShell = WScript.CreateObject("WScript.Shell")
    set Monsysfic = wscript.createobject("scripting.filesystemobject")
    src = "C:\Users\Test\Documents"
    set objrep = monsysfic.GetFolder(src)
    set colsrep = objrep.subfolders
    if colsrep.count <> 0 then 
    	For Each srep in colsrep
    		jonc = (srep.Attributes And 1024) = 1024
    		if not jonc then
    			msgbox srep & " n'est pas une jonction"
    		else
    			commande = "fsutil reparsepoint delete " & """" & src & "\" & srep.name & """" & " >> D:\fsutil.txt"
    			msgbox commande		
    			ret = Monshell.run(commande, 0, true)	
    			msgbox "reparsepoint delete sur " & srep.name & " code retour : " & ret 
             	end if
    	next
    end if
    Set MonShell = Nothing
    Set MonSysfic = Nothing
    Un simple "dir /a" montre que la jonction n'est pas supprimée.

    Au passage je dois avoir un problème de syntaxe car avec ce code la redirection vers "D:\fsutil.txt" ne fonctionne pas. Mais ce n'est pas l'essentiel.

    J'ai regardé les diverses méthodes suggérées pour passer une commande en mode administateur. Aucune ne m'a semblé suffisamment facile à mettre en œuvre par rapport au but recherché : fournir un outil simple à un utilisateur pour effectuer en une seule manip le déplacement des dossiers standards de données personnelles vers une autre partition après une installation de Windows ou la création d'un nouveau compte d'utilisateur. Sous XP tout était regroupé dans "Mes documents" mais depuis Windows 7 il faut effectuer ce déplacement dossier par dossier, ce qui est devenu un peu laborieux.

    On trouve sur la toile un script qui déplace le profil utilisateur mais j'aurais souhaité me limiter à ce que l'on fait via l'onglet Emplacement des propriétés de ces dossiers.

    À moins que tu n'aies une astuce pour contourner ce problème d'autorisation je vais me voir contrant d'enterrer mon projet.

    En tout cas merci pour ton aide.

  9. #9
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Au passage je dois avoir un problème de syntaxe car avec ce code la redirection vers "D:\fsutil.txt" ne fonctionne pas. Mais ce n'est pas l'essentiel.
    C'est le cmd.exe qui effectue la redirection dans un fichier, dans ton cas il n'est pas lancé
    Tu devrait essayer avec un truc de ce type cmd /c fsutil reparsepoint delete ...>> D:\fsutil.txt"
    La redirection te donnera peut être une indications sur le problème.

    Tu peux essayer avec l'outil tierce de sysinternals pour supprimer des junctions
    https://docs.microsoft.com/en-us/sys...loads/junction

  10. #10
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Au fait pendant que j'y pense, la plupart des personnes disent que un RD d'un dossier supprime la jonction (a réaliser sur la jonction pas le dossier réel)
    https://handwiki.org/wiki/NTFS_junction_point

    Si tu ne trouve pas de solution je me créerai des jonctions pour tester

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 38
    Par défaut
    Tu devrait essayer avec un truc de ce type cmd /c fsutil reparsepoint delete ...>> D:\fsutil.txt"
    Effectivement, ça marche mieux comme ça. Mais le contenu du message d'erreur je le connaissais déjà puisque que j'avais tenté de passer cette commande directement dans une console. Fsutil ne fonctionne qu'en mode administrateur.

    Au fait pendant que j'y pense, la plupart des personnes disent que un RD d'un dossier supprime la jonction (a réaliser sur la jonction pas le dossier réel)
    Moi aussi mais j'ai aussi vu que ça ne fonctionnait pas forcément et qu'il fallait au prélable "déclasser" la jonction avec fsutil. Et là je viens de tester, ça fonctionne avec un simple rmdir même sur un compte utilisateur standard et avec cmd sans droits d'administrateur. Donc beaucoup de soucis pour rien mais reste à savoir si ça fonctionne aussi de cette manière sous Windows 10.

    Nom : rmdir.png
Affichages : 179
Taille : 62,8 Ko

    Je poursuis la mise au point de ce script et je te tiens au courant.

  12. #12
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Juste une précision, tu sais que RD et RMDIR c'est la même commande ?

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 38
    Par défaut
    tu sais que RD et RMDIR c'est la même commande ?
    Si je l'ai su un jour je l'avais oublié depuis longtemps. Les piqures de rappel ce n'est jamais inutile.

    Par contre je ne vois pas ton code de suppression
    Tu avais raison d'avoir des craintes. Grosse erreur, un deletefile au lieu d'un deletefolder.

    Tout est corrigé et ça fonctionne. J'avais un petit doute à propos de specialfolders. Ce petit scipt m'a permis de vérifier qo'on pointait bien sur les nouveaux répertoires.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    dim lst(2)
    lst(0) = "Desktop"
    lst(1) = "Favorites"
    lst(2) = "Mydocuments"
    Set MonShell = WScript.CreateObject("WScript.Shell")
    for i = 0 to 2 
    	chemin = monshell.specialfolders(lst(i))
    	liste = liste & lst(i) & " " & chemin & vbcrlf
    next
    msgbox liste
    Set MonShell = Nothing
    Cependant il reste quelques point noirs : des libellés remis en anglais et des raccourcis continuant de pointer sur les anciens répertoires. Cela concerne les contenus par défaut dans Favoris, Liens et Recherches.

    Le moins évident c'est pour les raccourcis. J'ai commencé de chercher sur la manière de manipuler shortcuts mais il va me falloir un peu de temps pour assimiler ça.

    Pour l'instant mon script en est là :

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    227
    228
    229
    230
    231
    232
    233
    234
    235
    236
    237
    238
    239
    240
    241
    242
    243
    244
    245
    246
    247
    248
    249
    250
    251
    252
    253
    254
    255
    256
    257
    258
    259
    260
    261
    262
    263
    264
    265
    266
    267
    268
    269
    270
    271
    '---------------------------------------------------
    ' Déplacement des répertoires de données utilisateur
    ' Réalisé par Heffgé
    ' Janvier 2021
    ' Applicable à partir de Windows 7
    '---------------------------------------------------
     
    '--------------------------
    'Table des entrées registre
    '--------------------------
     
    dim reg(10,1)
    reg(0,0) = "Personal"
    reg(0,1) = "Mes documents"
    reg(1,0) = "{374DE290-123F-4565-9164-39C4925E467B}"
    reg(1,1) = "Téléchargements"
    reg(2,0) = "{4C5C32FF-BB9D-43B0-B5B4-2D72E54EAAA4}"
    reg(2,1) = "Parties enregistrées" 
    reg(3,0) = "{56784854-C6CB-462B-8169-88E350ACB882}"
    reg(3,1) = "Contacts" 
    reg(4,0) = "{7D1D3A04-DEBB-4115-95CF-2F29DA2920DA}"
    reg(4,1) = "Recherches"
    reg(5,0) = "{BFB9D5E0-C6A9-404C-B2B2-AE6DB6AF4968}"
    reg(5,1) = "Liens"  
    reg(6,0) = "Desktop"
    reg(6,1) = "Bureau"
    reg(7,0) = "Favorites"
    reg(7,1) = "Favoris"
    reg(8,0) = "My Music"
    reg(8,1) = "Ma musique"
    reg(9,0) = "My Pictures"
    reg(9,1) = "Mes images"
    reg(10,0) = "My Video"
    reg(10,1) = "Mes vidéos"
     
    '------------------
    'Table des libellés
    '------------------
     
    dim lib(15)
    lib(0) = "Procédure exécutée avec succès."
    lib(1) = "Saisissez la lettre de la partition de destination, sans les deux points " & VBcrlf & "(la procédure est annulée si ce champ est vide)."
    lib(2) = "Confirmez le déplacement de vos données personelles sur *."  
    lib(3) = "La partition * n'exite pas."
    lib(4) = "Données de " 
    lib(5) = "Le répertoire * existe déjà." & vbcrlf & "La procédure va être arrêtée." 
    lib(6) = "Impossible de créer le répertoire *." & vbcrlf & "La procédure va être arrêtée." 
    lib(7) = "Impossible de créer le sous-répertoire *." & vbcrlf & "La procédure va être arrêtée." 
    lib(8) = "Impossible de dépacer le contenu de *." & vbcrlf & "La procédure va être arrêtée." 
    lib(9) = "Impossible de supprimer la jonction  *." & vbcrlf & "La procédure va être arrêtée." 
    lib(10) = "Impossible de modifier le registre pour le répertoire *." & vbcrlf & "La procédure va être arrêtée."
    lib(11) = "Impossible de supprimer le répertoire *." & vbcrlf & "La procédure va être arrêtée." 
    lib(13) = "Code erreur = *."
    lib(14) = "Procédure annulée par l'utilisateur."
    lib(15) = "D É P L A C E M E N T   D E   V O S   D O N N É E S   P E R S O"
     
    '----------------
    'Autres variables
    '----------------
     
    dim lettre, part, src, dest, clef, util, srep
    dim bouton, ind, jonc
    fin = false
    def = "D"
    repl = ""
    ret = 0
    cod = 0
     
    '--------------------
    'Instanciation objets
    '--------------------
    Set monShell = WScript.CreateObject("WScript.Shell")
    Set monEnv = monshell.Environment("PROCESS")
    Set monSysFic = WScript.CreateObject("Scripting.FileSystemObject")
     
    '---------------
    'Boucle générale
    '---------------
     
    do while fin = false
     
    '-----------------------
    'Saisie lettre partition
    '-----------------------
     
    	lettre = Ucase(Inputbox(lib(1), lib(15), def))
    	if len(lettre) = 0 then
    		repl = ""
    		lib(15)
    		exit do
    	end if
    	def = lettre
    	part = lettre & ":"
     
    '-----------------------
    'Demande de confirmation
    '-----------------------
     
    	bouton = msgbox(replace(lib(2), "*", part), vbokcancel, lib(15))
    	if bouton = vbcancel then
    		repl = ""
    		lib(15) 
    		exit do
    	end if
     
    '----------------------------
    'Contrôle existence partition
    '----------------------------
     
    	if not (monSysfic.folderexists(part)) then
    		repl = part
    		ret = 3
    		exit do
    	end if 
     
    '--------------------------------------------
    'Contrôle existence répertoire de destination
    '--------------------------------------------
     
    	util = monEnv("username")
    	rep = part & "\" & lib(4) & util
    	if monSysfic.folderexists(rep) then
    		repl = rep
    		ret = 5
    		exit do
    	end if
     
    '----------------------------------
    'Création répertoire de destination
    '----------------------------------
     
    	on error resume next
    	monsysfic.CreateFolder(rep)
    	if err.number <> 0 then
    		repl = rep
    		cod = err.number
    		ret = 6 
    		exit do
    	end if		
     
    '---------------------------------------
    'Pour chaque entrée registre de la liste
    '---------------------------------------
     
    	for ind = 0 to 10
     
    '------------------------
    'Création sous-répertoire
    '------------------------
     
     		dest = rep & "\" & reg(ind, 1)
    		on error resume next
    		monsysfic.CreateFolder(dest)
    		if err.number <> 0 then
    			repl = dest
    			cod = err.number
    			ret = 7 
    			exit for
    		end if	 
     
    '----------------
    'Recopie fichiers
    '----------------
     
    		clef = "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\Shell Folders\" & reg(ind,0)
    		src = monShell.RegRead(clef)																																		
    		on error resume next
    msgbox "Déplacement fichiers de " & src
    		monSysfic.copyfile src & "\*.*", dest & "\"
    		if err.number <> 0 then
    			repl = src
    			cod = err.number
    			ret = 8 
    			exit for
    		end if
     
    '-----------------------
    'Recopie sous-réperoires
    '-----------------------
     
    		set objrep = monsysfic.GetFolder(src)
    		set colsrep = objrep.subfolders
    		if colsrep.count <> 0 then 
    			For Each srep in colsrep
    				jonc = (srep.Attributes And 1024) = 1024
    				if not jonc then
    					on error resume next
    msgbox "Déplacement sous réperoire "  & src & "\" & srep.name
    					monSysfic.copyfolder src & "\" & srep.name, dest & "\"
    					if err.number <> 0 then
    						repl = src & "\" & srep.name
    						cod = err.number
    						ret = 8 
    						exit for
    					end if
    				else
     
    '---------------------
    'Suppression jonctions
    '---------------------
     
    					commande = "cmd /C rmdir " & """" & src & "\" & srep.name & """"
    msgbox "traitement jonction " &srep.name & vbcrlf & "commande = " & commande
    					on error resume next
    					Monshell.run commande, 0, true
    					if err.number <> 0 then
    						repl = src & "\" & srep.name
    						cod = err.number
    						ret = 9 
    						exit for
    					end if
    				end if					
    			Next
    		end if
    		set objrep = nothing
    		set objsrep = nothing
     
    '----------------------
    'Modifications registre
    '----------------------
    		on error resume next
    		monShell.RegWrite clef, dest, "REG_SZ"
    		clef = "HKCU\Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders\" & reg(ind,0)
    		monShell.RegWrite clef, dest, "REG_SZ"
    		if err.number <> 0 then
    			repl = "src"
    			cod = err.number
    			ret =  10
    			exit for
    		end if
     
    '--------------------------------
    'Suppression répertoire d'origine
    '--------------------------------
    		on error resume next 
    		monSysfic.deletefolder src, true
    		if err.number <> 0 then
    			repl = src
    			cod = err.number
    			ret = 11
    			exit for
    		end if
     
    '-----------------
    'Sortie boucle for
    '-----------------
     
    	next
    	if cod <> 0 then
    		exit do
    	end if
     
    '------------------------
    'Sortie boucle principale
    '------------------------
     
    	fin = true
    loop
    if cod = 0 then 
    	bouton = msgbox(replace(lib(ret), "*", repl), vbokonly, lib(15))
    else
    	bouton = msgbox(replace(lib(ret), "*", repl) & vbcrlf & replace(lib(13), "*", cod), vbokonly, lib(15))
    end if
     
    '------------------------------------
    'Ménage
    '------------------------------------
     
    Set monShell = Nothing
    Set monEnv = Nothing
    Set monSysFic = Nothing

  14. #14
    Modérateur
    Avatar de l_autodidacte
    Homme Profil pro
    Retraité : Directeur de lycée/Professeur de sciences physiques
    Inscrit en
    Juillet 2009
    Messages
    2 420
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Retraité : Directeur de lycée/Professeur de sciences physiques
    Secteur : Enseignement

    Informations forums :
    Inscription : Juillet 2009
    Messages : 2 420
    Par défaut Pour rechercher les raccourcis
    Pour rechercher les raccourcis vers des fichiers et/ou dossiers, on peut le faire par code et cela prendra quelques minutes.
    Le résultat de la recherche est inscrit dans un fichier appelé "Filelog.txt" dans le répertoire du script.
    Le script recherche tous les raccourcis du Lecteur C (On peut le faire pour d'autres lecteurs en modifiant le chemin de recherche pour la Sub Scan4Links​.
    Si un raccourci n'est pas suivi par les caractères #### et sa cible, il peut s'agir d'un fichier supprimé / déplacé ou sur un lecteur non connecté.
    Fichiers attachés Fichiers attachés
    Ne pas oublier le tag si satisfait.
    Voter pour toute réponse satisfaisante avec pour encourager les intervenants.
    Balises CODE indispensables. Regardez ICI
    Toujours utiliser la clause Option Explicit(VBx, VBS ou VBA) et Ne jamais typer variables et/ou fonctions en VBS.
    Vous pouvez consulter mes contributions
    Ne pas oublier de consulter les différentes FAQs et les Cours/Tutoriels VB6/VBScript
    Ne pas oublier L'Aide VBScript et MSDN VB6 Fr

  15. #15
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Du coup je me demande si un simple deletefolder (vbs) ne suffit pas à supprimer les jonctions.

    J'ai survolé le code, voici quelques avis d'un gas qui n'a pas fait de vbs depuis 10 ans



    on error resume next
    Il n'est utile qu'une seule fois (par "contexte" il me semble)
    Tu peux utiliser err.clear pour effacer les erreurs (en vue se sont prochain traitement)



    Je n'ai pas comprit pourquoi tu as une boucle que ne fait qu'une passe
    Code vbs : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    do while fin = false
        ...
        fin = true
    loop
    Une fonction ou procédure serai plus adaptée peut être ?



    Que fait la ligne 89, une erreur non ?

  16. #16
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 38
    Par défaut
    Pour rechercher les raccourcis vers des fichiers et/ou dossiers, on peut le faire par code et cela prendra quelques minutes.
    Merci pour ton intervention mais il s'agit ici de raccourcis parfaitement identifiés. Le seul problème, indépendemment qu'ils soient libellés en anglais, est qu'ils pointent sur les anciens répertoires.

    J'ai opté pour une solution simple, les supprimer puis les récréer avec le bon nom et la bonne cible.

    Une fonction ou procédure serai plus adaptée peut être ?
    Je n'ai jamais été programmeur même si au cours de ma vie professionnelle j'ai été amené à toucher ponctuellement à une kyrielle de langages, tant sur grands systèmes que sur PC. Mon script n'est donc certainement pas un chef d'œuvre du genre sur le plan de l'esthétique.

    Une boucle est nécessaire au départ pour la saisie mais c'est vrai que le reste pourrait être une procédure distincte. Toutefois le principal intérêt d'une fonction ou d'une procédure est de ne pas avoir à répéter du code. Dans la mesure où il n'est exécuté qu'une seule fois ce n'est plus qu'une simple question de présentation. Comme je ne suis pas à l'aise avec les appels j'ai opté pour ce qui était le plus simple pour moi. Mais j'accepte bien volontier la critique.

    Du coup je me demande si un simple deletefolder (vbs) ne suffit pas à supprimer les jonctions.
    Je me suis posé la même question mais je ne sais pas comment réagit le copyfolder si je ne supprime pas les jonctions prélablement. Il faudrait que je teste.

    Que fait la ligne 89, une erreur non ?
    lib(15) est le titre dans toutes les fenêtres de messages.

    on error resume next
    Il n'est utile qu'une seule fois (par "contexte" il me semble)
    Il y a sûrement du ménage à faire mais dans un premier temps je ne me suis pas creusé la tête pour savoir lesquels étaient utiles ou non.

    Un seul point me chagrine encore à propos de ces fichus raccourcis, celui nommé "Recent". Il ne pointe pas sur un fichier ou un répertoire. Je vais voir s'il suffit de le renommer en "Emplacements récents".

  17. #17
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 38
    Par défaut
    La partie déplacements de mon script fonctionne maintenant parfaitement mais je butte toujours sur le renommage des raccourcis qui se retrouvent libellés en anglais.

    J'ai fini par comprendre que l'on ne pouvait pas renommer un raccourci mais qu'il fallait le récréer. Pour ça j'ai besoin de connaître le nom de la cible et dans le cas de RecentPlaces je ne sais pas comment la récupérer. Le code suivant ne me renvoie rien. Le msgbox est vide.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Set Sho = CreateObject("WScript.Shell")
    a_nom = "D:\Données de Test\Liens\RecentPlaces.lnk"
    set rac = Sho.createshortcut(a_nom)
    cible = rac.targetpath
    rac.save
    msgbox cible
    set rac = nothing
    set sho = nothing
    Si quelqu'un a une idée ?

  18. #18
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Un fichier lnk se renomme comme un autre

    J'ai désactivé les fichiers récent chez moi, mais ceci semble fonctionner

    Code vbs : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Set Shell = CreateObject("WScript.Shell")
    Set link = Shell.CreateShortcut(Shell.SpecialFolders("Desktop") & "\Fichiers récent.lnk")
    link.TargetPath = "%AppData%\Microsoft\Windows\Recent"
    link.Save

    https://www.vbsedit.com/html/e6ac108...9e8b687ace.asp

  19. #19
    Membre averti
    Profil pro
    Inscrit en
    Novembre 2013
    Messages
    38
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2013
    Messages : 38
    Par défaut
    Du coup je me demande si un simple deletefolder (vbs) ne suffit pas à supprimer les jonctions.
    J'ai essayé mais ça ne marche pas. Ou bien je m'y suis mal pris.

    Un fichier lnk se renomme comme un autre
    Effectivement, aucun problème pour renommer les raccourcis en changeant la propriété name du fichier. J'avais dû fumer des susbstances prohibées lors de mes précédents tests.

    J'ai désactivé les fichiers récent chez moi, mais ceci semble fonctionner
    Ce n'était pas le répertoire Recent qui me chagrinais mais le reccourci vers le dossier spécial "Emplacements récents" lequel ne contient que les répertoires précédemment accédés. Et il continue à me causer des soucis.

    Mon script se déroule maintenant entièrrement et fait exactement ce que je lui demande à l'exception du renommage de "RecentPlaces" en "Emplacements récents" et ceci sans qu'aucune anomalie ne soit signalée.

    Il est maintenant structuré en 3 parties, le déplacement d'une part et le renommage d'autre part étant des procédures à part entière. Si j'extrais la procédure de renommage et l'intègre dans un script distinct n'en faisant que l'appel, RecentPlaces est bien renommé.

    Pour chaque fichier à renommer je teste son existence avant d'appeler une fonction générale au sein de laquelle je teste le bon déroulement de l'opération. Des msgbox confirment que mon "fileexists" ne trouve pas le fichier quand la procédure de renommage est exécutée dans la foulée alors qu'il le trouve quand elle est appelée dans un script indépendant.

    Ci-dessous ma procédure de renommage :

    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
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    sub renom
     
    '-----------------------
    'Renommages dans Favoris
    '-----------------------
    	srep = rep & "\" & reg(7,1) & "\" & nom(0,0)
    	if monSysfic.folderExists(srep) then
    		ano = ano + ren_rep(srep, nom(0,1))
    	end if
    	srep = rep & "\" & reg(7,1) & "\" & nom(1,0)
    	if monSysfic.folderExists(srep) then
    		ano = ano + ren_rep(srep, nom(1,1))
    	end if
     
    '--------------------
    'Renommage dans Liens
    '--------------------
    	fic = rep & "\" & reg(5,1) & "\" & nom(4,0) & ".lnk"
    	if monSysfic.fileExists(fic) then
    		ano = ano + ren_fic(fic, nom(4,1) & ".lnk")
    	end if
    	fic = rep & "\" & reg(5,1) & "\" & nom(5,0) & ".lnk"
    	if monSysfic.fileExists(fic) then
    		ano = ano + ren_fic(fic, nom(5,1) & ".lnk")
    	end if
    	fic = rep & "\" & reg(5,1) & "\" & nom(6,0) & ".lnk"
    	if monSysfic.fileExists(fic) then
    msgbox "trouvé : " & fic
    		ano = ano + ren_fic(fic, nom(6,1) & ".lnk")
    	else
    msgbox "non trouvé : " & fic
    	end if
     
    '------------------------
    'Renommage dans Recherhes
    '------------------------
    	fic = rep & "\" & reg(4,1) & "\" & nom(2,0) & ".search-ms"
    	if monSysfic.fileExists(fic) then
    		ano = ren_fic(fic, nom(2,1) & ".search-ms")
    	end if		
    	fic = rep & "\" & reg(4,1) & "\" & nom(3,0) & ".search-ms"
    	if monSysfic.fileExists(fic) then
    		ano = ren_fic(fic, nom(3,1) & ".search-ms")
    	End if
     
    '-------------
    'Fin renommage
    '-------------
    end sub
     
    '------------------------------
    'Fonction renommage répertoires
    '------------------------------
    function ren_rep(a_nom, n_nom)
    	on error resume next 
    	monSysfic.GetFolder(a_nom).name = n_nom
    	if err.number <>0 then
    		ren_rep = 1
    	else
    		ren_rep = 0			
    	end if
    end function
     
    '---------------------------
    'Fonction renommage fichiers
    '---------------------------
    function ren_fic(a_nom, n_nom)
    	on error resume next 
    	monSysfic.GetFile(a_nom).name = n_nom
    	if err.number <> 0 then
    		ren_fic = 0
    	else
    		ren_fic = 0
    	end if
    end function
    Là on ne voit pas le contenu des variables utilisées mais en fait le script indépendant est l'original amputé de la procédure de déplacement. Là je sèche complètement. Pourquoi ça marche dans un cas et pas dans l'autre ?

  20. #20
    Expert confirmé

    Homme Profil pro
    Responsable déploiement (SCCM, InTune, GPO)
    Inscrit en
    Juillet 2014
    Messages
    3 218
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 218
    Par défaut
    Effectivement si cela marche au "détail" tu doit avoir un problème dans le script.
    Je ne le connais pas assez pour t'aider de plus je n'ai pas le raccourci "fichier récent" il est ou ? Et il pointe sur quoi ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Réponses: 1
    Dernier message: 19/12/2007, 10h35
  2. [BO 6.5] Import de fichier de données perso
    Par titi0712 dans le forum Deski
    Réponses: 1
    Dernier message: 17/12/2007, 11h35
  3. [script]script correction données
    Par pouss dans le forum SQL
    Réponses: 5
    Dernier message: 20/09/2007, 17h23
  4. nom de domaine - données persos - redirection
    Par jacky12 dans le forum Domaines
    Réponses: 4
    Dernier message: 14/07/2006, 22h29
  5. script des données de la base
    Par tiboleo dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 25/11/2005, 09h06

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