2
votes

copie du fichier batch et déplacement de la base sur le mois en cours

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\"


7 commentaires

@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 veulent couleur .


Pensez à accepter une réponse.


3 Réponses :


0
votes

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


2 commentaires

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



2
votes

Voici une solution possible:

copy "C:\TESTone\*.*" "C:\!month[num]!-YY"
move "C:\TESTone\*.*" "\\172.1.1.1\Shared-File\!_num!-YY\"
  • L'activation de l ' expansion retardée aidera ici, car nous en aurons besoin ici, ni dans un bloc de code ni de l'utiliser lors de la définition et de l'utilisation de la variable sur une ligne. Cela aidera puisque nous voulons faire écho à une variable dont la valeur est le nom d'une autre variable.
  • Définition du tableau des mois. Nous utilisons la forme varname [monthnum] .
  • La recherche de 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.
  • Désormais, le réglage des deux derniers chiffres de l'année est stocké dans la variable YY et les deux chiffres du mois sont stockés dans la variable MM .
  • La commande souhaitée par OP était 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>


3 commentaires

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 "



2
votes

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')


4 commentaires

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")))