Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[PS] Calendrier visuel PowerShell ...

29 réponses
Avatar
Jean
#---8<---gadget-calendar.ps1---Jean-JMST-Belgium---8<---

#=6/2006=====================================Version 0=#
#=========== "human readable" grid calendar ==========#
#
# To test :
#
# .\gadget-calendar
# °shows month calendar with current day
# highlighted (red on white by default)
# .\gadget-calendar "6/2006"|tee -file calendar.txt
# .\gadget-calendar "june 2006"|tee -file calendar.txt
# .\gadget-calendar "juin 2006"|tee -file calendar.txt
# °outputs june 2006 month grid and writes it
# to calendar.txt file
# .\gadget-calendar -fullyear 2006|tee -file calendar.txt
# °outputs full year 2006 grid (3 x 4) and writes it
# to calendar.txt file
#
# NOTE : gadget-calendar without parameters doesn't
# highlight current day if you call it directly
# after you've launched PowerShell (probably a
# console bug).
# If you recall gagdet-calendar, that works.
#
#======================================================#

param(
[string]$strdate=(get-date),
[ConsoleColor]$calendarbg='DarkGray',
[ConsoleColor]$monthyearfg='Cyan',
[ConsoleColor]$daynamefg='DarkBlue',
[ConsoleColor]$dayfg='White',
[ConsoleColor]$highlightdayfg='Red',
[ConsoleColor]$highlightdaybg='White',
[int32]$fullyear
)

#### Build an array of two first letters ####
#### localized days names ####

$firstdate=[datetime](0)
$daysnames=@(0..6)|%{
($_=$firstdate.ToString("dddd").SubString(0,2))
$firstdate=$firstdate.AddDays(1)
}

function build_date_table($date){
#### Returns an array containing days numbers ####
#### and month name ####

## Sets variables containing month and year of the date ##
$m=$date.Month
$y=$date.Year
## Get month's first day position in the week ##
[datetime]$firstday=[string]$m+'/'+[string]$y
$fd=[int]$firstday.DayOfWeek
## As "dayofweek" is 0 indexed from Sunday to ##
## Saturday and we want from Monday to Sunday we ##
## use a "1 indexed" concept : ##
if($fd -eq 0){$fd=7}
## Sets a variable containing the number ##
## of days in the month ##
$ld=(Get-Culture).Calendar.GetDaysInMonth($y,$m)
## Build an array containing days numbers relative ##
## to days names positions. ##
## If a position is not used, the value is set to ##
## a space char. ##
$table=@()

for($i=0;$i -lt $fd-1+$ld;$i++){
if($i+1 -lt $fd)
{$table+=' '*2}
else
{$table+=[string]($i-$fd+2)}
if($table[$table.Length-1].Length -eq 1)
{$table[$table.Length-1]+=' '}
if(($i+1) % 7 -eq 0)
{
$table[$table.Length-1]+=' '
if(!($table[$table.Length-1].Trim() -eq $ld))
{$table[$table.Length-1]+='`n'}
}
}
## Adds some extra space chars needed for formating output##
for($i=0;$i -lt $table.Length % 7)
{$table+=' '*2}
if($table[$table.Length-1] -eq ' '*2)
{$table[$table.Length-1]+=' '}
## get Month/Year localized string ##
$monthyear=$date.ToString("MMMM yyyy")
$monthyear=(' '*((21-$monthyear.Length)/2))+$monthyear
$monthyear+=(' '*(21-$monthyear.Length))+' '
return $table,$monthyear
}#end function build_date_table

#### Writes + colorizes calendar grid ####

$rui=$host.UI.RawUI
## Stores current background/foreground console's colors ##
$oldfg=$rui.ForegroundColor
$oldbg=$rui.BackgroundColor
## Set console's colors for Month/Year line and grid ##
$rui.BackgroundColor=$calendarbg

