2015-05-06 21 views
5

Ho un albero di directory con migliaia di pdf e tif. Una cartella può contenere più pdf o tif in questo caso sono numerati 1.pdf, 2.pdf ecc ... Devo renderli disponibili e assicurarmi che siano prima i file più vecchi elaborati manualmente - quindi voglio rinominarli con i loro la data di creazione e l'ora (1.pdf -> 20150415481876.pdf):Rinomina file con data e ora di creazione in batch di Windows

Attualmente io uso

@echo off 
set datetime=%~t1 
set name=%~n1 
set extension=%~x1 
set year=%datetime:~6,4% 
set month=%datetime:~3,2% 
set day=%datetime:~0,2% 
set hour=%datetime:~11,2% 
set min=%datetime:~14,2% 
ren %1 "%year%%month%%day%%hour%%min%%name%%extension%" 

Questo può ora rinominare correttamente un file 1.tif a 2014052513241.tif (file creato 2014/05/25 13 : 24). Ma come posso rendere questo in grado di gestire più file nella stessa cartella (ad esempio 1.tif 2.tif 3.tif) se io chiamo il batch con batch.bat * .tif? Grazie

risposta

2
@if (@X)==(@Y) @end /* JScript comment 
    @echo off 

    set "extension=tiff" 
    set "directory=c:\somedir" 

    pushd "%directory%" 

    setlocal enableDelayedExpansion 
    for %%a in (*%extension%) do (
     for /f %%# in ('cscript //E:JScript //nologo "%~f0" %%a') do set "cdate=%%#" 
     echo ren "%%a" "!cdate!%%~xa" 
    ) 

    rem cscript //E:JScript //nologo "%~f0" %* 
    exit /b %errorlevel% 
@if (@X)==(@Y) @end JScript comment */ 


FSOObj = new ActiveXObject("Scripting.FileSystemObject"); 
var ARGS = WScript.Arguments; 
var file=ARGS.Item(0); 

var d1=FSOObj.GetFile(file).DateCreated; 

d2=new Date(d1); 
var year=d2.getFullYear(); 
var mon=d2.getMonth(); 
var day=d2.getDate(); 
var h=d2.getHours(); 
var m=d2.getMinutes(); 
var s=d2.getSeconds(); 
var ms=d2.getMilliseconds(); 

if (mon<10){mon="0"+mon;} 
if (day<10){day="0"+day;} 
if (h<10){h="0"+h;} 
if (m<10){m="0"+m;} 
if (s<10){s="0"+s;} 
if (ms<10){ms="00"+ms;}else if(ms<100){ms="0"+ms;} 

WScript.Echo(""+year+mon+day+h+m+s+ms); 

impostare il proprio interno e la directory per rinominare tutti i file con estensione data nella directory di loro formato date.The creazione sarà YYYYMMDDhhmm .Renaming è echo Ed modo da poter vedere se tutto è ok.If è rimuovere la parola echo dalla nona riga.

+1

ringrazio molto . 1. Fa correttamente eco ren 1.tif 201504160213.tif ma il cambio di nome non avviene. Qualche idea del perché? 2. Inoltre, nel caso in cui ci siano più file con lo stesso timestamp, tenta di rinominarli con lo stesso nome che non funzionerà, può esserci un contatore implementato che annunci qualcosa come _N al nome del file prima dell'estensione? –

+0

@ PhiläBu - potrebbero essere gli stessi timestamp sono il problema. È possibile aggiungere i millisecondi e i secondi al timestamp e vedere cosa accadrà. – npocmaka

+1

Grazie ancora. Così ho provato l'approccio, ma non aiuta perché i file stessi sembrano avere milisec = 000. Come dovrei adottare lo script sopra per fare quanto segue: ho 100 directory in una certa directory root e voglio rinominare tutte queste 100 directory con la loro data di creazione? –

0

Ecco un metodo nativo CMD di Windows per eseguire questa operazione (non è necessario alcuno script vb/java).

Se si vuole essere veramente veloce e semplice basta usare questo alla finestra CMD invece di scrivere un batch a tutti:

FOR /R "Drive:\folder\subfolder\" %Z IN (*.tiff) DO @(FOR /F "Tokens=1-6 delims=:-\/. " %A IN ("%~tZ") DO @(ren "%~dpnxZ" "%~C%~A%~B%~D%~E%~F%~nZ%~xZ")) 

Se si continua a preferire un file batch/CMD, questo è un ri- scrittura dello script per lavorare come il CMD, e ri-scrivere tutti i file in una directory che corrispondono a un determinato modello di ricerca per essere nel formato "YYYYMMDDHHM [Nome] [estensione]"

@(
    SETLOCAL 
    echo off 
    SET "_Skip=NO" 
    Set "_elvl=0" 
) 
IF /I "%~2" EQU "" (
    SET "_Skip=YES" 
) 
IF /I "%~1" EQU "/?" (
    SET "_Skip=YES" 
) 
IF /I "%~1" EQU "?" (
    SET "_Skip=YES" 
) 
IF /I "%_Skip%" EQU "YES" (
    ECHO. Usage: 
    ECHO. 
    ECHO. Rename.bat "Drive:\Path\" "File Glob to match" 
    ECHO. 
    ECHO. Example: 
    ECHO. 
    ECHO. Rename.bat "C:\Users\%Username%\Desktop\" "*.lnk" 
    ECHO. 
    Set "_elvl=2" 
    GOTO :Finish 
) 
ECHO. Searching through "%~1" for Files matching this pattern: "%~2" 
ECHO. 
FOR /R "%~1" %%Z IN (%~2) DO (FOR /F "Tokens=1-6 delims=:-\/. " %%A IN ("%%~tZ") DO (REN "%%~dpnxZ" "%%~C%%~A%%~B%%~D%%~E%%~F%%~nZ%%~xZ)) 
ECHO. 
ECHO. Completed rename of all files matching pattern "%~2" which were found within path: "%~1" 
ECHO. 
:Finish 
(
    EndLocal 
    EXIT /B %_elvl% 
) 
+1

testato, non funzionante ... –

+0

Hello Laercio, Questo è un codice funzionante, tuttavia utilizza il formato di data e ora localizzato per creare l'output e sebbene la risposta non sia specifica, è probabile che ci si trovi in ​​una regione con una Data diversa/localizzazione temporale, quindi la data e l'ora risultanti vengono visualizzate nella sequenza errata. Risolvere questo è solo questione di ri-organizzare le variabili utilizzate per fornire la Data/Ora nella sequenza che ci si aspetta. –

+0

Vedrete su Stack Exchange spesso quando arriva la data e l'ora in cui le persone usano solo i valori localizzati, la domanda di ottenere questo programmaticamente è un problema a sé stante, e probabilmente ha la sua domanda qui, a differenza di Experts-Exchange non c'è Un incentivo, e in effetti un desiderio da parte della comunità di avere risposte approfondite che sono un progetto a pieno titolo, ma invece di fornire risposte più focalizzate sul problema, quindi con Date and Time è più di un po 'di problemi in CMD vedrai le risposte sono sempre localizzate. Se mi dici il tuo formato data/ora, posso dirti cosa cambiare. –