none
Script que no funciona en subdirectorios RRS feed

  • Pregunta

  • Buenos dias,

    No tengo experiencia en scripts de powershell y necesito que alguien me de un empujoncito. Encontre por internet un script que cambiaba nombres de carpetas y ficheros que contenian acentos por letras sin acentos. Es decir, que "pasaba" nombres de ficheros de UTF-16 a UTF-8.

    Este escrip contenia algunos errors que pude corregir, y otros que no. Lo que no se como solucionar es que funciona bien para ficheros y directorios en un primer nivel, pero recursivamente no funciona. Es decir, a partir del segundo nivel de subdirectorio es incapaz de corregir los nombres. 

    La variable  $rootpath_to_translitterate

    es donde se estarian los directorios, subdirectorios i ficheros a corregir.

    Alguien puede echarme un cable?

    Muchas gracias

    # Defining the translitterate function
    
    function OC_translitterate {
        param(
            [string]$inputString
        )
        [string]$formD = $inputString.Normalize(
                [System.text.NormalizationForm]::FormD
        )
        $stringBuilder = new-object System.Text.StringBuilder
        for ($i = 0; $i -lt $formD.Length; $i++){
            $unicodeCategory = [System.Globalization.CharUnicodeInfo]::GetUnicodeCategory($formD[$i])
            $nonSPacingMark = [System.Globalization.UnicodeCategory]::NonSpacingMark
            if($unicodeCategory -ne $nonSPacingMark){
                $stringBuilder.Append($formD[$i]) | out-null
            }
        }
        $string = $stringBuilder.ToString().Normalize([System.text.NormalizationForm]::FormC)
        return $string
    }
    
    # Variables definition
    
    $log_folders = "list_folders.log"
    $log_files = "list_files.log"
    $rootpath_to_translitterate = "z:\owncloud_data\"
    
    # Moving to the Owncloud-shared data folder
    
    set-location $rootpath_to_translitterate 
    
    # Purging ol logs
    
    remove-item $log_folders -force
    remove-item $log_files -force
    
    # Resetting a counter
    
    $counter = $null
    
    # Writing to the folders log the names of the folders that need renaming
    
    gci -recurse  | Where {$_.psIsContainer -eq $true} | %{if($_.name -ne (OC_translitterate $_)) {$counter=$counter+1;$folder=$_.directoryname;$corrected=(OC_translitterate $_);write $counter`t$folder`t$_`t$corrected | out-file -append $log_folders}}
    
    # Resetting a counter
    
    $counter = $null
    
    # Writing to the files log the names of the files that need renaming
    
    gci -recurse  | Where {$_.psIsContainer -eq $false} | %{if($_.name -ne (OC_translitterate $_)) {$counter=$counter+1;$folder=$_.directoryname;$corrected=(OC_translitterate $_);write $counter`t$folder`t$_`t$corrected | out-file -append $log_files}}
    
    # Launching notepad to display the two logs for checking
    
    notepad $log_folders 
    notepad $log_files 
    
    # Asking for confirmation before proceeding
    
    $yes = New-Object System.Management.Automation.Host.ChoiceDescription "&Yes",""
    $no = New-Object System.Management.Automation.Host.ChoiceDescription "&No",""
    $choices = [System.Management.Automation.Host.ChoiceDescription[]]($yes,$no)
    $caption = "Warning!"
    $message = "Do you want to translitterate or not? (MAKE A BACKUP FIRST!!!)"
    $result = $Host.UI.PromptForChoice($caption,$message,$choices,0)
    
    # If confirmed, rename
    
    if($result -eq 0) {
    Write-Host "You answered YES. Renaming..."
    gci -recurse  | Where {$_.psIsContainer -eq $true} | %{if($_.name -ne (OC_translitterate $_)) {rename-item $_ -newname (OC_translitterate $_)}}
    gci -recurse  | Where {$_.psIsContainer -eq $false} | %{if($_.name -ne (OC_translitterate $_)) {rename-item $_ -newname (OC_translitterate $_)}}
    }
    
    # If not confirmed, exit
    
    if($result -eq 1){Write-Host "You answered NO. Exiting."}


    • Editado xvendrell miércoles, 18 de junio de 2014 14:44
    miércoles, 18 de junio de 2014 14:41

Todas las respuestas

  • bueno, he avanzado un poquito. he cambiado algo y a la practica me funciona, aunque se que es una chapuza. Pero ejecuntado varias veces el escript me lo acaba haciendo

    if($result -eq 0) { Write-Host "You answered YES. Renaming..." gci -recurse | Where {$_.psIsContainer -eq $true} | %{if($_.name -ne (OC_translitterate $_)) {rename-item $_.fullname -newname (OC_translitterate $_)}} gci -recurse | Where {$_.psIsContainer -eq $false} | %{if($_.name -ne (OC_translitterate $_)) {rename-item $_.fullname -newname (OC_translitterate $_)}} }

    Si alguien quiere aportar algo mas, sera bienvenido.

    jueves, 19 de junio de 2014 9:37
  • Hola Intenta con esto:

    $PathFolder = Get-ChildItem -Path "E:\Test\" -Recurse | ForEach-Object{
    
    $FileName = [Text.Encoding]::Utf8.GetString([Text.Encoding]::Default.GetBytes($_.Name))
    
        If ($_.Name -ne $FileName) {
        
        Rename-Item -Path $_.FullName -NewName $FileName -Force
        
        }
    }

    Saludos,


    Jimcesse
    Principal: http://sysadmin-cr.com/
    Alterno: http://blogs.itpro.es/jimcesse
    


    • Editado Jimcesse martes, 16 de septiembre de 2014 16:05
    • Propuesto como respuesta Juan Jose Gazzola viernes, 26 de septiembre de 2014 12:12
    martes, 16 de septiembre de 2014 15:44