2010-08-09 9 views
2

Je voudrais créer une variable d'environnement pour tenir un quelque chose comme nom de fichier:fichier batch Windows - calcul nom de la date actuelle

PREFIX-2010-AUG-09.zip 

Je peux approcher si j'utiliser quelque chose comme ceci:

SET filename=PREFIX-%date:~-4,4%-%date:~-7,2%-%date:~0,2%.zip 

Résultat:

PREFIX-2010-08-09.zip 

mais dans ce cas, je reçois le mois en deux chiffres (08).

Y a-t-il une astuce dans les fichiers batch Windows pour obtenir l'abréviation du mois en trois lettres du mois numérique (par exemple 08 pour "AUG" = août)?

Mise à jour: cela doit être exécuté sur un serveur Windows 2008 R2, et oui, si quelqu'un peut me montrer une solution PowerShell, cela fonctionnerait aussi :-) Merci!

+1

Quelle version de Windows? Le traitement de la date a tendance à différer selon les versions. –

+1

En outre, pouvez-vous utiliser PowerShell? Je parie que cela rendrait cela plus facile. –

+0

@Pekka: Serveur est Win Server 2008 R2, et oui - Powershell fonctionnerait aussi :-) Je dois a) télécharger un fichier depuis FTP, b) le décompresser (c'est là que j'ai besoin du nom de fichier), et c) restaurer à SQL Server –

Répondre

2

C'est quelque chose comme une table:

set month_01=JAN 
set month_02=FEB 
set month_03=MAR 
@rem ... 

set number=02 

for %%a in (month_%number%) do call set month_as_text=%%%%a%% 

echo %month_as_text% 

La valeur %number% dans le for loop est utilisé pour déréférencer le nom de la variable correspondante.

Ou encore plus court:

set number=02 

for /f "tokens=%number%" %%m in ("JAN FEB MAR APR ...") do set month_as_text=%m 

echo %month_as_text% 

EDIT:

Johannes suggère un raccourci pour la 1ère version:

set month_01=JAN 
set month_02=FEB 
set month_03=MAR 
@rem ... 

set number=02 

setlocal enabledelayedexpansion 

set month_as_text=!month_%number%!  

echo %month_as_text% 
+1

Vous pouvez utiliser l'expansion différée pour raccourcir l'accès au tableau '! Mois_% nombre%!'. – Joey

+0

@Johannes: Je n'étais pas sûr à ce sujet et je n'ai pas trouvé de référence rapide. Mais vous devez toujours définir le tableau, c'est pourquoi je préférerais la deuxième solution (plus courte). Je vais ajouter votre suggestion de toute façon, merci. –

+0

Oui, la deuxième option est en effet sympa :-) - malheureusement, cela ne fonctionne que pour un ensemble si restreint d'éléments, puisque le tokenizer ne permet qu'un maximum de 31 jetons. – Joey

1

Vous pouvez toujours faire le numéro à la traduction de textes à la main, comme:

if %MM%==01 set MM=Jan 
if %MM%==02 set MM=Feb 
if %MM%==03 set MM=Mar 
if %MM%==04 set MM=Apr 
etc. 
0

La première réponse est incorrecte pour Août et Septembre. La raison en est que le shell interprète un zéro comme octal, et 08 et 09 ne sont pas des nombres octaux valides. Vous pouvez le voir facilement pour vous-même en exécutant cette commande:

for /f "tokens=08" %a in ("A B C D E F G H I J") do echo %a 

Si vous remplacez le 08 ci-dessus avec 09 il sera également échouer. Cela fonctionnera si vous utilisez 07 ou 10. Une implémentation fonctionnelle est la suivante:

months=JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC 
:: get the month as a 2-digit number 
set number=%date:~4,2% 
:: remove leading zero 
for /f "tokens=* delims=0" %%a in ("%number%") do set number=%%a 
:: index into array to get month name 
for /f "tokens=%number%" %%m in ("%months%") do set month_as_text=%%m 
:: print month name 
echo %month_as_text% 
Questions connexes