Renommer les fichiers en minuscules dans Powershell
j'essaie de renommer un tas de fichiers de façon récursive en utilisant Powershell 2.0. La structure du répertoire ressemble à ceci:
Leaflets
+ HTML
- File1
- File2
...
+ HTMLICONS
+ IMAGES
- Image1
- Image2
- File1
- File2
...
+ RTF
- File1
- File2
...
+ SGML
- File1
- File2
...
j'utilise la commande suivante:
get-childitem Leaflets -recurse | rename -newname { $_.name.ToLower() }
et il semble que, pour renommer les fichiers, mais se plaint de la sous-répertoires:
Rename-Item : Source and destination path must be different.
j'ai recharger les données mensuelles avec robocopy, mais les répertoires ne changent pas, donc je peux les renommer à la main. Est-il possible de l' get-children
pour ignorer les sous-répertoires (comme find Leaflets -type f ...
)?
Merci.
mise à jour: il semble que le problème soit avec les fichiers qui sont déjà tous en minuscules. J'ai essayé de changer la commande:
get-childitem Leaflets -recurse | if ($_.name -ne $_name.ToLower()) rename -newname { $_.name.ToLower() }
mais maintenant Powershell se plaint que if
n'est pas un cmdlet, une fonction, etc.
Puis-je rediriger la sortie de get-childitem
if
déclaration?
UPDATE 2: Ceci fonctionne:
$files=get-childitem Leaflets -recurse
foreach ($file in $files)
{
if ($file.name -ne $file.name.ToLower())
{
rename -newname { $_.name.ToLower() }
}
}
6 réponses
Même si vous avez déjà posté votre propre réponse, voici une variante:
dir Leaflets -r | % { if ($_.Name -cne $_.Name.ToLower()) { ren $_.FullName $_.Name.ToLower() } }
Certains points:
- dir est un alias pour Get-ChildItem (et-r est l'abréviation de-Récurse).
- % est un alias pour ForEach-Object.
- - cne est une comparaison sensible à la casse. - ne ne tient pas compte des différences de cas.
- $_ est comment vous référencez l'élément courant dans la boucle D'objet ForEach.
- ren est un alias pour Renommer L'Élément.
- FullName est probablement préférable car il vous assure de toucher le bon fichier.
si vous voulez exclure les répertoires d'être renommés, vous pouvez inclure quelque chose comme:
if ((! $_.IsPsContainer) -and $_.Name -cne $_.Name.ToLower()) { ... }
espérons que cela soit utile pour continuer à apprendre et à explorer PowerShell.
gardez à l'esprit que vous pouvez Piper directement pour renommer-Item et utiliser les Scriptblocks avec le -NewName
paramètre (parce qu'il accepte aussi les entrées de pipeline) pour simplifier cette tâche:
Get-ChildItem -r | Where {!$_.PSIsContainer} |
Rename-Item -NewName {$_.FullName.ToLower()}
et avec des alias:
gci -r | ?{!$_.PSIsContainer} | rni -New {$_.FullName.ToLower()}
léger tweak sur ceci, si vous voulez seulement mettre à jour les noms des fichiers d'un type particulier essayez ceci:
get-childitem *.jpg | foreach { if ($_.Name -cne $_.Name.ToLower()) { ren $_.FullName $_.Name.ToLower() } }
cela ne fera que réduire les fichiers jpg dans votre dossier et ignorer le reste
vous devez les renommer temporairement en quelque chose d'autre puis les renommer en minuscules.
$items = get-childitem -Directory -Recurse
foreach ($item in $items)
{
if ($item.name -eq $item.name.ToLower())
{
$temp = $item.FullName.ToLower() + "_"
$name = $item.FullName.ToLower()
ren $name $temp
ren $temp $name
}
Get-ChildItem -Path "/Path/To/You/Folder" -Recurse | Where{ $_.Name -cne $_.Name.ToLower() } | ForEach-Object { $tn="$($_.Name)-temp"; $tfn="$($_.FullName)-temp"; $nn=$_.Name.ToLower(); Rename-Item -Path $_.FullName -NewName $tn; Rename-Item -Path $tfn -NewName $nn -Force; Write-Host "New Name: $($nn)";}
il est plus idomatique dans PowerShell d'utiliser where
au lieu de if
dans un pipeline:
gci -Recurse Leaflets | ? { $_.Name -ne $_.Name.ToLower()) } | % { ren -NewName $_.Name.ToLower() }