Renombrar archivos por lote segun caracter - batch

Iniciado por rochro, 27 Agosto 2015, 21:39 PM

0 Miembros y 1 Visitante están viendo este tema.

rochro

Hola,

Quisiera cambiar una letra o letras del nombre de un archivo.
Ejem:
nuevoarchivo.txt a nue_archivo.txt

tengo este código, el cual se que le falta algo para cumplir con el propósito.

Código (bash) [Seleccionar]
@echo off
cls
echo Renombrar nombre de archivo PI04...
for %%i in (*.txt) do (set fname=%%~ni) & call :renamefile
goto :eof

:renamefile
ren "%fname%.txt" "%fname/vo/_%.txt"
pause
cls
goto :eof


gracias por el apoyo.

Eleкtro

El comando ren/rename como su propio nombre indica sirve para renombrar un archivo, no para realizar un reemplazo de caracteres selectivamente.

Batch es el peor lenguaje que puedes escojer para esta tarea, ya que la sustituición de caracteres es muy simple, se reemplazan todas las coincidencias que se encuentren, por ejemplo, teniendo este código:

Código (dos) [Seleccionar]
Set "oldFilename=Nuevo archivo.txt"
Set "newFilename=%oldFilename:vo=%"


El resultado sería: Nue archi.txt

Existe un soporte básico y primitivo para utilizar expresiones regulares con el comando FINDSTR con el cual podrías capturar la salida, pero tiene demasiadas limitaciones y no es un Regex estándar, por no tener no tiene soporte para grupos de capturas, ni nada útil.

Cambia a un lenguaje que soporte RegEx decentemente, por ejemplo VBS (aunque preferiblemente evita usar este limitado lenguaje también y en su lugar usa Ruby, Python, u otro), o usa herramientas de terceros como SED o FART en Batch, o como último recurso usa un búcle For /F, aunque no vale la pena seguir utilizando dicho lenguaje, es demasiado tedioso hacer cualquier cosa en el limitado Batch.

Ejemplo en VBS para reemplazar "nuevo archivo.txt" por "nue_archivo.txt":
Código (vb) [Seleccionar]
set ws = WScript.CreateObject ("WScript.Shell")
Set fs = CreateObject("Scripting.FileSystemObject")
Set fpath = fs.GetFolder(ws.CurrentDirectory)

Set regEx = New RegExp
with regEx
    .Pattern = "vo\s"
    .Global = True
    .IgnoreCase = True
    .MultiLine = False
End With

replacement = "_"

For Each fspec In fpath.Files

    If UCase(fs.GetExtensionName(fspec.name)) = "TXT" Then

        Set matches = regEx.Execute(fspec.Name)
        If matches.Count <> 0 Then
       
            leftPart  = Left(fspec.Name, matches(0).FirstIndex)
            rightPart = Mid(fspec.Name, matches(0).FirstIndex + matches(0).Length + 1)

            fspec.Move fspec.ParentFolder & "\" & leftPart & replacement & rightPart

        End If

    End If

Next


Saludos