Question
Renommer fichier-Dossier caractère spécial
- PoSH_Newbie
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 14
- Remerciements reçus 0
Dans la foulée du précédent Post, je me trouve dans la situation de fichiers / dossiers contenant le caractère \"$\"
- Voici le script :
[code:1]#1. DECLARATION DES VARIABLES
$Script:FOLDER= Read-Host \"Indiquer le dossier source \"
$Script:«»Path= $FOLDER
#FIN 1.
#2. DECLARATION DES FONCTIONS
function Check-IllegalCharacters ($Path, [switch]$Fix, [switch]$Verbose)
{
Write-Host Vérification des fichiers dans $Path, patienter...
#Get all files and folders under the path specified
$items = Get-ChildItem -Path $Path
foreach ($item in $items)
{
#Check if the item is a file or a folder
if ($item.PSIsContainer) { $type = \"[DOSSIER] -- \" }
else { $type = \"[FICHIER] -- \" }
#Report item has been found if verbose mode is selected
if ($Verbose) { Write-Host $type trouvé, NOM: $item.FullName }
#Check if item name is 128 characters or more in length
if ($item.Name.Length -gt 127)
{
Write-Host $type $item.Name a 128 ou plus et doit être tronqué -ForegroundColor Red
}
else
{
#Got this from powershell.com/cs/blogs/tips/archive/201...e-regex-matches.aspx
$illegalChars = '[&{}~#%éèêëàâ@\$]'
filter Matches($illegalChars)
{
$item.FullName | Select-String -AllMatches $illegalChars |
Select-Object -ExpandProperty Matches
Select-Object -ExpandProperty Values
}
#Replace illegal characters with legal characters where found
$newFileName = $item.FullName
Matches $illegalChars | % {
Write-Host $type $item.FullName contient le caractère $_.Value -ForegroundColor Red -backGroundColor Yellow
#These characters may be used on the file system but not SharePoint
if ($_.Value -match \"&\"«») { $newFileName = ($newFileName -replace \"&\", \"et\"«») }
if ($_.Value -match \"é\"«») { $newFileName = ($newFileName -replace \"é\", \"e\"«») }
if ($_.Value -match \"è\"«») { $newFileName = ($newFileName -replace \"è\", \"e\"«») }
if ($_.Value -match \"ê\"«») { $newFileName = ($newFileName -replace \"ê\", \"e\"«») }
if ($_.Value -match \"ë\"«») { $newFileName = ($newFileName -replace \"ë\", \"e\"«») }
if ($_.Value -match \"à\"«») { $newFileName = ($newFileName -replace \"à\", \"a\"«») }
if ($_.Value -match \"â\"«») { $newFileName = ($newFileName -replace \"â\", \"a\"«») }
if ($_.Value -match \"@\"«») { $newFileName = ($newFileName -replace \"@\", \"_\"«») }
if ($_.Value -match \"$\"«») { $newFileName = ($newFileName -replace \"$\", \"_\"«») }
if ($_.Value -match \"{\"«») { $newFileName = ($newFileName -replace \"{\", \"(\"«») }
if ($_.Value -match \"}\"«») { $newFileName = ($newFileName -replace \"}\", \"«»)\"«») }
if ($_.Value -match \"~\"«») { $newFileName = ($newFileName -replace \"~\", \"_\"«») }
if ($_.Value -match \"#\"«») { $newFileName = ($newFileName -replace \"#\", \"_\"«») }
if ($_.Value -match \"%\"«») { $newFileName = ($newFileName -replace \"%\", \"\"«») }
}
#Check for start, end and double periods
if ($newFileName.StartsWith(\".\"«»)) { Write-Host $type $item.FullName commence avec une séquence de POINT -ForegroundColor red -BackgroundColor Green }
while ($newFileName.StartsWith(\".\"«»)) { $newFileName = $newFileName.TrimStart(\".\"«») }
if ($newFileName.EndsWith(\".\"«»)) { Write-Host $type $item.FullName se termine avec une séquence de POINT -ForegroundColor Red -BackgroundColor Green }
while ($newFileName.EndsWith(\".\"«»)) { $newFileName = $newFileName.TrimEnd(\".\"«») }
if ($newFileName.Contains(\"..\"«»)) { Write-Host $type $item.FullName contient une séquence de deux POINTS -ForegroundColor red -BackgroundColor Green }
while ($newFileName.Contains(\"..\"«»)) { $newFileName = $newFileName.Replace(\"..\", \"_\"«») }
#Check with double Space
if ($newFileName.Contains(\" \"«»)) { Write-Host $type $item.FullName contient deux ESPACE consécutifs -ForegroundColor red -BackgroundColor cyan }
while ($newFileName.Contains(\" \"«»)) { $newFileName = $newFileName.Replace(\" \", \" \"«») }
#Fix file and folder names if found and the Fix switch is specified
if (($newFileName -ne $item.Name) -and ($Fix))
{
Rename-Item $item.FullName -NewName ($newFileName)
Write-Host $type $item.Name a été modifié en $newFileName -ForegroundColor green
}
}
}
}
#FIN 2.
#3. DEROULEMENT DU SCRIPT
Check-IllegalCharacters -path $Path -Fix #-Verbose
#FIN 3.[/code:1]
- Sources:
msdn.microsoft.com/fr-fr/library/az24scfc.aspx
get-spscripts.com/2011/11/use-powershell...eck-for-illegal.html
Le problème se situe à la ligne suivante:
[code1]if ($_.Value -match \"$$\"«») { $newFileName = ($newFileName -replace \"$\", \"_\"«») }[/code]
J'ai essayé les variantes suivantes sans aucun succès:
\"$\"
\"`$\"
\"``$\"
\"````$\"
$
\"[AntiSlash]$\"
Là, je panne, quelqu'un aurait un conseil ?
merci d'avance.<br><br>Message édité par: PowerShell Newbie, à: 14/06/13 19:57
PowerShell-scripting.com = alias de SHARE-PSKnowledge
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
il faut échapper les métas caractères :
[code:1]
$s='test$'
$s -match '\$';$matches
$s -replace '\$', \"_\"
[/code:1]
Avec les regex, utilise de préférence les guillemets simple.
Tu peux aussi simplifier ton code:
[code:1]$regex='é|è|ê|ë'
$s='lévèrêtë'
$S -replace $Regex, \"e\"[/code:1]
Vérifie si la fonction Remove-Diacritic (dispo dans le forum contribution) peut te faciliter la vie
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- PoSH_Newbie
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 14
- Remerciements reçus 0
Je peux effectivement alléger le script que j'avais trouvé.
Dans l'immédiat, ce que je souhaitais, c'était surtout vérifier si on pouvais faciliter la vie des techs sharePoint avant de transférer des répertoires sur SPS.
Maintenant, on va pouvoir optimiser le code.
je regarde pour le Test-DiacriticCharacters, merci à toi
PowerShell-scripting.com = alias de SHARE-PSKnowledge
Connexion ou Créer un compte pour participer à la conversation.
- PoSH_Newbie
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 14
- Remerciements reçus 0
ex: F.i.c.h.i.e.r.docx
==> les manipulations pour renommer automatiquement aboutissent:
- soit à renommer l'ensemble du fichier en \"___________\"
- soit à conserver le \".\" à l'endroit ou il se trouve, mais à ajouter un \"_\" après l'extension...
PowerShell-scripting.com = alias de SHARE-PSKnowledge
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
Bah rien ne dit que précédement cela ne m'a pas coûté 2 joursGrrr, ça m'énerve, ça fait 2 jours que je suis dessus et tu trouves en 10 secondes
Mais quelques lectures arides m'ont bien aidées ...
PowerShell Newbie écrit:
Le nommage de ta fonction est incorrecte, car en plus de valider le contenu elle le modifie.Dans l'immédiat, ce que je souhaitais, c'était surtout vérifier si on pouvais faciliter la vie des techs sharePoint avant de transférer des répertoires sur SPS.
PowerShell Newbie écrit:
Ce type de problème me permet de vérifier des cas d'utilisation avec la fonction Replace-String :Maintenant, on va pouvoir optimiser le code.
[code:1]
#Enumération des remplacements
$newFileName ='{lévèrêtë @ ou & à 152$ * 10% #}'
$h=@{}
$h.'&'=\"et\"
$h.'à|â'=\"a\"
$h.'é|è|ê|ë'=\"e\"
$h.'@|\$'=\"_\"
$h.'{'=\"(\"
$h.'}'=\"«»)\"
$h.'~|#'=\"_\"
$h.'%'=([String]::Empty)
Replace-String -i $newFileName $h
#Remplacements via un délégué
#Au prix d'un code 'condensé'
$illegalChars = '[&{}~#%éèêëàâ@\$]'
$Regex=$illegalChars.GetEnumerator()|Write-output -InputObject {[regex]::Escape(\"$_\"«»)}
$ofs='|';
$h=@{}
$h.$Regex={ Write-Warning $args[0].Value} #reste à coder le switch renvoyant la valeur substituée...
Replace-String -i $newFileName $h
[/code:1]
PowerShell Newbie écrit:
Bah c'est la norme qui l'autorise.Un autre point qui pose PB: les noms de fichiers contenant des \".\"
Première idée utiliser une classe :
[code:1]
$f=new-object system.io.FileInfo 'F.i.c.h.i.e.r.docx'
$f.Extension
$f.BaseName
[/code:1]
Reste à trouver la regex pour l'extension, à savoir 'remplacer tous les caractères point sauf le premier'.
Une solution à valider :
[code:1]
$regex='(?<!^)\.'
$f.Extension -replace $regex,'_'
#autres cas à tester
$s='..do..c.x' #$s='' $s='.' $s='..'
$s -replace $regex,'_'
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Renommer fichier-Dossier caractère spécial