Codes et commandes pratiques

Bonjour
Je tombe parfois, ou parfois je l’assemble, sur des commandes ou des bouts de code pratique, je compte les stocker dans ce sujet au fil du temps. Cela restera du script a taille lisible donc pas des plus complexe normalement.

Le premier est déjà relativement gros, un script powershell pour trier des photos par date.
On peut utiliser la date de prise de vue, la date de modification ou la date de création du fichier (dans mon cas les dates de création et modification étaient hs car image récuperer avec logiciel de récuperation mais la date de prise de vue était ok)

On peut imaginer des modifications de ce code comme ajouter du code pour que la recherche soit recursive (ou filtrer par type) sur le Get-ChildItem mais faudra modifier le repertoire de sortie pour les mettre ailleurs, ou ajouter aussi un renommage des fichiers au passage.

Pour utiliser le code le plus simple est d’ouvrir powershell ISE sur windows
Il faut faire des modifications pour que le trie se fasse:

  • mettre le bon nom de répertoire/dossier contenant les photos et lancer le script
  • theoriquement cela affichera les 3 dates des fichiers, il faudra alors modifier la ligne $ladate avec le bon nom de variable et on relance
  • si la sortie est bonne retirer les <# et #> pour que la creation et deplacement des fichiers se fassent à la prochaine execution, le new item va creer les repertoires et le move item déplacer dedans le fichier
#Fonction Get-DateTaken trouvée sur https://stackoverflow.com pour extraire la date de prise de vue: copiée directement
function Get-DateTaken {
    [OutputType([datetime])]
    param (
        [Parameter(Mandatory = $true)]
        [System.IO.FileInfo]
        $file
    )

    # $DateFormat = 'dd.MM.yyyy HH:mm'
    $DateTakenWinApi = 12
    $DateCreatedWinApi = 4

    if ($null -eq $Shell) {
        $Shell = New-Object -ComObject shell.application
    }
 
    $dir = $Shell.Namespace($_.DirectoryName)
    $DateTakenString = $dir.GetDetailsOf($dir.ParseName($_.Name), $DateTakenWinApi)
    if ($DateTakenString -eq '') {
        $DateTakenString = $dir.GetDetailsOf($dir.ParseName($_.Name), $DateCreatedWinApi)
    }
    # sanitze string
    $DateTakenString = $DateTakenString -replace '[^0-9\.\:\ \/]', ''
    # parse to DateTime
    $DateTaken = Get-Date $DateTakenString # -Format $DateFormat
    $DateTaken
}

#Le dossier source, à modifier correctement!
$dossier = "S:\Photos\fait_avirer\SonyHx20"


Get-ChildItem -LiteralPath $dossier -File -Force | ForEach-Object {
    $dateprisedevue = Get-DateTaken($_)
    $datemodif = $($_.LastWriteTime)
    $datecreation = $($_.CreationTime)

    # ladate c'est pour choisir l'un des 3 resultats avec ce qui est le plus efficace, il faut donc modifier la ligne suivante si necessaire
    $ladate = $dateprisedevue 
    
    # Dans la ligne suivante on peut choisir ce que l'on veut comme repertoire/rangement ici yyyy_MM c'est year_month
    # utilisable année = yyyy, mois = MM, jour = dd, heure = hh, minute = mm et même seconde avec ss yyyy_MM_dd_hh:mm donnrait 2024_07_04_12:03 
    #ici les images seront mises par repertoire année_mois
    $dossier_cible = "$($_.DirectoryName)\$($ladate.ToString("yyyy_MM"))"

 
    Write-Host "$_ prise le $dateprisedevue et modifiée en dernier le $datemodif fichier date creation $datecreation et finalement le choix actuel donnera une copie dans le dossier $dossier_cible"
 #   Write-Host "Nom avant $_ et nom possible  $nom_cible "

#partie active a débloquer quand la sortie est bonne retirant les <# et #>
<#
    if (!(Test-Path -LiteralPath $dossier_cible -PathType Container))
    {
        New-Item -Path $dossier_cible -ItemType Directory
    }    
    $_ | Move-Item -Destination $dossier_cible -Force
#>
}

3 « J'aime »

Bonne initiative.

