Question Renommer fichier-Dossier caractère spécial

Plus d'informations
il y a 12 ans 9 mois #15132 par PoSH_Newbie
Bonjour,

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.

Plus d'informations
il y a 12 ans 9 mois #15135 par Laurent Dardenne
Salut,
il faut échapper les métas caractères :
[code:1]
$s='test$'

$s -match '\$';$matches

$s -replace '\$', \&quot;_\&quot;
[/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, \&quot;e\&quot;[/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.

Plus d'informations
il y a 12 ans 9 mois #15137 par PoSH_Newbie
Grrr, ça m'énerve, ça fait 2 jours que je suis dessus et tu trouves en 10 secondes :pinch:

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 :)<br><br>Message édité par: PowerShell Newbie, à: 14/06/13 17:54


PowerShell-scripting.com = alias de SHARE-PSKnowledge

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 9 mois #15138 par PoSH_Newbie
Un autre point qui pose PB: les noms de fichiers contenant des \&quot;.\&quot;

ex: F.i.c.h.i.e.r.docx

==&gt; les manipulations pour renommer automatiquement aboutissent:
- soit à renommer l'ensemble du fichier en \&quot;___________\&quot;
- soit à conserver le \&quot;.\&quot; à l'endroit ou il se trouve, mais à ajouter un \&quot;_\&quot; après l'extension...


PowerShell-scripting.com = alias de SHARE-PSKnowledge

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 12 ans 9 mois #15139 par Laurent Dardenne
PowerShell Newbie écrit:

Grrr, ça m'énerve, ça fait 2 jours que je suis dessus et tu trouves en 10 secondes

Bah rien ne dit que précédement cela ne m'a pas coûté 2 jours ;-)
Mais quelques lectures arides m'ont bien aidées ...
PowerShell Newbie écrit:

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.

Le nommage de ta fonction est incorrecte, car en plus de valider le contenu elle le modifie.
PowerShell Newbie écrit:

Maintenant, on va pouvoir optimiser le code.

Ce type de problème me permet de vérifier des cas d'utilisation avec la fonction Replace-String :
[code:1]
#Enumération des remplacements
$newFileName ='{lévèrêtë @ ou &amp; à 152$ * 10% #}'

$h=@{}
$h.'&amp;'=\&quot;et\&quot;
$h.'à|â'=\&quot;a\&quot;
$h.'é|è|ê|ë'=\&quot;e\&quot;
$h.'@|\$'=\&quot;_\&quot;
$h.'{'=\&quot;(\&quot;
$h.'}'=\&quot;«»)\&quot;
$h.'~|#'=\&quot;_\&quot;
$h.'%'=([String]::Empty)
Replace-String -i $newFileName $h

#Remplacements via un délégué
#Au prix d'un code 'condensé'
$illegalChars = '[&amp;{}~#%éèêëàâ@\$]'
$Regex=$illegalChars.GetEnumerator()|Write-output -InputObject {[regex]::Escape(\&quot;$_\&quot;«»)}
$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:

Un autre point qui pose PB: les noms de fichiers contenant des \&quot;.\&quot;

Bah c'est la norme qui l'autorise.
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='(?&lt;!^)\.'
$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.

Temps de génération de la page : 0.058 secondes
Propulsé par Kunena