2009-02-05 8 views
1

Je dois écrire un script batch/dos dans Windows qui mettra les fichiers dans la boîte UNIX. Mais le chemin et les noms de fichiers sont modifiés chaque année et mois respectivement dans Windows. Supposons un répertoire dans Windows au chemin C:/2009MICS qui contiendra les fichiers pour toute l'année (12 fichiers). Mon lot fonctionnera tous les mois et ne sélectionnera les fichiers que pour les mois respectifs. Par exemple, si mon lot est en cours d'exécution en février 09. Il devrait choisir et transférer le fichier pour février mois à partir du dossier 2009MICS.DOS Script pour prendre le nom de fichier et le chemin dyanmically basé sur la date

Répondre

1
copy "%date:~6%.txt" "\path\to\destination" 

copierait le fichier 2009.txt dans le chemin de destination. Pour inclure le mois, utilisez

copy "%date:~3%.txt" "\path\to\destination" 

Disclaimer - Je l'ai testé que sur une édition allemande de Win Vista, espérons que cela fonctionne avec les éditions internationales.

+0

Cela n'a rien à voir avec la langue de l'OS, plus avec les paramètres régionaux. Les trucs de date/heure dans cmd sont intrinsèquement fragiles puisque vous n'obtenez que des dates localisées au lieu des dates culturellement neutres. Pour moi, en utilisant les dates standard de l'ISO 8601 (AAAA-MM-JJ), cela se casserait, par exemple. Mais je n'ai pas trouvé de meilleure solution jusqu'à présent; Vous devez simplement savoir que cela ne fonctionnera pas avec des formats de date différents. – Joey

0

Je vois deux façons différentes d'interpréter ce que vous demandez ..

La date conduite par le jour où vous exécutez le script, donc en fait en utilisant la date du système, ou conduit par la date du fichier des fichiers être copié?

Phil a un bon point, mais le verrouillage du processus de datation à la date actuelle jinx votre sorte si vous ne parvenez pas à activer le sctipt à une date donnée et essayer de le faire plus tard, comme 1er mars ..

pour la partie du fichier, je ferais quelque chose comme:

@echo off 
setlocal ENABLEDELAYEDEXPANSION 
pushd C:\2009MICS 
for /F "delims=" %%f in ('dir /b /a-d') do (
    for /f "tokens=2 delims=- " %%t in ("%%~tf") do set TimeStamp=%%t 
    if not exist !TimeStamp!\ mkdir !TimeStamp!\ 
    copy %%f !TimeStamp!\ >nul 
) 
exit /b 

J'espère que je suis la bonne question, sinon c'est un bon départ ici :)

1

une approche serait de récupérer la date d'aujourd'hui dans l'environnement vars avec GetDate.cmd (à la fin). A partir de ce que vous pouvez comparer la variable %mm% (mois en cours) avec le mois de datestamp du fichier avec quelque chose comme ceci:

@echo off 
    :: see http://ss64.com/nt/syntax-args.html 
    for %%f in (*.bat) do (
    echo. 
    echo Parameter '~tf' reports '%%~tf' for '%%f' 

    :: see http://ss64.com/nt/for_f.html 
    echo. 
    for /f "tokens=1-2" %%g in ("%%~tf") do (
     echo the file date %%g 
     echo the file time %%h 
     ) 

    for /f "tokens=1-3 delims=- " %%i in ("%%~tf") do (
     echo the year  %%i 
     echo the month %%j 
     echo the day  %%k 
     ) 

    ) 

Résultat:

Parameter '~tf' reports '2009-08-28 11:52 AM' for 'test-date.bat' 

    the file date 2009-08-28 
    the file time 11:52 
    the year  2009 
    the month 08 
    the day  28 

Vous pouvez utiliser la structure de jeton similaire pour analyser la date hors du nom de fichier si le datestamp n'est pas fiable/utilisé.

::GetDate.cmd - Source: http://ss64.com/nt/syntax-getdate.html : 
    @echo off 
    SETLOCAL 
    FOR /f "tokens=1-4 delims=/-. " %%G IN ('date /t') DO (call :s_fixdate %%G %%H %%I %%J) 
    goto :s_print_the_date 

    :s_fixdate 
    if "%1:~0,1%" GTR "9" shift 
    FOR /f "skip=1 tokens=2-4 delims=(-)" %%G IN ('echo.^|date') DO (
     set %%G=%1&set %%H=%2&set %%I=%3) 
    goto :eof 

    :s_print_the_date 
    echo Month:[%mm%] Day:[%dd%] Year:[%yy%] 
    ENDLOCAL 
    SET mm=%mm%&SET dd=%dd%&SET yy=%yy% 

Pour en savoir plus:

http://ss64.com/nt/syntax-getdate.html - date de retour dans l'environnement vars indépendant des paramètres de date régionaux http://ss64.com/nt/syntax-datemath.html - Ajoutez ou soustrayez jours à une date http://ss64.com/nt/syntax-delolder.html - Supprimer les fichiers de plus de N jours à partir d'un seul dossier

+0

Jolis liens en bas, merci. –

Questions connexes