if(!$fullyear){
$monthtable=build_date_table(get-date $strdate)
$monthyear=$monthtable[1]
$daystable=$monthtable[0]
$rui.ForegroundColor=$monthyearfg
## Ouputs month/year line ##
[string]$monthyear
## Set days names line foreground color ##
$rui.ForegroundColor=$daynamefg
## Outputs day names ##
' '+[string]$daysnames+' '
## Set days numbers foreground color ##
$rui.ForegroundColor=$dayfg

if($strdate -ne (get-date))
## Outputs calendar month grid ##
{(' '+([string]($daystable))).Split('`n')|%{$_}}
else
## Shows current month grid and highlight current day ##
{
($daystable)|
%{
write-host (' ') -NoNewLine
if($_.Trim() -eq (get-date $strdate).Day)
{
write-host ($_) `
-NoNewLine `
-ForegroundColor $highlightdayfg `
-BackgroundColor $highlightdaybg
}
else
{write-host ($_) -NoNewLine}
}
write-host '`r'
}
}else{
## Outputs full year grid ##
$yeartable=@(0..11)
$year=[string]$fullyear
$monthnames=@()
for($i=1;$i -lt 13;$i++){
$monthdays=
build_date_table(get-date([string]$i+'/'+$year))
$yeartable[$i-1]=
((' '+[string]($monthdays)[0]).Split('`n'))
$monthnames+=($monthdays[1])
}
for($i=0;$i -lt 12;$i+=3){
$rui.ForegroundColor=$monthyearfg
$monthnames[$i]+$monthnames[$i+1]+$monthnames[$i+2]
$rui.ForegroundColor=$daynamefg
((' '+[string]$daysnames+' ')*3)
$max=(
(
$yeartable[$i].length,`
$yeartable[$i+1].length,`
$yeartable[$i+2].length
)|sort
)[2]
for($j=0;$j -lt 3;$j++){
if($yeartable[$i+$j].Length -lt $max)
{$yeartable[$i+$j]+=' '*22}
}
$rui.ForegroundColor=$dayfg
for($j=0;$j -lt $max;$j++)
{
(
$yeartable[$i][$j]+
$yeartable[$i+1][$j]+
$yeartable[$i+2][$j]
)
}
''
}
}
## Restores console's background/foreground colors ##
$rui.ForegroundColor=$oldfg
$rui.BackgroundColor=$oldbg

#---8<---gadget-calendar.ps1---Jean-JMST-Belgium---8<---

# Amicalement,

--
Jean - JMST
Belgium

10 réponses

1 2 3
Avatar
Jacques Barathon [MS]
"Jean" wrote in message
news:
<snip>
De plus la période d'observation ne peut être que bénéfique.
Je constate que je n'ai apparemment pas le problème aujourd'hui.
Mais je constate aussi que ce jour est en fin de ligne, peut être y a-t-il
un rapport.

On y reviendra sûrement.
Mais ce qui pourrait déjà aider c'est de dire si vous rencontrez aussi ce
problème (quitte a essayer avec la date d'hier).


Curieux: j'avais le problème avec la date d'aujourd'hui quand j'ai fait le
test ce matin, mais là ça marche, alors que j'ai redémarré mon poste et
qu'il s'agit de ma première session PowerShell. Curieux!

Et je viens de faire le test de mettre la date au 17 juin, j'ai ouvert une
nouvelle session PowerShell: ça marche aussi. Alors? Le bug est arrivé à
expiration? :-)

A noter qu'il y a parfois des problèmes de colorisation (le background qui
persiste un peu après l'exécution) avec -fullyear.


Oui, le problème apparaît également si on passe un paramètre incorrect: le
message d'erreur hérite des couleurs gris foncé et gris clair.

Suite à la prochaine averse :O)


J'attends avec impatience la suite ... et la prochaine averse aussi,
d'ailleurs. Car le micro-climat tropical belge s'est étendu sur l'Essonne!

Jacques

Avatar
Jacques Barathon [MS]
Superbe gadget, merci Jean! Je n'avais pas noté qu'il pleuvait si fort en
Belgique ces derniers jours :-)

