Calandrier de dossiers
Fermébrucine Messages postés 18327 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 21 décembre 2024 - 12 déc. 2022 à 20:03
- Calandrier de dossiers
- Mettre un mot de passe sur un dossier - Guide
- Impossible de supprimer un dossier - Guide
- Vous avez besoin d'une autorisation de la part de administrateurs pour modifier ce dossier - Guide
- Afficher la taille des dossiers - Guide
- Afficher les dossiers cachés - Guide
6 réponses
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.
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
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 ????
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.
8 déc. 2022 à 20:40
Merci bcp :)
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?
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
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
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
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionJe 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
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...