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-childitemif 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() }
    }
}
18
demandé sur Ralph 2010-09-29 18:44:47

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.

22
répondu Goyuix 2010-09-29 16:13:23

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()}
11
répondu Keith Hill 2010-09-29 16:51:50

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

2
répondu ddools 2013-10-15 14:41:13

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
   }
1
répondu Derek Smalls 2016-09-07 16:43:44
Rename-Item, de la Tuyauterie, le Bouclage et le système de fichiers Windows fonctionne. Malheureusement la solution la plus simple (ne pas utiliser d'Alias pour la lisibilité ici) que j'ai trouvé à renommer tous les fichiers et dossiers à l'intérieur d'un dossier de bas-de-casse est celui-ci:

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)";}
1
répondu masi 2018-06-19 09:38:36

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() }
0
répondu Jay Bazuzi 2010-10-11 01:49:38