Calandrier de dossiers

Fermé
Chupito - Modifié le 8 déc. 2022 à 19:42
brucine Messages postés 14219 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 17 avril 2024 - 12 déc. 2022 à 20:03

Bonjour à tous,

Je ne suis pas très doué pour écrire un script, d’où mon post ...

je cherche à réaliser un calendrier de dossier.

je m’explique, je souhaite créer un fichier batch qui demande quelle année créer avec l’arborescence :

01.janvier

02.février 

etc…

dans chaque mois, le nombre de dossier nommé par jour. 01,02,03 est suffisant ????

la difficulté majeur, de lundi à jeudi 1 seul dossier, pour vendredi, samedi et dimanche un dossier pour les 3jours. Il peut être nommé 06-07-08 par ex.

dans chaque dossier je dois créer des sous dossiers par pause (06-14,14-22,22-06) excepté le dimanche (06-18,18-06).

J’ai réussi à créer un batch mais le code est pas très lisible de 1 et surtout ça ne prend pas en compte la date. Ce qui me bloque actuellement…

d’avance merci à tous pour votre lecture et j’espère avoir un retour positif pour tester un script  

Bonne journée 

Bav

6 réponses

barnabe0057 Messages postés 14439 Date d'inscription lundi 2 mars 2009 Statut Contributeur Dernière intervention 14 avril 2024 4 905
Modifié le 12 déc. 2022 à 19:38

Bonjour,

Je me joins à vous deux, voilà ma proposition :

@echo off
chcp 65001 >nul
setlocal enableextensions enabledelayedexpansion

set "destination=%USERPROFILE%\Desktop"

: --------------------------------------------------------------------------------------
rem on sélectionne l'année dont on veut créer l'arborescence
: --------------------------------------------------------------------------------------

:debut

cd /d %destination% || exit /b 1
echo. & set "annee="
set /p annee="Quelle année voulez-vous créer ? "
if not defined annee (goto :debut)
if not exist "%annee%" (mkdir "%annee%")
cd %annee%

: --------------------------------------------------------------------------------------
rem on détermine si l'année est bissextile
: --------------------------------------------------------------------------------------

set "anneebis=false"
set /a result=%annee% %% 4

if !result! EQU 0 (
	set /a result=%annee% %% 100
	if !result! EQU 0 (
		set /a result=%annee% %% 400
		if !result! NEQ 0 (set "anneebis=false") else (set "anneebis=true")
	) else (set "anneebis=true")
)

