Identifique el patrón en el nombre de archivo usando el lote

1

Tengo un script que cambia el nombre de los archivos agregando una marca de tiempo como prefijo al nombre de archivo actual. Un archivo con una marca de tiempo se ve así:

20170407_1030.file1.txt

Ejecuto este script en una carpeta después de haber trabajado con algunos archivos. El problema es que una vez que un archivo ya tiene una marca de tiempo antepuesta a su nombre, la próxima vez que ejecute el script, antepone otra marca de tiempo al nombre del archivo. En cambio, si un archivo ya tiene una marca de tiempo en su nombre, quiero reemplazarlo con una marca de tiempo actualizada.

Para lograr esto, estoy tratando de identificar los nombres de archivo que ya contienen una marca de tiempo, y si es así, reemplazarlo con una marca de tiempo actualizada.

Mi script para hacer esto actualmente se ve así:

setlocal enabledelayedexpansion

for /f "delims=|" %%F in ('dir /b %cd%\*.*') do (
  set "MDate=%%~tF"
  set "Patern=*_*."
  set "TimeStamp=!MDate:~6,4!!MDate:~0,2!!MDate:~3,2!"
  ren "%%~nF%%~xF" "!TimeStamp!-%%~nF%%~xF" 
)
exit

Editar: lo siento por no proporcionar más detalles. He estado investigando un poco y no puedo encontrar una manera de hacer coincidir las máscaras en la muestra dada. Sé cómo reemplazar patrones predefinidos o cómo combinar máscaras como ren *.png *.jpg.

brneor
fuente
2
Gracias por decirnos lo que quieres hacer. ¿Tienes una pregunta? Y si tu pregunta es cómo, ¡muéstranos lo que has probado primero! :) Ayudará a que no proporcionemos respuestas que ya haya intentado. Si no has intentado nada, ¡prepárate para votos negativos! Sin embargo, el registro básico podría ser el número de períodos. De lo contrario, su pregunta no está clara, ya que no proporciona suficientes detalles. De todos modos, hasta que edite su pregunta , he votado para cerrar. Lo siento
Dave
1
Además, SuperUser no es un tipo de sitio "Por favor, escríbeme un script". Comparta su investigación y lo ayudaremos a descubrir por qué las cosas no funcionan como lo hacen.
LPChip
Se agregó más información.
brneor
Su "pregunta" sigue siendo clara como el barro, incluso después de la edición. No sé cómo interpretar "Quiero identificar nombres de archivo que ya contienen una marca de tiempo y luego actualizarlo".
dbenham
Lo siento, por favor, vea si está lo suficientemente claro ahora :)
brneor

Respuestas:

2
@Echo off
Pushd "X:\path\to\workdir"

:: Get current date time 
For /f "delims=." %%A in (
  'wmic os get LocalDateTime^|findstr ^^[0-9]'
) do Set DT=%%A
Set "DT=%DT:~0,8%_%DT:~8,4%"

For /f "tokens=1* delims=." %%A in (
  'Dir /B/A-D "20*_*.*.txt"^|findstr "^20[0-9][0-9][01][0-9][0-3][0-9]_[0-2][0-9][0-5][0-9]\." '
) do Echo ren "%%A.%%B" "%DT%.%%B"

Si la salida se ve bien, elimine el eco en la última línea.

Salida de muestra:

> SU_1225592.cmd
ren "20170704_1656.File1.txt" "20170704_1700.File1.txt"
ren "20170704_1656.File2.txt" "20170704_1700.File2.txt"

Editar Para verificar simplemente la existencia de un patrón date_time en un archivo
, puede usar este lote que usa solo el nivel de error devuelto por findtr
para ejecutar condicionalmente el éxito &&o fallar ||diferentes comandos.

@Echo off
Set "Pattern=^20[0-9][0-9][01][0-9][0-3][0-9]_[0-2][0-9][0-5][0-9]\."
For %%A in ("%CD%\*") Do Echo:%%~nA|findstr "%Pattern%">NUL 2>&1 && (
    Echo found Pattern in %%~fA
) || (
    Echo No    Pattern in %%~fA
)

Salida de muestra:

No    Pattern in A:\Copy+Archive.cmd
No    Pattern in A:\SU_1225592.cmd
found Pattern in A:\20170704_1656.File1.txt
found Pattern in A:\20170704_1656.File2.txt
No    Pattern in A:\tp010387.BAT
LotPings
fuente
Aunque esta no es la respuesta que estaba buscando, me llevó directamente a la solución. Gracias.
brneor