Elimar con un Bat un guión largo por guión normal

Hay algún modo de elimar con Bat un archivo con que contiene un guión largo por guión normal.
En Ascii seria Alt + 0150
Ejemplo:
Hola – xxxx.txt
Por
Hola - xxxx.txt

1 respuesta

Respuesta
1

Aunque en el texto no se dice nada al respecto el ejemplo parece indicar que no es elimar/eliminar sino sustituir y que la sustitución la quieres hacer en el nombre de un archivo (o varios). He de reconocer que no consigo los caracteres Alt+0150 sean reconocidos en un comando tipo DIR. Lo dejo pendiente de estudio cuando tenga un rato porque me parece sorprendente.

Hola, gracias por tu respuesta.

He probado con este Bat pero nada.

@echo off
for /f "delims=" %%a in ('dir /a:-d /o:n /b') do call :next "%%a"
pause
GOTO:EOF
:next
set "newname=%~nx1"
set "newname=%newname:–=-%"
ren %1 "%newname%

Bat

Me parece que el problema tiene que ver con que, de alguna manera, el MSDOS no distingue entre esos dos caracteres, de la misma manera que no distingue entre mayúsculas y minúsculas, aunque las respete.

Creo que podrías comprobar que es así mostrando el comando REN en lugar de ejecutarlo (solo tienes que precederlo de ECHO).

Me parece un problema curioso y de momento no se me ocurre como resolverlo en MSDOS. Pensé que con PowerShell no sería demasiado complicado, he hecho la prueba y he encontrado el comando que, en PS puro, haría correctamente el renombrado. Es este:

Get-ChildItem -Path *–*.*^| rename-item -newname {$_.Name -replace "–", "G"}

En lugar de cambiar el "–" por "-" lo he cambiado por "G" para que se note más.

Te muestro los comandos de la ventana PS que muestran los archivos antes y después del cambio:

PS D:\Carpeta prueba>  Get-ChildItem -Path *-*.*
    Directorio: Microsoft.PowerShell.Core\FileSystem::D:\Carpeta prueba
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        14/10/2020     19:02        175 Copia-(3)-de-suma.txt
-a---        14/10/2020     19:02        175 Copia-de-suma.txt
PS D:\Carpeta prueba> Get-ChildItem -Path *-*.*| rename-item -newname {$_.Name -replace "-", "G"}
PS D:\Carpeta prueba>  Get-ChildItem -Path *-*.*
PS D:\Carpeta prueba>  Get-ChildItem -Path *G*.*
    Directorio: Microsoft.PowerShell.Core\FileSystem::D:\Carpeta prueba
Mode                LastWriteTime     Length Name
----                -------------     ------ ----
-a---        14/10/2020     19:02        175 CopiaG(3)GdeGsuma.txt
-a---        14/10/2020     19:02        175 CopiaGdeGsuma.txt
PS D:\Carpeta prueba>

Pero si, como acostumbro en estos casos intento hacer con PS embebido en un BAT no me funciona. En realidad en ese caso en lugar de "–" me aparece "û". Seguiré probando en la medida en que tenga ratillos.

Muchas gracias por tu esfuerzo, si lo ves muy complicado déjalo.

Saludos. 

Más que complicado lo encuentro desconcertante. Parece como si algunos comandos del MSDOS, o incluso algunos contextos, no distinguieran entre "–" y "-" y son esos comandos/contextos los que "zancadillean" los intentos de hacer lo que queremos en este caso. Pero otros comandos/contextos sí que los distinguen.

Si se trata de resolver algún problema concreto te sugiero que lo hagas con PS y el siguiente "guión":

Get-ChildItem -Path *–*.*| rename-item -newname {$_.Name -replace '–', '-'}

Si no tienes experiencia con PS te cuento como puedes hacerlo:

1. Salvas el contenido del guión anterior en alguna carpeta (digamos d:\guiones) con un nombre y extensión PS1, por ejemplo CAMBGUI. PS1. Para no complicar el punto 5 es conveniente que la carpeta elegida esté en la misma unidad que la de trabajo del punto 3 (en este ejemplo la unidad D:)

2. Abres una ventana PS, por ejemplo con Inicio/<botón derecho>/Ejecutar/Powershell

3. Te sitúas, en el entorno PS, en la carpeta donde están los archivos a tratar, usando el comando CD como harías desde una ventana CMD/MSDOS (si la carpeta destino tiene espacios hay que ponerla entrecomillada)

4. Prueba, por ejemplo con comandos tipo DIR *–*.TXT o DIR *-*.TXT, la situación anterior a la ejecución.

5. Ejecuta el guión tecleando ..\guiones\cambgui (tal cual)

6. Si no da errores repite el comando 4 para comprobar que se ha hecho el cambio

7. Cierra el entorno PS tecleando EXIT

Finalmente no he conseguido hacer el cambio con un BAT puro. Aunque un comando como, por ejemplo DIR /B *–*.* pueda sacar, efectivamente, solo los archivos que tienen el guión largo en su nombre si se intenta guardar esos nombres de archivo en una variable de un FOR parece que al almacenar el nombre en la variable convierte el guión largo a guión corto. Eso podría ser una ventaja porque ya estaría hecha la conversión, pero si se intenta renombrar con un REN resulta que no encuentra el archivo "original" porque su nombre convertido no existe. Y no he sabido salir de ahí. De modo que, de momento, no veo más solución que usar PS "nativo"

Añade tu respuesta

Haz clic para o

Más respuestas relacionadas