Une petite suggestion : ça serait bien de les mettre sur un service dédié, genre GitHub Gist, qui permettrait de les faire vivre (suivi des révisions, fork…), et de poster ici simplement un lien vers chaque fichier sur ce service.

1 « J'aime »

sous Linux ou autre Unix en shell, pour supprimer les fichiers générés par MacOS X sur un volume fat ou autre :
find /media/... -name "._*" -exec rm -f {} \;

créer des dossiers et sous-dossiers en une ligne :
mkdir -p /parth/to/{foo,bar/{,foobar}}
(crééra les dossier foo, bar, bar/foobar)

1 « J'aime »

qwé???
non, je rigole…

vide le repertoire temp (à ne pas faire lors d’une compression winrar paf):

@echo off
cd %temp%
del /s /q *.*
pause

@Feunoir tu permets que je fasse la proposition de @MattS32 ???

C’est du code sans grande prétention et même en partie un assemblage de code d’autres sources ici.
J’ai eu un besoin donc j’ai fait une recherche et pondu ce truc, cela ne va pas vraiment plus loin.
Répondre ici si on me pose une question ne me dérange pas vraiment je suis assez souvent ici mais ce serait disperser un peu plus mon temps.

Puis il y aura surement plus de la « commande » que du gros code

1 « J'aime »

Justement, voici une commande de l’invite de commande dont je parle de temps en temps : winget ou de son nom complet français le « Programme d’installation d’application »

Pour l’utiliser il faut surement avoir un windows sous compte utilisateur microsoft (et win 10 > 1709 et win11+) car la première étape commence dans le store : il faut aller voir s’il est présent et bien a jour dans la bibliothèque.
Il est en bas ici :

S’il n’est pas a jour : le mettre a jour via obtenir les mises a jour en haut a droite
S’il n’est pas présent il suffit de l’installer via Programme d'installation d'application – Microsoft Apps

Ensuite, c’est un outil en invite de commande donc cela se passe dans l’invite de commande (touche windows puis on tape directement cmd pour trouver l’invite de commande )
winget list : liste les applications installées sur le pc et reconnues par winget
Seules celles qui ont la colonne source renseignée avec ‹ winget › pourront être mis a jour (ou installées) via winget (en gros c’est pas possible pour les jeux steam/store alternatif , les outils de windows gerés par windows update, les outils de dev tiers non inscrit)

Avant d’entree un peu dans les details quelques commande possibles
winget search xxx: permet de chercher une application xxx dans le magasin de winget
'winget install xxx permet d’installer l’application xxx
winget upgrade xxx permet de mettre a jour l’application xxx
winget upgrade : liste toutes applications dont winget a une version plus recente en magasin
winget upgrade --all: met toute la liste d’application a jour
winget uninstall xxx : lance la désinstallation de l’application xxx (souvent pas totalement automatique)

un exemple concret:
– Premier commande (c:>)Je cherche vlc sur mon pc et il le trouve, avec list (il finit en winget donc en magasin winget)
– Je le désinstalle avec uninstall (c’est le désinstalleur par defaut devlc donc il y a qq questions comme pour garder les préférences)
– Je le cherche dans le magasin avec search
– Je le reinstalle avec install
Et on voit au passage le plus gros souci que l’on peut rencontrer : il y a chaque fois plusieurs choix possible, ici mettre VLC aurait installé la première ligne , il faut faire attention quand on installe qq chose de mettre un texte sans autre possibilité , videoLan.VLC est plus precis (« VLC media player » aurait surement convenu aussi )

liste update possible sur mon pc:

Pour aller plus loin il faut creuser dans les commandes d’aide
winget -help
winget upgrade -help
en gros winget … -help

Un dernier joujou pour la fin , le code d’un fichier cmd que j’ai fait pour me faciliter la vie à la clean install d’un pc pour installer une liste de soft

winget install 7zip.7zip
if %ERRORLEVEL% EQU 0 Echo 7zip installed successfully.
winget install Videolan.VLC
if %ERRORLEVEL% EQU 0 Echo VLC installed successfully.
winget install IrfanSkiljan.IrfanView
if %ERRORLEVEL% EQU 0 Echo IrfanView installed successfully.
winget install Mozilla.firefox
if %ERRORLEVEL% EQU 0 Echo firefox installed successfully.
winget install Notepad++.Notepad++
if %ERRORLEVEL% EQU 0 Echo Notepad++ installed successfully.
1 « J'aime »