if "%anneebis%"=="true" (echo. & echo ^>^>^> L'année %annee% est une année bissextile)

: --------------------------------------------------------------------------------------
rem on détermine le nom du premier jour de l'année
: --------------------------------------------------------------------------------------

for /f "delims=" %%A in ('powershell "(get-date('01.01.%annee%')).ToString('ddd dd')"') do (
	set "first=%%A"
	set "first=!first:~0,3!"
)

: --------------------------------------------------------------------------------------
rem on détermine la position (de 1 à 7) du jour dans la semaine
: --------------------------------------------------------------------------------------

set /a index=0

for %%A in (lun mar mer jeu ven sam dim) do (
	set /a index+=1
	if !first!==%%A (set /a numposjour=!index!)
)

if !numposjour! EQU 1 (set /a numposjour=7) else (set /a numposjour-=1)

: --------------------------------------------------------------------------------------
rem on crée les 12 dossiers correspondants aux mois
: --------------------------------------------------------------------------------------

echo. & set /a index=0

for %%A in (janvier fevrier mars avril mai juin juillet aout septembre octobre novembre decembre) do (
	set /a index+=1
	set "nummois=0!index!"
	set "nummois=!nummois:~-2!"
	if not exist "!nummois!.%%A" (mkdir "!nummois!.%%A")
	echo.!nummois!.%%A

	pushd "!nummois!.%%A"
	echo !nummois! | findstr "01 03 05 07 08 10 12" >nul && call :creationJours 31
	echo !nummois! | findstr "04 06 09 11" >nul && call :creationJours 30
	echo !nummois! | findstr "02" >nul && if "!anneebis!"=="true" (call :creationJours 29) else (call :creationJours 28)
	popd
)

echo. & pause
exit

: --------------------------------------------------------------------------------------
rem on crée tous les jours de travail du mois
: --------------------------------------------------------------------------------------

:creationJours

for /L %%B in (1,1,%1) do (
	set /a numposjour+=1
	if !numposjour! GTR 7 (set /a numposjour=1)
	
	rem si le mois commence, on décroche les wagons
	if %%B EQU 1 (set "dossier=")

	set "jour=0%%B"
	set "jour=!jour:~-2!"
	
	if !numposjour! GEQ 1 (
		if !numposjour! LEQ 4 (
			if not exist "!jour!" (mkdir "!jour!")
			call :creationSousDossiers "!jour!"
		)
	)

	if !numposjour! GTR 4 (if !numposjour! LEQ 7 (set "dossier=!dossier!-!jour!"))

	rem si le mois est fini, on décroche les wagons
	if %%B EQU %1 (call :dossierWeekEnd) else (if !numposjour! EQU 7 (call :dossierWeekEnd))
)
 	 
goto :eof

: --------------------------------------------------------------------------------------
rem on crée un dossier qui regroupe le vendredi-samedi-dimanche
: --------------------------------------------------------------------------------------

:dossierWeekEnd

if not defined dossier (set "dossier=!jour!") else (set "dossier=!dossier:~1!")

if not exist "!dossier!*" (
	if !numposjour! NEQ 7 (set "dossier=!dossier!-")
	if not exist "!dossier!" (mkdir "!dossier!")
	call :creationSousDossiers "!dossier!"
	set "dossier="
)

goto :eof

: --------------------------------------------------------------------------------------
rem on crée les sous-dossiers correspondants aux horaires de travail
: --------------------------------------------------------------------------------------

:creationSousDossiers

set "restant=%~1"
set /a elements=0

:boucle
for /f "tokens=1,* delims=-" %%A in ("!restant!") do set "numero=%%A" & set "restant=%%B"
if defined restant (set /a elements+=1 & goto :boucle)

set "restant=%~1"

:traitement
for /f "tokens=1,* delims=-" %%A in ("!restant!") do set "numero=%%A" & set "restant=%%B"
set /a derive=!numposjour!-!elements!
if !derive! LSS 1 (set /a derive=!derive!+7)

if not "%~1"=="!numero!" (if not "%~1"=="!numero!-" (set "parent=%~1\!numero!") else (set "parent=%~1")) else (set "parent=%~1")

if !derive! EQU 7 (
	mkdir "!parent!\06-18"
	mkdir "!parent!\18-06"
) else (
	mkdir "!parent!\06-14"
	mkdir "!parent!\14-22"
	mkdir "!parent!\22-06"
)

if defined restant (set /a elements-=1 & goto :traitement)

goto :eof

-

Ce script devrait être nettement plus rapide que celui de brucine car il y a moins d'appels à Powershell, à vrai dire il y a un seul appel.

Par contre mon code est beaucoup moins joli que celui de brucine.

Le cahier des charges est complexe à gérer, mais pas impossible.



1
brucine Messages postés 14219 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 17 avril 2024 1 792
12 déc. 2022 à 20:03

Bonsoir,

Eh oui, on voit les pros...

Je me suis pris les pieds dans le tapis à vouloir mettre les week-ends à cheval sur deux mois entièrement dans le précédent et du coup, je ne suis pas arrivé à chaîner correctement à la fois le nom du mois et son numéro sans rendre des erreurs de calcul de ces week-ends.

Cela dit, ni Batch ni Powershell ne sont les outils appropriés pour ça, le premier n'entend rien à la date et le deuxième n'est pas fichu de renvoyer simultanément le résultat d'une même boucle de date en séparant les morceaux du formatage (numéro, nom...) vers des variables différentes.

Il paraît que VBS ou JS dont ça en trois coups de cuiller à pot mais, pour moi, ce sont juste des mots...

 

0
brucine Messages postés 14219 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 17 avril 2024 1 792
8 déc. 2022 à 19:54

Bonjour,

Je ne suis pas sûr de comprendre ta demande, tu parles bien de dossiers?

Tout est toujours possible, mais ça va être infernal à gérer, 12 dossiers avec chacun une vingtaine de sous-dossiers en contenant eux-mêmes 3 ou 4, et il y aura quoi, dans ces dossiers?

La démarche que tu évoques passe plus volontiers par un planning Excel/Libre Office

0

Oui je parle bien de répertoire « dossier ». 
je voudrais avoir automatisé la création journalière de dossier pour ne plus à le faire chaque jour voir semaine quand j’ai plus de temps libre …
j’ai réussi à créer un *.bat pour l’année avec tous les sous dossiers grâce à du xcopy mais pour la création en mkdir en fonction de la date je suis un peu perdu ????

0
brucine Messages postés 14219 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 17 avril 2024 1 792 > Chupito
8 déc. 2022 à 20:22

C'est relativement complexe et surtout long, ton affaire. Il n'y a bien sûr aucune difficulté à créer un dossier par an et 12 sous-dossiers par mois, pour les pauses non plus, ça va se compliquer un peu en calculant le nombre de jours de chaque mois et le nom du jour correspondant.

J'essaie de voir ça ce soir ou demain, je reviens vers toi.

0
Chupito > brucine Messages postés 14219 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 17 avril 2024
8 déc. 2022 à 20:40

Merci bcp :)

