2011-04-07 17 views
13

Estoy aprendiendo Regex, pero no sé cómo cambiar el nombre de los siguientes archivos a los que deseo. Me puedes ayudar.Utilice Regex/Powershell para cambiar el nombre de los archivos

BTW, considero que es muy útil utilizar Powershell para cambiar el nombre de los archivos, y puede aceptar Regex.

filename__Accelerated_C ____ Practical_Programming_by_Example.chm ->C Programación práctica por Example.chm

filename__Python_Essential_Reference__2nd_Edition_.pdf ->Python Essential Reference segundo Edition.pdf

filename__Text_Processing_in_Python .chm ->tratamiento de textos en Python.chm

También estoy incluyendo algunas herramientas de expresiones regulares en línea gratuitos que me gusta utilizar la mayor parte, podría ser útil a los demás.

http://gskinner.com/RegExr/

http://www.rubular.com/

y la cheatsheet

http://krijnhoetmer.nl/stuff/regex/cheat-sheet/

+0

soy un experto en expresiones regulares, que como sus autores de enlace para el desayuno! – sln

+0

Primero debe ser ** Programación práctica acelerada de C++ por ejemplo ** imho. – YOU

Respuesta

13

esto debería funcionar:

ls | %{ ren $_ $(($_.name -replace '^filename_+','') -replace '_+',' ') } 
+1

Por qué usar '$' en el segundo parámetro. Encontré esto funcionando también: 'ls | % {ren $ _ (($ _ -replace 'filename_ +', '') -replace '_ +', '')} ' –

+1

olvidé mi comentario, $ es necesario para cortar el último espacio antes de la extensión de archivo :) . ¡Su expresión regular funciona perfectamente! –

+0

En caso de que alguien más tenga el mismo problema: Si por algún motivo, utilizando el bloque foreach resulta en un error "no se puede cambiar el nombre porque el elemento no existe", intente utilizar el script-block como argumento para -NewName, como se muestra en la respuesta del usuario @stej (funciona para mí).No puedo entender por qué esto debería hacer una diferencia. Tal vez alguien tiene una idea? – gimpf

0

Trate de hacer esto:

$filename = $filename -creplace '_+\.', '.' 
$filename = $filename -creplace '_+', ' ' 
23

prueba este:

Get-ChildItem directory | Rename-Item -NewName { $_.Name -replace '^filename_+','' -replace '_+',' ' } 

nota que acabo de tubo de los objetos a Rename-Item, no es realmente necesario hacerlo a través de Foreach-Object (alias es %).

actualización

no tengo nada documentado acerca de la 'magia' con scriptblocks. Si no recuerdo mal, que puede ser utilizado si la propiedad es ValueFromPipelineByPropertyName=$true:

function x{ 
    param(
     [Parameter(ValueFromPipeline=$true)]$o, 
     [Parameter(ValueFromPipelineByPropertyName=$true)][string]$prefix) 
    process { 
     write-host $prefix $o 
    } 
} 
gci d:\ | select -fir 10 | x -prefix { $_.LastWriteTime } 
+1

Woohoo. +1 para eliminar la etapa innecesaria de la tubería 'Foreach'. :-) –

+0

hey cool. Los documentos no dicen que puedas usar un scriptblock como un param allí. ¿Es esta una característica de muchos otros cmdlets? – zdan

+0

@zdan, no sé dónde está documentado. Tal vez lo encontró en un blog. Nadie ha respondido hasta ahora (pregunta en Twitter). Ver mi respuesta editada. – stej

Cuestiones relacionadas