pour ne pas être interrogé par les installeurs : winget upgrade --all --silent

1 « J'aime »

Une commande un peu spéciale, réservé malheureusement qu’au matériel RTX de nvidia.

Il y a qq année nvidia a mis a disposition du public « Maxine » un kit de developpement pour effet video/son/AR augmenté par l’IA
Dans le sdk il y a un outil pour appliquer des effets que l’on peut utiliser sur des fichiers :hugs:

Le sdk est disponible sur la page decrivant le projet : https://developer.nvidia.com/blog/transforming-noisy-low-resolution-into-high-quality-videos-for-captivating-end-user-experiences/
(pour windows cela donne apres 2 choix : Maxine Windows Video Effects SDK | NVIDIA NGC il y a pour linux en suivant la bonne voie sur le lien d’avant, je n’ai pas testé sur linux))

Pré requis = un pilote nvidia a jour sur une carte nvidia RTX
Un compte Nvidia pour telecharger le SDK au dessus (compte de geforce experience par exemple)
Du temps en fonction de la video

On decompresse le zip du sdk dans un dossier assez facile a retrouver, je l’ai mis dans
s:/nvidia.
Cela me donne avec la version actuelle un chemin a suivre pour aller a l’outil:
S:\nvidia\NVIDIA Video Effects SDK_win_0.7.2.0\samples\VideoEffectsApp

A l’interieur du dossier on trouve l’outil exemple du sdk : VideoEffectsApp.exe
et un fichier run_local.bat qui nous donne la piste a suivre ou que l’on peut modifier a notre sauce
On peut aussi lancer via invite de commande mais il faudra alors commencer par
SETLOCAL
et
SET PATH=%PATH%;..\external\opencv\bin;..\..\bin;
sinon on aura une erreur de dll manquante au lancement de l’executable

Ensuite la commande sera sous la forme
VideoEffectsApp.exe --progress --effect=SuperRes --mode=0 --model_dir=..\..\bin\models --in_file="S:\Photos\Recup_video\Mp4\Video Ts.mp4" --resolution=1440 --out_file=S:\Photos\Recup_video\Mp4\out.mp4

Les guillemets sont nécessaires quand il y a des caractères qui complique le nom de fichier comme un espace
Je me suis cassé les dents assez longtemps sur l’erreur « Error: The specified image resolution is not supported » mais cela ne supporte que des multiples de la definition d’origine ici 576 (ici j’ai fait 2 mais x1.33 ou x1.66 serait utilisable)

Dans la ligne le mode à 0 est plutot pour les fichiers pas top car le 1 rajouterait un filtre de netteté/sharpen qui accentue les defauts

J’ai effleuré que le debut de ses possibilités mais a priori faut pas attendre de miracle pour des fichiers 576p le résultat n’est pas vraiment mieux mieux qu’un upscale à la volée par un bon lecteur video (voir aidé par madvr)
A priori le modele utilisé serait plutot « anime » ou surement plutot axé webcam + presentation type powerpoint/graphique que l’on utiliserait sur des outils comme teams que video live
(cela ne s’embete pas avec le son et le framerate de la video donc même si le resultat est probant il faudra bricoler pour remettre tout ensemble )

1 « J'aime »

Un petit script/code python vraiment bidon (mais que j’utilise de temps en temps)

import keyboard,mouse
while True:
    keyboard.wait("$")
    mouse.click('middle')

Quand je clique sur $ cela simule un clic milieu sur la souris, mon clavier de canapé k400r n’ayant que droit et gauche (même s’il y a peut être un moyen de le faire (combinaison de touche?))

Il faut mettre ce code dans un fichier avec extension .py et avoir python 3 sur le pc ( Download Python | Python.org ) pour que le fichier .py soit executé

1 « J'aime »