0
brucine Messages postés 14219 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 17 avril 2024 1 792 > Chupito
10 déc. 2022 à 07:34

Bonjour,

Je ne t'oublie pas, mais je n'ai pas eu beaucoup de temps et la chose est compliquée.

Le batch gère très mal les dates, et ça y est à peu près impossible sauf un script d'un kilomètre ou passer par un utilitaire tiers y gérant les dates, ce n'est pas le but, les solutions reposant plutôt sur VBS ou PowerShell (pourquoi pas dans ce dernier cas à l'intérieur d'un batch) et où je ne suis en plus pas très bon.

Il n'y a pas de difficulté à faire pour chaque mois un nombre de dossiers de date fixes (mais ce qui amènerait à tuer ensuite à la main le 31 mars ou le 30 février voire le 29 sauf à inclure une condition d'année bissextile dans le script, ça, ce n'est pas très difficile); elle réside à ce que les mois n'ont pas le même nombre de jours et à ce que l'option vendredi-samedi-dimanche n'est pas possible dès lors que, schématisons, par exemple le vendredi est le 30 ou le samedi le 1er: on va alors déborder sur le mois précédent ou suivant, et il faut alors choisir de mettre la période entière soit sur le mois précédent ou suivant, soit en double sur les deux, à préciser.

Avant que je m'arrache ce qui me reste de cheveux, j'ai fait une structure avec le dossier parent "2023" et les enfants "01",
"02"...: ça, c'est un problème de détail, c'est bien ces appellations que tu souhaites ou d'autres?

0

Je te remercie …

j’ai déjà mon batch fonctionnel pour l’année. Mais sans gestion des dates encore.

je regarde aussi les fonctions de powershell, il semble bien plus adapté pour la gestion des dates.

mais je découvre aussi donc j’essaye de tester ça lundi soir, we charge oblige. 

bon we à toi 

0
brucine Messages postés 14219 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 17 avril 2024 1 792
10 déc. 2022 à 14:39

Là, apparemment, on est bon mais contrôle quand même; les week-ends à cheval sur 2 mois font partie du mois précédent.
Je ne suis pas une flèche en PowerShell, il y a sûrement plus court à écrire, et aussi à exécuter: pour entrer toute l'année, ça prend un moment.

Et bien sûr, j'ai enregistré le résultat sur une partition E:\, à chacun de préciser celle de destination.
 

@echo off
REM entrer an au format 01.01.aaaa
set "_an=01.01.2020"
set _numan=%_an:~6,4% 
set "_sem1=06-14"
set "_sem2=14-22"
set "_sem3=22-06"
set "_we1=06-18"
set "_we2=18-06"
IF NOT EXIST E:\%_numan% MD E:\%_numan%

for /l %%d in (0,1,11) do (
  for /f "delims=" %%a in ('powershell "(get-date('%_an%')).AddMonths(+%%d).ToString('dd.MM.yyyy')"') do set _mois=%%a & call :process1
)

:process1
set _nummois=%_mois:~3,2%
FOR %%g IN (01 03 05 07 08 10 12) DO IF %_nummois%==%%g (
 for /l %%e in (0,1,30) do (
  for /f "delims=" %%h in ('powershell "(get-date('%_mois%')).AddDays(+%%e).ToString('ddd dd')"') do set _date=%%h & call :process2
)
)
FOR %%g IN (04 06 09 11) DO IF %_nummois%==%%g (
 for /l %%e in (0,1,29) do (
  for /f "delims=" %%h in ('powershell "(get-date('%_mois%')).AddDays(+%%e).ToString('ddd dd')"') do set _date=%%h & call :process2
)
)
FOR %%g IN (02) DO IF %_nummois%==%%g (
 for /l %%e in (0,1,27) do (
  for /f "delims=" %%h in ('powershell "(get-date('%_mois%')).AddDays(+%%e).ToString('ddd dd')"') do set _date=%%h & call :process2
)
)

