file powershell replace rename

file - Cambiar el nombre de los archivos reformateando los nombres de archivo existentes: marcadores de posiciĆ³n en cadenas de reemplazo utilizadas con el operador-replace



powershell rename (4)

Recomiendo regex101.com para aprender regex.

Algo como esto puede funcionar:

"VideoName_s01e01.mp4" -replace ''(.*s)(/d+)(e.*)'', ''$1$2_$3''

Da:

VideoName_s01_e01.mp4

Tengo algunos archivos de video como este: VideoName_s01e01.mp4 donde la temporada y los episodios son variables. Quiero agregar un guión bajo ("_") entre los s?? y e?? .

He estado usando powershell para cambiar el nombre, tengo un punto de partida:

GCI $path -filter ''*_s??e??*'' -rec | Ren -new { $_.name -replace ''_s[0-9][0-9]'', ''_s[0-9]_[0-9]_'' } -passthru

En realidad, esto renombró mis archivos VideoName_s[0-9]_e[0-9].mp4 .

Básicamente, estoy buscando los personajes s??e?? Simplemente no sé cómo hacerlas variables en la sección de reemplazo.

Creo que el mejor método sería:

  1. Encuentra la posición de e??s?? (Llamémoslo X).
  2. dividir la cuerda en X-3 .
  3. concatene la cadena con una " _ " en el medio.

regex es la mejor solución, propongo otro con número de formato y uso Template

$exampleoffile = @" namev1_s01e01.mp4 namvev2_s03e02.mp4 VideoName_s20e15.mp4 VideoName_s15e1.mp4 VideoName_s1e16.avi VideoName_s1e23.mv "@ $template=@" {file*:{prefix:Test1}_s{season:01}e{episode:01}{extension:.mp4}} {file*:{prefix:1xxx}_s{season:100}e{episode:5}{extension:.mp4}} {file*:{prefix:yyy3}_s{season:10}e{episode:02}{extension:.havi}} "@ $exampleoffile | ConvertFrom-String -TemplateContent $template | % { "{0}_{1:D2}_e{2:D2}{3}" -f $_.file.prefix, [int]$_.file.season, [int]$_.file.episode, $_.file.extension }


La respuesta de Martin Brandl proporciona una solución elegante y efectiva , pero vale la pena profundizar:

Operador -replace de PowerShell ( ... -replace <search>, <replace> ):

  • toma una expresión regular como su primer operando, <search> (la expresión de búsqueda), y siempre coincide globalmente (encuentra todas las coincidencias).

  • admite referencias a lo que la expresión regular capturó (y no capturó) en el segundo operando, <replace> , la cadena de reemplazo (cadena de sustitución).

El "lenguaje de reemplazo" para hacer referencia a las capturas de expresiones regulares admitidas en <replace> no es una expresión regular : allí no ocurre ninguna coincidencia, solo se admiten referencias a los resultados de la coincidencia de expresiones regulares .

Notablemente,

Para mayor comodidad, aquí están las referencias admitidas en <replace> (extraído de la página vinculada anteriormente, con énfasis y anotaciones añadidas):

  • $ number (p. ej., $1 ) ... Incluye la última subcadena emparejada por el grupo de captura que se identifica por number , donde número es un valor decimal, en la cadena de reemplazo.

    • Anotaciones :

      • Incluyendo (...) , una subexpresión entre paréntesis, en la expresión regular crea implícitamente un grupo de captura (grupo de captura). Por defecto, dichos grupos de captura no tienen nombre y deben ser referenciados por su índice basado en 1 (decimal) que refleja el orden en que aparecen en la expresión regular, de modo que $1 refiere a lo que capturó el primer grupo en su expresión regular, $2 a lo que el 2do capturado, ...

      • También se admite la forma ${ number } (por ejemplo, ${1} ) para la desambiguación del número (por ejemplo, para asegurarse de que se reconozca $1 incluso si se sigue, digamos, 000 , use ${1}000 ).

      • En lugar de depender de índices para referirse a grupos de captura sin nombre, puede nombrar grupos de captura y referirse a ellos por nombre; consulte el siguiente punto.

      • Si no está interesado en el grupo de captura, puede optar por ignorarlo convirtiéndolo en un grupo sin captura con (?:...) .

  • ${ name } ... Incluye la última subcadena emparejada por el grupo designado designado por (?< name >...) en la cadena de reemplazo.

  • $$ ... Incluye un solo literal "$" en la cadena de reemplazo.

  • $& ... Incluye una copia de toda la coincidencia en la cadena de reemplazo.

  • $` ... Incluye todo el texto de la cadena de entrada antes de la coincidencia en la cadena de reemplazo.

  • $'' ... Incluye todo el texto de la cadena de entrada después de la coincidencia en la cadena de reemplazo.

  • $+ ... Incluye el último grupo capturado en la cadena de reemplazo. [Esto lo libera de la necesidad de conocer el índice específico del último grupo.]

  • $_ ... Incluye toda la cadena de entrada en la cadena de reemplazo.

Finalmente, tenga en cuenta que:

  • -replace invariablemente coincide globalmente , por lo que si la cadena de entrada contiene múltiples coincidencias, los reemplazos anteriores se aplican a cada coincidencia.

  • En general, es preferible usar ''...'' (comillas simples ) tanto para la expresión regular como para la cadena de reemplazo, porque las cadenas entre comillas simples no se expanden (no se interpolan) y, por lo tanto, evitan la confusión con las expansiones iniciales de PowerShell. de tokens con prefijo $ e interpretación de caracteres.
    Si necesita incluir una variable de PowerShell, tiene tres opciones:

    • Utilice "..." (cadenas de expansión) y ` -escape $ instancias destinadas al motor de expresiones regulares ; por ejemplo, `$1 en el siguiente ejemplo:
      ''abc'' -replace ''(a)'', "[`$1]-$HOME-" , que produce algo como [a]-C:/Users/jdoe-bc

    • Cree su cadena a partir de piezas literales y referencias variables utilizando la concatenación de cadenas ( + ); p.ej:
      ''abc'' -replace ''(a)'', (''[$1]-'' + $HOME + ''-'')

    • Use -f , la concatenación de cadenas del operador de formateo de cadenas; p.ej:
      ''abc'' -replace ''(a)'', (''[$1]-{0}-'' -f $HOME)

  • Dado que necesita usar $$ para escapar de un $ literal en la cadena de reemplazo , use el siguiente modismo para usar una variable cuyo valor quiera usar literalmente :

    • ... -replace <search>, $var.Replace(''$'', ''$$'')
    • Esto se basa en el método [string]::Replace() que realiza reemplazos de subcadenas literales .
      En una nota al margen, este método es una alternativa para -replace en casos simples, pero tenga en cuenta que es sensible a mayúsculas y minúsculas por defecto.
    • Alternativamente, use una llamada anidada de -replace , pero la sintaxis es complicada debido a los requisitos de escape:
      ... -replace <search>, ($var -replace ''/$'', ''$$$$'')

-replace está utilizando -replace regex , no wildcards . Por lo tanto, debe cambiar el reemplazo a:

-replace ''_s([0-9]{1,2})e([0-9]{1,2})'', ''_s$1_e$2_''