Un test d’IA en local sur le pc ?
Il existe un outil nommé Lm studio ( https://lmstudio.ai/ ) qui permet de tester les IA open source comme

L’interface de l’outil est assez simple

Dans discover (qui donne la liste des IA de la premiere capture) si on prend l’IA open source de Microsoft Phi 3 mini on peut voir qu’il y a plusieurs niveau de complexité possible. Cela indique si le calcul sera bien en local aussi.
Il faut s’adapter au matos de son pc (avoir 32Go de ram et un bon gros gpu ouvre plus de porte mais il y a pas mal de choix même avec un pc moins pourvu)

Chargée et en attente de demande

Un tout premier essai surement avec une demande un peu trop vague
(J’écrirais surement jamais un truc comme cela pour resilier mais bon c’est un resultat :sweat_smile:)

Le gpu (une 3080) a fait une pointe ) 94% d’usage pour cet essai : (qui a pris moins de 5secondes à être fini la louche)
image

Ca brode pas mal mais c’est quand même impressionnant cette faculté a répondre au demande

1 « J'aime »

Pour cet usage, je recommanderai plutôt d’utiliser AutoHotKey : https://www.autohotkey.com/

Je l’utilise depuis pas mal d’années pour recréer la touche Pause, qui a disparu des claviers Logitech MX.

1 « J'aime »

y a pas de condition de sortie :wink:
sinon sous Linux (Gnome, KDE) dans les paramètres de la souris tu peut activer l’option pour que les deux boutons à la fois = middle click

1 « J'aime »

Bah normal pour un truc qui doit tourner en permanence en arrière-plan, non ?

1 « J'aime »

tu pourrais vouloir le désactiver ou au moins le suspendre pour pouvoir retrouver l’usage normal de la touche $ par un triple « clic » dessus par exemple comme ça tu peut le lancer au démarrage de la session sans y penser
et quitter avec le triple appuie ou faire que ça suspende la boucle pendant 10s par exemple. :slight_smile:

1 « J'aime »

Cela a cette tête de fenêtre « console » quand je lance le .py (via touche windows + nom du script)
Donc arrêter le script est assez simple (la croix), je laisse cela derrière le navigateur tant que cela me sert (je ne suis pas si souvent que cela devant ma tv à scroller du contenu )

un $ passe en mode scrolling et un nouveau $ le quitte
Après on peut imaginer une combinaison de touche declencheuse

1 « J'aime »

cool mais du coup, est ce que ça clique en boucle tant que t’as pas relaché la touche ou bien ça appuie une fois seulement???

Un (tout) petit script que j’utilise pour éteindre mes lampes Philips Hue (en utilisant la passerelle Hue Bridge).

Alors, soyons clair, c’est de « l’impératif », je ne teste pas l’état des lampes avant d’envoyer la commande.
Donc, oui, c’est crade, mais le principal problème c’est que leur truc renvoie du rest et parser 3ko de texte pour retrouver l’état des lampes ça me gonfle (surtout que je fais aussi ce genre de trucs avec un Arduino, donc … :sweat_smile:).

Mais, bref :

#!/usr/bin/env bash
curl -X PUT http://192.168.1.90/api/hue-token/groups/0/action -d '{"on":false}'

Pour les explications :
Le shebang

#!/usr/bin/env bash'

Sous cette forme, plutôt que le chemin d’accès « direct », parce que bash (dans ce cas) n’est pas installé sur tout les OS au même endroit (dans /bin sous debian et dans /usr/local/bin dans FreeBSD, par exemple).

Utiliser env résout ce problème à priori, env est toujours au même endroit de ce que j’ai pu voir).

Ensuite :

curl -X PUT http://192.168.1.90/api/hue-token/groups/0/action -d '{"on":false}'

Rapidement, -X sert à passer curl en mode http.
Et PUT sert lui à indiquer que l’on va envoyer quelque chose.

Le « hue-token » est a remplacer par … bah, le token que le bridge hue donne lorsque l’on appaire un périphérique avec lui. ^^

Ensuite le "groups/0/ permet de s’adresser à toutes les lampes.

Et mon script se lance à des heures prédéterminées (grâce à ce bon vieux cron), globalement quand je pars bosser, histoire que les lampes ne restent pas allumées toute la journée. :smiley:

1 « J'aime »

home assistant avec détection de présence serait plus « smart » mais bon ça fait le taff aussi ^^

1 « J'aime »