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
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.
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 :)
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
Jolis liens en bas, merci. –
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