Bonjour à tous,
Préparant un projet de migration (service microsoft ondrive) je vais migrer les données utilisateurs.
cependant certain caractères spéciaux que contiennent le nom des fichiers sont bloquants.
J'aimerais donc créé un fichier listant les "fichiers ou dossiers" qui contiennent les fameux caractères non autorisé pour les modifier avec l'utilisateur final.
voici les caractères : ~ "# % & * : < > ? / \ { | }.
ainsi que l'espace en debut et en fin de chaine.
initialement, j'ai fais un script pour lister dans un fichier txt les éléments de plus de 256 caractères :
Get-ChildItem "E:\users\" -r * |? {$_.fullname.length -ge 256} |%{$_.fullname} | out-file "C:\extraction fichiers trop long.txt"
j'aimerais faire quelque chose d'identique avec les fichiers contenant les caractères citées plus haut.
hypothetix
Messages postés188Date d'inscriptiondimanche 19 janvier 2020StatutMembreDernière intervention12 avril 20246 Modifié le 12 juil. 2021 à 15:49
Bonjour,
Get-ChildItem "E:\users\" -r * | where {$_.basename -match '~|"|#|%|&|:|<|>|/|\|
>'} |%{$_.fullname}
Tu noteras que cela ne fonctionne pas avec les caractères ? et * (qui listent tous les fichiers)
Bonjour, je me suis basé sur ce que tu m'as indiquer pour réaliser une opération: je dois supprimer les espaces (ou les remplacer par un _) qui se trouve en fin de chaine.
j'ai bien testé celà qui fonctionne mais pour tout les espaces :
Get-ChildItem -recurse -name | ForEach-Object { Move-Item $_ $_.replace(' ', '_') }
sans succès...j'ai pourtant l'impression que ma démarche est pas si mauvaise !
hypothetix
Messages postés188Date d'inscriptiondimanche 19 janvier 2020StatutMembreDernière intervention12 avril 20246
>
Shellxy
27 juil. 2021 à 20:54
Bonsoir,
pas de regex pour .replace
donc : $_.replace(' ', '_') //il y a un espace entre les 2 premières simples quote ( ' )
Shellxy
>
hypothetix
Messages postés188Date d'inscriptiondimanche 19 janvier 2020StatutMembreDernière intervention12 avril 2024 28 juil. 2021 à 08:42
haaa, mais celà remplace TOUT les espace et pas seulement celui qui se trouve en fin de chaine, je me trompe?
hypothetix
Messages postés188Date d'inscriptiondimanche 19 janvier 2020StatutMembreDernière intervention12 avril 20246
>
Shellxy
28 juil. 2021 à 12:40
Effectivement ca remplace tous les espaces.
Pour ne remplacer que le premier et le dernier je te propose:
Get-ChildItem $path -File -Recurse | Where-Object { $_.basename.Contains(' ') } | Rename-Item -NewName { ($_.basename -replace "(.*)\A\s|\s\Z(.*)", '$1_$2') + $_.extension }
Nota:
Apparemment le -replace n'accepte pas le $ pour fin de la chaîne je l'ai remplacé par \Z
donc:
\s\Z pour espace en fin de chaine
\A\s pour espace en début de chaine
PUB:
Les expressions régulières sont utilisées dans plein de langages Python, PHP, MySQL, Java, Javascript etc...
Donc ca vaut la peine de passer un minimun de temps à les comprendre.
https://regex101.com/ pour les décortiquer et tester.
Shellxy
>
hypothetix
Messages postés188Date d'inscriptiondimanche 19 janvier 2020StatutMembreDernière intervention12 avril 2024 28 juil. 2021 à 17:16
HA effectivement, le $ ne fonctionne pas...étrange.
ta solution fonctionne, je serais tenté de là modifier pour supprimer 1 ou plusieurs espace à la fin du nom de fichier avec un \s+$ soit un \s+Z vu que le $ ne fonctionne pas.
j'ai également supprimer le "_" pour "supprimer" et non pas remplacer les espaces.
merci beaucoup de ton aide. je n'aurais jamais trouvé. (surtout coté syntaxe pure powershell à vrai dire.)