:process2
set /a isleap=%_numan% %% 4
if %isleap%==0 (set fev=29) else (set fev=28)
for %%r in (04 06 09 11) do if %_nummois%==%%r set fdm=30
for %%r in (01 03 05 07 08 10 12) do if %_nummois%==%%r set fdm=31
for %%r in (02) do if %_nummois%==%%r set fdm=%fev%
set /A "fdm1=fdm-1"
set /A "fdm2=fdm-2"
set _nomjour=%_date:~0,3%
set _numjour=%_date:~5,2%
set /A "_numjour1=_numjour+1"
set/A "_numjour2=_numjour+2"
CD /D E:\%_numan%
IF %_nomjour%==lun (
 MD %_nummois%\%_numjour%
 MD %_nummois%\%_numjour%\%_sem1%
 MD %_nummois%\%_numjour%\%_sem2%
 MD %_nummois%\%_numjour%\%_sem3%
)
IF %_nomjour%==mar (
 MD %_nummois%\%_numjour%
 MD %_nummois%\%_numjour%\%_sem1%
 MD %_nummois%\%_numjour%\%_sem2%
 MD %_nummois%\%_numjour%\%_sem3%
)
IF %_nomjour%==mer (
 MD %_nummois%\%_numjour%
 MD %_nummois%\%_numjour%\%_sem1%
 MD %_nummois%\%_numjour%\%_sem2%
 MD %_nummois%\%_numjour%\%_sem3%
)
IF %_nomjour%==jeu (
 MD %_nummois%\%_numjour%
 MD %_nummois%\%_numjour%\%_sem1%
 MD %_nummois%\%_numjour%\%_sem2%
 MD %_nummois%\%_numjour%\%_sem3%
)
IF %_nomjour%==ven (
   IF %_numjour% LEQ %fdm2% (
     MD %_nummois%\%_numjour%-%_numjour1%-%_numjour2%
     MD %_nummois%\%_numjour%-%_numjour1%-%_numjour2%\%_we1%
     MD %_nummois%\%_numjour%-%_numjour1%-%_numjour2%\%_we2%
   )
)
IF %_nomjour%==ven (
   IF %_numjour%==%fdm1% (
     MD %_nummois%\%_numjour%-%_numjour1%-01
     MD %_nummois%\%_numjour%-%_numjour1%-01\%_we1%
     MD %_nummois%\%_numjour%-%_numjour1%-01\%_we2%
   )
)
IF %_nomjour%==ven (
   IF %_numjour%==%fdm% (
     MD %_nummois%\%_numjour%-01-02
     MD %_nummois%\%_numjour%-01-02\%_we1%
     MD %_nummois%\%_numjour%-01-02\%_we2%
   )
)

:EOF
1

Wouaw joli script. 

encore merci

je n’aurais pas accès au pc avant lundi soir, je testerais ça direct et je reviendrais vers toi ????

bon week-end  

0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question

Je viens de tester, c’est long à créer mais c’est pas un problème. Vraiment très bien fait, merci pour ton travail! 
 

y aurait-il possibilité de faire des petites améliorations pour qu’il soit parfaitement adapté à mon besoin?

1. Nommer les 12 mois de l’année en 01.janvier

2. Et la ou ca se complique c’est que les sous dossiers 06-18 et 18-06, doivent être créé uniquement les dimanches. Cad que dans le dossier ex. 03-04-05 il faut un sous dossier 03 avec sous dossier 06-14 + 14-22 + 22-06 idem pour 04, idem dans 05 mais juste avec le 06-18 + 18-06.

pour ouvrir une fenêtre demandant la date de l’année pour la création je trouverais bien, idem pour la création du script dans le dossier ou il est lancé. 
 

d’avance merci …

bat

0

Génial ! Merci bcp barnabe0057. 
 

oui j’avoue que la demande est vraiment pas simple…

merci à tous les deux pour votre travail.

0