Actuellement, j'ai un fichier batch spécifique que je dois exécuter chaque mois. Je voudrais le combiner en un seul fichier chauve-souris. avec condition si le 1er février utilise le 19 février.
Si la date actuelle est janvier 2019, lancez
copy "C:\TESTone\*.*" "C:\Mar-19" move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\Mar-19\"
Si la date actuelle est février 2019, exécutez
copy "C:\TESTone\*.*" "C:\Feb-19" move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\Feb-19\"
Si la date actuelle est mars 2019, exécutez
copy "C:\TESTone\*.*" "C:\Jan-19" move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\Jan-19\"
3 Réponses :
En fonction de vos paramètres régionaux, vous devrez peut-être modifier un peu certains des paramètres du set destFolder =! month: ~% d%, 3! -% date: ~ 8,2% code >, c'est parce que j'insère un écho pour vous montrer d'abord à l'écran ce qui se passe. Aussi une pause à la fin. Une fois débogué, vous pouvez supprimer la pause:
@echo off
setlocal EnableDelayedExpansion
for /F "tokens=1 delims=/" %%m in ("%date%") do (
set /A "m=(1%%m%%100-1)*3"
)
set month=JanFebMarAprMayJunJulAugSepOctNovDec
set destFolder=!month:~%d%,3!-%date:~8,2%
set destFolder1=C:\%destFolder%\
echo copy "C:\TESTone\*.*" %destFolder1%
copy "C:\TESTone\*.*" %destFolder1%
set destFolder2=\\172.1.1.1\Shared-File\%destFolder%\
echo move "C:\TESTone\*.*" %destFolder2%
move "C:\TESTone\*.*" %destFolder2%
pause
Vous devez également utiliser wmic
pour que votre solution fonctionne pour tous. Par exemple pour moi, ça ne marche pas. De plus, où la variable % d%
est-elle définie?
@ double bip: bon à savoir !!! Oui, votre solution est plus précise. J'ai un nouveau conseil maintenant. Merci
Voici une solution possible:
copy "C:\TESTone\*.*" "C:\!month[num]!-YY" move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\!_num!-YY\"
varname [monthnum]
. date
nécessite wmic
, sinon ce ne sera pas international. Les variables d'environnement date
et time
sont définies par l'utilisateur et dépendent généralement des paramètres régionaux de l'utilisateur. YY
et les deux chiffres du mois sont stockés dans la variable MM
. copy "C: \ TESTone \ *. *" "C: \ MMM-YY"
et move "C: \ TESTone \ *. *" "\\ 172.1.1.1 \ Shared-File \ MMM-YY \"
. Donc, YY
est juste prêt, nous avons: copy "C:\TESTone\*.*" "C:\!month[%MM%]!-YY" move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\!month[%MM%]!-YY\"
MMM
est la valeur des variables mois [MM]
. Donc, en utilisant ici l'expansion retardée; encapsulation des variables numériques avec !
et MM
avec %
. Ce sera:
copy "C:\TESTone\*.*" "C:\MMM-%YY%" move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\MMM-%YY%\"
puis:
@echo off setlocal EnableDelayedExpansion set month[01]=Jan set month[02]=Feb set month[03]=Mar set month[04]=Apr set month[05]=May set month[06]=Jun set month[07]=Jul set month[08]=Aug set month[09]=Sep set month[10]=Oct set month[11]=Nov set month[12]=Dec for /f "tokens=2 delims==" %%A in ('wmic OS Get localdatetime /value') do set "dt=%%A" set "YY=%dt:~2,2%" & set "MM=%dt:~4,2%" copy "C:\TESTone\*.*" "C:\!month[%MM%]!-%YY%" move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\!month[%MM%]!-%YY%\" pause
et ensuite en cours de traitement, ce qui est en fait ce que l'OP a demandé. p>
Juste une petite observation ... Pourquoi utilisez-vous la notation "étrange" set _01 = Jan
pour définir le tableau des noms de mois? Vous pouvez également utiliser le standard set month [01] = Jan
qui est beaucoup plus clair! IMHO débutant a besoin de réponses claires et simples, en particulier dans le cas des fichiers Batch qui sont intrinsèquement peu clairs ... Pourquoi insérer une complexité supplémentaire alors que la réponse simple existe? Je vous invite à lire cet article ...
BTW la copie "C: \ TESTone \ *. *" "C: \! _ MM! -% YY%"
ligne dans la description a manqué les signes de pourcentage autour de MM
variable, bien que le code du programme soit correct ...
Je voudrais initialiser le tableau des mois de cette façon: set m = 100 & pour %% a in (Jan Fev ... Dec) do set / A "m + = 1" & set "month [! M: ~ 1! ] = %% a "
Une alternative à wmic pour obtenir une date indépendante des paramètres régionaux / utilisateur est PowerShell,
qui peut directement afficher le format souhaité:
> Q:\Test\2019\01\07\SO_54070456.cmd copy "C:\TESTone\*.*" "C:\Jan-19" move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\Jan-19\"
Voici les seules commandes résultantes en écho:
:: Q:\Test\2019\01\07\SO_54070456.cmd @Echo off for /f "usebackq" %%A in (`powershell -NoP -C "get-date -f 'MMM-yy'"`) Do set "Month=%%A" copy "C:\TESTone\*.*" "C:\%Month%" move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\%Month%\"
PowerShell renverra l'abréviation du mois MMM
avec la culture actuelle, pour sélectionner une culture spéciale différente, utilisez:
(Get-Date) .ToString ('MMM-yy', (New-Object System.Globalization.CultureInfo ("fr-fr")))
Pour trouver une culture, vous pouvez utiliser la fonction .dot Net:
[globalization.cultureinfo] :: GetCultures ('allCultures')
Par curiosité, pourquoi utilisez-vous toujours PowerShell dans les tâches? Il n'est ni demandé ni rejeté dans ce cas. Le problème est que le script s'exécutant après chaque connexion utilisateur, cela prendra un certain temps en raison de la charge de PowerShell. Je pense aussi que le code est incorrect. La sortie dépend fortement des paramètres de langue. Lancer powershell -NoP -C "get-date -f 'MMM-yy'" "
me produit Ιαν-19
.
Eh bien, la formulation locale indépendante
pourrait être malchanceuse dans ce cas. Mais vous voudrez généralement les noms de mois dans votre locale. Si vous en avez besoin, ce n'est pas un problème (Get-Date) .ToString ('MMM-yy', (New-Object System.Globalization.CultureInfo ("en-us")))
. La raison pour laquelle j'aime combiner le batch et le powershell est simplement que j'aime les deux et que PowerShell présente des avantages dans le calcul des dates, l'édition de fichiers, la sélection et le regroupement d'objets en particulier. @ double bip
Bien mieux. Vous pouvez modifier votre réponse en l'incluant.
@ double-bip Juste pour découvrir [globalization.cultureinfo] :: GetCultures ('allCultures') | sls 'gr'
et (Get-Date) .ToString ('MMM-yy' , (New-Object System.Globalization.CultureInfo ("el-GR")))
@catcat le dossier de destination est déjà pré-créé au 19 janvier, 19 février, ... etc.
Eh bien changez-le. On s'adapte à ce qui est facile.
echo% Date: ~ 10,4 %% Date: ~ 7,2 %% Date: ~ 4,2%
est ce que les gens font réellement.Pourquoi voudriez-vous prédéfinir chaque répertoire? cela signifie que chaque année, vous devez créer 12 répertoires manuellement et modifier votre script pour s'adapter à cela. Ce n'est même pas l'automatisation. Vous pouvez simplement laisser le script créer le répertoire à chaque fois s'il n'existe pas et copier les fichiers. Techniquement, vous n'avez plus jamais besoin de faire de maintenance sur le script.
@CatCat
echo% Date: ~ 10,4 %% Date: ~ 7,2 %% Date: ~ 4,2%
ne donnera pas le même résultat pour tout le monde. Les dates système diffèrent en fonction des politiques, des emplacements, des versions du système d'exploitation, etc. Le mien, par exemple, ferait écho à-0-0
Bien sûr, l'utilisation de lots signifie que vous devez prendre en compte les différences régionales. C'est pourquoi l'utilisation d'un langage de programmation NON, comme par lots un langage d'exploitation informatique pour les utilisateurs, est une mauvaise idée. Je ne suis pas non plus en Amérique, mais c'est la région commune pour les langages de programmation. C'est tout ce que je programme et l'orthographe de
couleur
(anglais correct) me piège toujours - les langues veulentcouleur
.Pensez à accepter une réponse.