"Jean" wrote in message
news:
#---8<---gadget-calendar.ps1---Jean-JMST-Belgium---8<---
<snip>

# NOTE : gadget-calendar without parameters doesn't
# highlight current day if you call it directly
# after you've launched PowerShell (probably a
# console bug).
# If you recall gagdet-calendar, that works.


As-tu ouvert un bug?

Jacques

Avatar
Jacques Barathon [MS]
"Michel Claveau" <Enleverles wrote in message
news:
Pour info, voici une version PeJBshell :

.pyt
import calendar


Pff... Comparer un script avec une bibliothèque toute faite, quelle honte...
Il existe également une classe Calendar en .NET, mais il semble qu'elle soit
uniquement prévue pour un affichage dans une page web, même s'il doit être
possible de détourner la méthode RenderControl() pour récupérer l'affichage
en mode texte.

print calendar.month(2006,6) #visualise un mois
print calendar.prcal(2006) #visualise une année


Un extrait du résultat en pièce jointe.


Tu peux afficher les noms de mois et de jours en français?
Et comment tu surlignes la date du jour?

Je sais, je pinaille. :-)

Jacques

Avatar
Jean
Superbe gadget, merci Jean! Je n'avais pas noté qu'il pleuvait si fort en
Belgique ces derniers jours :-)



Maintenant c'est tropical.
Un micro-climat ici je vous dis :O)

As-tu ouvert un bug?



Pas pour l'instant.
Il faudrait d'abord isoler le problème et proposer un code plus court
pour la reproduction.

De plus la période d'observation ne peut être que bénéfique.
Je constate que je n'ai apparemment pas le problème aujourd'hui.
Mais je constate aussi que ce jour est en fin de ligne, peut être y
a-t-il un rapport.

On y reviendra sûrement.
Mais ce qui pourrait déjà aider c'est de dire si vous rencontrez aussi
ce problème (quitte a essayer avec la date d'hier).

A noter qu'il y a parfois des problèmes de colorisation (le background
qui persiste un peu après l'exécution) avec -fullyear.
Dans un cas comme dans l'autre un clear-host préalable "résoud" le
problème.

Suite à la prochaine averse :O)

Jacques


Amicalement,

--
Jean - JMST
Belgium

Avatar
Jean
Pour info, voici une version PeJBshell :


Je n'aurai qu'un mot : canaillou ! :O)

Amicalement,

--
Jean - JMST
Belgium

Avatar
Jean
Il existe également une classe Calendar en .NET, mais il semble qu'elle soit
uniquement prévue pour un affichage dans une page web, même s'il doit être
possible de détourner la méthode RenderControl() pour récupérer l'affichage
en mode texte.


J'avais fait quelques essais infructueux de ce côté là mais il faudra
peut être insister un peu.

Amicalement,

--
Jean - JMST
Belgium

Avatar
Jean
"Jean" wrote in message
news:
<snip>
De plus la période d'observation ne peut être que bénéfique.
Je constate que je n'ai apparemment pas le problème aujourd'hui.
Mais je constate aussi que ce jour est en fin de ligne, peut être y a-t-il
un rapport.

On y reviendra sûrement.
Mais ce qui pourrait déjà aider c'est de dire si vous rencontrez aussi ce
problème (quitte a essayer avec la date d'hier).


Curieux: j'avais le problème avec la date d'aujourd'hui quand j'ai fait le
test ce matin, mais là ça marche, alors que j'ai redémarré mon poste et qu'il
s'agit de ma première session PowerShell. Curieux!



C'est le moins que l'on puisse dire :-)

Et je viens de faire le test de mettre la date au 17 juin, j'ai ouvert une
nouvelle session PowerShell: ça marche aussi. Alors? Le bug est arrivé à
expiration? :-)



Ca ne le fait peut être *que* les jours de pluie :O)

A noter qu'il y a parfois des problèmes de colorisation (le background qui
persiste un peu après l'exécution) avec -fullyear.


Oui, le problème apparaît également si on passe un paramètre incorrect: le
message d'erreur hérite des couleurs gris foncé et gris clair.



Ca j'arrive a le reproduire (pas la mise en évidence du jour, mais
c'est peut être lié).

Cf code de bug-color.ps1 en fin de message.

Ici pas besoin de fermer et réouvrir la console.
Quand le problème survient il suffit de faire un cls pour recommencer.

Si j'exécute 3 fois :

(0..99)|%{.bug-color.ps1}

ou 1 fois :

cls
(0..299)|%{.bug-color.ps1}

le problème apparait en fin de boucle : à la 298 ème ligne écrite pour
les 3 passes, à la 300 ème pour la passe unique.

Il semble donc que c'est à partir de la 300 ème ligne.
Dans le cas des 3 passes, je suppose qu'il faut ajouter les 2 lignes de
prompt (quand on réexécute la boucle).
J'ai constaté que la longueur de la ligne n'avait pas d'importance.

Ca voudrait donc dire qu'il "faut" faire un cls toute les 300 lignes
(mise en couleur ou non) écrites dans la console si on veut jouer avec
les couleurs.
C'est un peu comme si à la 300 ème, $host.UI.RawUI n'était plus
accessible.

J'ai fait un get-variable pour voir si il n'y avait une variable qui
mettrait une limite mais je n'ai rien vu.

C'est donc une partie du problème.

Si le résultat est le même chez vous et si vous estimez que c'est assez
pour soumettre un bug, ne vous gênez pas :-) (peut être soumettre sur
le groupe anglais avant).

Reste le problème de la mise en évidence du jour ... mais c'est plus
long a tester parcequ'il faut redémarrer la console à chaque fois.

#---8<---bug-color.ps1---8<---
param(
[ConsoleColor]$bgcolor1='DarkGray',
[ConsoleColor]$fgcolor1='White'
)

$rui=$host.UI.RawUI

$oldbg=$rui.BackgroundColor
$oldfg=$rui.ForegroundColor

$rui.BackgroundColor=$bgcolor1
$rui.ForegroundColor=$fgcolor1

write-host '0'

$rui.ForegroundColor=$oldfg
$rui.BackgroundColor=$oldbg
#---8<---bug-color.ps1---8<---

Amicalement,

--
Jean - JMST
Belgium


Avatar
Méta-MCI
Salut !

Faut dire que j'ai eu la chance que tu poses ton choix sur une
fonctionnalité pour laquelle Python possède une librairie standard qui a les
fonctions "texte" très similaires à ta démarche. Ce ne sera pas toujours
pareil.

@+

MCI
Avatar
Jean
Il semble donc que c'est à partir de la 300 ème ligne.


Et je constate que 300 est le nombre de lignes maximum affichable dans
ma console (avec l'ascenceur).
Il faut sans doute adapter le code ci dessous en fonction de ce
paramètre, par ex :

(1..300)|%{$_}

Voici le nouveau code de test plus simple a utiliser :

#---8<---color.ps1---8<---
$rui=$host.UI.RawUI

$oldbg=$rui.BackgroundColor
$oldfg=$rui.ForegroundColor

$rui.BackgroundColor='DarkGray'
$rui.ForegroundColor='White'

(1..300)|%{$_}

$rui.ForegroundColor=$oldfg
$rui.BackgroundColor=$oldbg
#---8<---color.ps1---8<---

Amicalement,

PS: discussion ouverte sur le groupe EN aussi

--
Jean - JMST
Belgium

Avatar
Michel Claveau
Bonjour !

300 lignes, c'est le paramètre par défaut. Cela se change, avec un
clic-droit + propriétés, onglet Options & "historique des commandes"
(sur l'icone qui a servi à lancer la console).

J'espère que cela t'aura consolé.

--
@-salutations

Michel Claveau
1 2 3