Commandes PowerShell dans Batch
brucine Messages postés 17799 Date d'inscription lundi 22 février 2021 Statut Membre Dernière intervention 21 novembre 2024 - 8 avril 2024 à 07:33
- Commandes PowerShell dans Batch
- Invite de commandes - Guide
- Fichier batch - Guide
- Commandes terminal mac - Guide
- Virus powershell - Guide
- Extension batch - Forum Windows
6 réponses
Modifié le 16 mars 2024 à 23:51
Bonjour,
En Powershell pour rediriger la sortie, il faut indiquer quel flux est redirigé :
get-volume -DriveLetter C|Format-Table -HideTableHeaders 1>out.txt
le flux va de 1 à 6 ou * : https://learn.microsoft.com/fr-fr/powershell/module/microsoft.powershell.core/about/about_redirection?view=powershell-7.4
Dans les 2 dernières commandes tu as Format_Table alors que c'est Format-Table. Et peut être quel le résultat n'est pas considéré comme une table puisque c'est une liste objet : valeur.
17 mars 2024 à 18:38
Pour avoir le même résultat dans batch, il faut utiliser write-host au lieu de write.
17 mars 2024 à 21:14
Nickel, je suis une vraie buse dans des tas de choses, PowerShell en fait partie.
Juste un point de détail si c'est possible, une fois que j'ai bouclé ça, ça ne tabule pas:
J'ai bien un plan B via:
powershell.exe -command "& { Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property DeviceID,@{'Name' = 'Total (Go)'; Expression= {[math]::round($_.Size/1GB, 2)}},@{'Name' = 'Libre (Go)'; Expression= {[math]::round($_.FreeSpace/1GB, 2)}} }"
là c'est bien tabulé, mais un moyen de se débarrasser des lignes de titre?
J'ai essayé un tas d'autres formules mais qui soient ne tabulent pas, soit écrivent des GB à l'anglo-saxonne, soit me privent de décimales...
Je sais, on peut toujours faire de l'arithmétique sur des octets et j'ai une solution fonctionnelle mais que j'aimerais autant éviter, elle est longue comme un jour sans pain si on doit tester disons de 10 To aux centaines de Mo pour faire du zèle puisqu'il faut à chaque étape limiter la sortie à 9 chiffres, vérifier en fonction de la longueur de la chaîne originale si une même longueur n'est pas à cheval sur deux unités selon que les 9 chiffres restants sont ou non supérieurs à 1024^3 et remettre virgule, nombre de caractères avant et après au bon endroit.
Merci.
17 mars 2024 à 21:22
tu peux toujours rajouter le format-table
Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property DeviceID,@{'Name' = 'Total (Go)'; Expression= {[math]::round($_.Size/1GB, 2)}},@{'Name' = 'Libre (Go)'; Expression= {[math]::round($_.FreeSpace/1GB, 2)}} | Format-Table -HideTableHeaders
17 mars 2024 à 21:41
Presque parfait: dans la formule de base, c'est moi qui avait rajouté le baratin style "Total (Go)" qui alors remplaçait celui standard dans la ligne de titres.
Là puisqu'on les a virés, je n'ai plus de titres, mais je n'ai plus non plus comme la première image en <6> à quoi chaque valeur correspond (Total ou Libre) et l'unité de mesure sur chaque ligne.
Comment dois-je faire le cas échéant pour les intégrer dans les "Expression" (tabulées, cela va de soi...)?
Merci.
Modifié le 17 mars 2024 à 22:16
tu peux essayer le caractère de tabulation `t
Get-CimInstance win32_logicaldisk | where caption -eq "C:" | foreach-object {write "`t $($_.caption) total`t $('{0:N2}' -f ($_.Size/1gb)) Go libre`t $('{0:N2}' -f ($_.FreeSpace/1gb)) Go"}
C: total 75,00 Go libre 25,32 Go
18 mars 2024 à 09:21
Merci pour l'existence du caractère de tabulation, je vais peut-être finir par m'instruire en PowerShell.
S'agissant de boucler sur tous les lecteurs, pour avoir les informations relatives à un lecteur sur la même ligne, il faut comme barnabe0057 l'a indiqué remplacer write par write-host ce qui nous donne, une fois supprimée la tabulation avant la lettre de lecteur et déplacé celle de "Libre" après le mot "Go" de "Total":
Nettement mieux sinon que la différence de taille des lecteurs continue à générer un décalage entre le nombre et "Go" dont je ne n'arrive pas à me défaire.
J'obtiens comme indiqué sur la deuxième formule et image en <6> une tabulation correcte sans les unités mais comme la formule est d'un seul tenant pour tous les lecteurs une ligne vierge après et une ligne vierge avant suivie de deux lignes de titres.
On arrive à "la bonne solution" en redirigeant la sortie vers un fichier dont on filtre les lignes excédentaires et tabule la sortie mais c'est dommage, c'est moins "élégant" que ne le serait une seule formule PowerShell brute de coffrage:
@echo off CHCP 65001>NUL powershell.exe -command "& { Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property DeviceID,@{'Name' = 'Total'; Expression= {[math]::round($_.Size/1GB, 2)}},@{'Name' = 'Libre'; Expression= {[math]::round($_.FreeSpace/1GB, 2)}} }">>%~dp0_lect.txt FOR /F "tokens=1-3 skip=3 delims= " %%A IN ('type "%~dp0_lect.txt"') DO ( SET lecteur=%%A SET total=%%B SET libre=%%C CALL :DISPLAY ) GOTO END :DISPLAY echo %lecteur% %total% Go %libre% Go exit /b :END pause del ~dp0_lect.txt
Modifié le 18 mars 2024 à 13:05
Pour aligner les différentes tailles ce n'est pas bien sorcier :
@echo off setlocal enableextensions enabledelayedexpansion CHCP 65001>NUL set "pow=Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property DeviceID,@{'Name' = 'Total'; Expression= {[math]::round($_.Size/1GB, 2)}},@{'Name' = 'Libre'; Expression= {[math]::round($_.FreeSpace/1GB, 2)}}" call :routine pow pause exit /b :routine FOR /F "tokens=1-3 skip=3 delims= " %%A IN ('powershell.exe -command "& { !%~1! }"') DO ( SET "lecteur=%%A" SET "total= %%B" SET "libre= %%C" echo. !lecteur! !total:~-10! Go !libre:~-10! Go ) exit /b
Ce qui est plus compliqué c'est de convertir les Go en To le cas échéant.
18 mars 2024 à 13:31
C'est exactement ce que j'ai fini par faire dans le script en <11> après avoir tâtonné un bon moment avec PowerShell avec lequel je suis fâché en passant par une routine CALL parce que je suis aussi fâché avec les variables d'expansion retardée.
18 mars 2024 à 14:04
dans ce que propose @barnabe0057 ce qui semble d'abord intéressant c'est la proposition de troncature gauche d'une variable qui permet d'aligner des nombres de longueur différente, tu tournes justement sur cet alignement depuis longtemps non ?
SET "total= 10000,00" SET "libre= 555,22" echo. %total:~-10% Go & echo. %libre:~-10% Go
10000,00 Go
555,22 Go
18 mars 2024 à 17:07
Oui, tout à fait, j'ai regardé trop vite et je me suis obnubilé sur l'alignement des colonnes de chiffres et de l'unité Go sans décalage de toute la ligne selon la grandeur.
En <11> mes chiffres sont alignés sur celui de gauche, ce n'est pas un drame, là où sa proposition est plus orthodoxe en les alignant sur celui de droite (avec juste une anomalie pour la carte SD en N: qui lit 59,3 au lieu de 59,30 et qui devrait d'ailleurs lire 59,60 (64 Go/1,024^3)-59,60, s'agissant d'une carte vierge où j'ai copié un fichier de 1 Ko sans quoi certaines commandes échouent là où l'explorateur retourne 59,4-59,22, les mystères de Windows d'ailleurs sans importance...).
30 mars 2024 à 17:25
J'ai trouvé une solution pas vraiment élégante mais qui rend la forme souhaitée: les ps1 sont créés en echo depuis le batch puis redirigés vers un premier fichier texte qu'éventuellement je redirige vers un deuxième en supprimant les titres et les lignes vides (la plus pénible, c'est celle générée automatiquement en fin de fichier et correspondant au "retour chariot").
1 avril 2024 à 10:57
La présentation rend bien.
Je suis intéressé par ton script, est-ce que tu le partagerais ?
J'ai moi-même un ancien script de ce style que j'aimerais mettre à jour avec le tien.
1 avril 2024 à 11:42
Tiens, mais comme je te l'ai dit, c'est efficace mais pas très orthodoxe.
https://www.cjoint.com/c/NDbjPBonshF
Modifié le 1 avril 2024 à 20:36
Merci pour le partage.
Je l'ai un peu remis à ma sauce : https://pastebin.com/3JUD7WW0
.
Il me reste encore à le fusionner avec mon propre outil pour que ça devienne mon futur couteau suisse.
1 avril 2024 à 20:40
Tu me montreras ça, mais je ne peux pas voir la sauce intermédiaire, je me fais jeter 403 accès non autorisé.
Modifié le 1 avril 2024 à 20:46
Voilà le code :
@echo off Mode con cols=105 lines=40 ::AVERTISSEMENT ::LES PARTITIONS OU DISQUES DOIVENT AVOIR UN NOM, IL NE DOIT PAS Y AVOIR D'ESPACE setlocal enableextensions enabledelayedexpansion CHCP 65001 >nul IF NOT "%os%"=="Windows_NT" ( echo Erreur...OS Invalide... pause exit ) call :module rem powershell.exe -ExecutionPolicy Bypass -File "%~dp0fonctions.psm1" :: ------------------------------------------------------------------------------------------- :: on affiche les infos système :: ------------------------------------------------------------------------------------------- echo. & echo ^[103;91mRecherche en cours Ordinateur "%COMPUTERNAME%" Veuillez patienter.... [0m echo. ::Nom_ordinateur FOR /F "tokens=2 delims==" %%A in ('wmic os get CSName /value') DO SET "nomPC=%%A" ::Modèle FOR /F "tokens=2 delims==" %%A in ('wmic computersystem get Manufacturer /value') DO SET "manufacturer=%%A" FOR /F "tokens=2 delims==" %%A in ('wmic computersystem get Model /value') DO SET "model=%%A" FOR /F "tokens=2 delims==" %%A in ('wmic bios get SerialNumber /value') DO SET "serialnumber=%%A" ::OS FOR /F "tokens=2 delims==|" %%A in ('wmic os get Name /value') DO SET "osname=%%A" FOR /F %%A in ('wmic os get OSArchitecture ^| find /i "bit"') DO SET "osarchi=%%A" FOR /F "tokens=4" %%A in ('systeminfo ^| find /i "Version" ^| find /v "BIOS"') DO SET "osversion=%%A" FOR /F "tokens=2 delims==" %%A in ('wmic os get ServicePackMajorVersion /value') DO SET "sp=%%A" FOR /F "tokens=3" %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "DisplayVersion"') DO SET "Version=%%A" ::Nom Processeur FOR /F "tokens=2 delims==" %%A in ('wmic cpu get name /value') DO SET "nomproc=%%A" FOR /F "tokens=2 delims==" %%I in ('wmic cpu get numberofcores /value') DO SET "cores=%%I" echo Nom ordinateur: %nomPC% echo Modèle: %manufacturer% %model% echo Type Processeur: %processor_architecture% %nomproc% %cores% coeur(s) echo Numéro Série: %serialnumber% echo OS: %osname% %osarchi% bits Service Pack %sp% echo Version: %Version% - NT= %osversion% echo Boot: ^< %FIRMWARE_TYPE% Mode ^> :: ------------------------------------------------------------------------------------------- :: on utilise des commandes Powershell :: ------------------------------------------------------------------------------------------- set "pow1=Get-WMIObject win32_ComputerSystem | foreach-object {write-host " Mémoire totale: $('{0:N2}' -f ($_.TotalPhysicalMemory/1gb)) Go"}" set "pow2=Get-WMIObject Win32_OperatingSystem | Measure-Object -Property FreePhysicalMemory -Sum | %% {[Math]::Round($_.sum/1024/1024, 2)}" set "pow3=Get-PhysicalDisk | Select DeviceID, Size, BusType, MediaType, Model | Format-Table -HideTableHeaders" set "pow4=Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property DeviceID,@{'Name' = 'Total'; Expression= {[math]::round($_.Size/1GB, 2)}},@{'Name' = 'Libre'; Expression= {[math]::round($_.FreeSpace/1GB, 2)}}" call :disques pow3 call :partitions pow4 call :memoire pow1 pow2 del /f /q "%~dp0fonctions.psm1" echo. & pause exit :: ------------------------------------------------------------------------------------------- :: routine de récupération des disques :: ------------------------------------------------------------------------------------------- :disques echo. ECHO ^[104;93mDisque N°, Bus, Type, Taille, Nom : [0m FOR /F "tokens=1-4,* delims= " %%A IN ('powershell.exe -command "& { !%~1! }"') DO ( FOR /F "tokens=1,2 delims= " %%H in ('powershell.exe -command "& { Import-Module %~dp0fonctions.psm1; ConversionUnites %%B }"') DO ( call :alignement "%%H" taille set "taille=!taille:~-6! %%I" ) echo %%A %%C %%D !taille! "%%E" ) echo. ECHO ^[104;93mDisques et partitions : [0m FOR /F "delims=" %%A IN ('powershell.exe -command "& { Import-Module %~dp0fonctions.psm1; InfosPartitions }"') do echo %%A | findstr ": ," goto :eof :: ------------------------------------------------------------------------------------------- :: routine de récupération des partitions :: ------------------------------------------------------------------------------------------- :partitions echo. ECHO ^[104;93mOccupation des partitions : [0m FOR /F "tokens=1-3 skip=3 delims= " %%G IN ('powershell.exe -command "& { !%~1! }"') DO ( SET "lecteur=%%G" call :alignement "%%H" total call :alignement "%%I" libre echo. !lecteur! ^>^>^> Total / Libre : !total:~-8! / !libre:~-8! Go ) goto :eof :: ------------------------------------------------------------------------------------------- :: routine de récupération de la taille mémoire :: ------------------------------------------------------------------------------------------- :memoire FOR /F "tokens=3 delims=: " %%A IN ('powershell.exe -command "& { !%~1! }"') DO CALL :alignement "%%~A" RamTotal FOR /F "tokens=1" %%A IN ('powershell.exe -command "& { !%~2! }"') DO CALL :alignement "%%~A" RamLibre echo. ECHO ^[104;93mMémoire RAM : [0m echo. Mémoire totale : %RamTotal:~-7% Go echo. Mémoire libre : %RamLibre:~-7% Go goto :eof :: ------------------------------------------------------------------------------------------- :: routine d'alignement des tailles (troncature gauche) :: ------------------------------------------------------------------------------------------- :alignement echo %~1 | findstr "," >nul && SET "fill=00" || SET "fill=,00" SET "%2= %~1!fill!" FOR /F "tokens=1,2 delims=," %%E IN ('echo !%2!') DO ( SET "Decimale=%%F" SET "%2=%%E,!Decimale:~0,2!" ) goto :eof :: ------------------------------------------------------------------------------------------- :: routine de génération du module "fonctions.psm1" :: ------------------------------------------------------------------------------------------- :module If Exist "%tmp%\cbf0.0.8.f9ece1fa63465a986c041a6f24848309" goto:cbf.f9ece1fa63465a986c041a6f24848309 (Set/p =ZnVuY3Rpb24gQ29udmVyc2lvblVuaXRlcyB7DQoNCiAgICBwYXJhbShbbG9uZ10gJHNpemUpDQoNCiAgICAkdW5pdGUgPSBAKCdLbycsJ01vJywnR28nLCdUbycsJ1BvJykNCiAgICAkaT0tMQ0KDQogICAgRG8gew0KCSAgICAkc2l6ZS89MTAyNA0KCSAgICAkaSsrDQogICAgfSBVbnRpbCAoICRzaXplIC1sdCAxMDAwICkNCg0KICAgICR0YWlsbGU9JHNpemUuVG9TdHJpbmcoIi4wMCIpICsgIiAiDQoNCiAgICByZXR1cm4gJHRhaWxsZSArICR1bml0ZVskaV0NCg0KfQ0KDQoNCmZ1bmN0aW9uIEluZm9zUGFydGl0aW9ucygpIHsNCg0KICAgIEdldC1XbWlPYmplY3QgV2luMzJfRGlza0RyaXZlIHwgRm9yRWFjaC1PYmplY3QgeyANCiAgICAgICAgJGRpc2sgPSAkXyANCiAgICAgICAgJHBhcnRpdGlvbnMgPSAiQVNTT0NJQVRPUlMgT0YgIiArICJ7V2luMzJfRGlza0RyaXZlLkRldmljZUlEPSckKCRkaXNrLkRldmljZUlEKSd9ICIgKyAiV0hFUkUgQXNzb2NDbGFzcyA9IFdpbjMyX0Rpc2tEcml2ZVRvRGlza1BhcnRpdGlvbiIgDQogICAgDQogICAgICAgIEdldC1XbWlPYmplY3QgLVF1ZXJ5ICRwYXJ0aXRpb25zIHwgRm9yRWFjaC1PYmplY3QgeyANCiAgICAgICAgICAgICRwYXJ0aXRpb24gPSAkXyANCiAgICAgICAgICAgICRkcml2ZXMgPSAiQVNTT0NJQVRPUlMgT0YgIiArICJ7V2luMzJfRGlza1BhcnRpdGlvbi5EZXZpY2VJRD0nJCgkcGFydGl0aW9uLkRldmljZUlEKSd9ICIgKyAiV0hFUkUgQXNzb2NDbGFzcyA9IFdpbjMyX0xvZ2ljYWxEaXNrVG9QYXJ0aXRpb24iIA0KICAgDQogICAgICAgICAgICBHZXQtV21pT2JqZWN0IC1RdWVyeSAkZHJpdmVzIHwgRm9yRWFjaC1PYmplY3QgeyANCiAgICAgICAgICAgICAgICBOZXctT2JqZWN0IC1UeXBlIFBTQ3VzdG9tT2JqZWN0IC1Qcm9wZXJ0eSBAeyANCiAgICAgICAgICAgICAgICBEaXNrTW9kZWwgICA9ICRkaXNrLk1vZGVsIA0KICAgICAgICAgICAgICAgIFBhcnRpdGlvbiAgID0gJHBhcnRpdGlvbi5OYW1lIA0KICAgICAgICAgICAgICAgIERyaXZlTGV0dGVyID0gJF8uRGV2aWNlSUQgDQogICAgICAgICAgICAgICAgVm9sdW1lTmFtZSAgPSAkXy5Wb2x1bWVOYW1lIA0KICAgICAgICAgICAgICAgIH0NCiAgICAgICAgICAgIH0NCiAgICAgICAgfQ0KICAgIH0NCn0NCg0KDQpmdW5jdGlvbiBDaGVja1NpdGUoKSB7DQoNCiAgICBwYXJhbShbc3RyaW5nXSAkdXJsKQ0KDQogICAgdHJ5DQogICAgew0KICAgICAgICAkUmVzcG9uc2UgPSBJbnZva2UtV2ViUmVxdWVzdCAtVXJpICIkdXJsIiAtVXNlQmFzaWNQYXJzaW5nIC1Ta2lwQ2VydGlmaWNhdGVDaGVjaw0KICAgICAgICAkU3RhdHVzQ29kZSA9ICRSZXNwb25zZS5TdGF0dXNDb2RlDQogICAgfSBjYXRjaCB7DQogICAgICAgICRTdGF0dXNDb2RlID0gJF8uRXhjZXB0aW9uLlJlc3BvbnNlLlN0YXR1c0NvZGUudmFsdWVfDQogICAgfQ0KICAgIA0KICAgIGlmIChbc3RyaW5nXTo6SXNOdWxsT3JFbXB0eSgkU3RhdHVzQ29kZSkpIHsNCiAgICAgICAgJFN0YXR1c0NvZGUgPSAiNDA0Ig0KICAgIH0NCiAgICByZXR1cm4gJFN0YXR1c0NvZGUNCn0= )<Nul>"%tmp%\cbf0.0.8.f9ece1fa63465a986c041a6f24848309" :cbf.f9ece1fa63465a986c041a6f24848309 >Nul Certutil -f -decode "%tmp%\cbf0.0.8.f9ece1fa63465a986c041a6f24848309" "%~dp0fonctions.psm1" goto :eof
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question2 avril 2024 à 19:37
Pour la licence Windows il y a ça :
########################################################## # # Get-ProductKey.ps1 # Description : récupère la clé produit de Windows # # http://www.powershell-scripting.com/ # La communauté PowerShell francophone # # Usage : PS > ./Get-ProductKey.ps1 ########################################################## # Création de la table de conversion base 24 $map="BCDFGHJKMPQRTVWXY2346789" # Lecture de la clé de registre $value = (get-itemproperty "HKLM:\\SOFTWARE\Microsoft\Windows NT\CurrentVersion").digitalproductid[0x34..0x42] # Conversion des valeurs en Hexa pour afficher le Raw Key $hexa = "" $value | foreach { $hexa = $_.ToString("X2") + $hexa } Write-Output "Raw Key Big Endian: $hexa" # Calcul du Product Key $ProductKey = "" for ($i = 24; $i -ge 0; $i--) { $r = 0 for ($j = 14; $j -ge 0; $j--) { $r = ($r * 256) -bxor $value[$j] $value[$j] = [math]::Floor([double]($r/24)) $r = $r % 24 } $ProductKey = $map[$r] + $ProductKey if (($i % 5) -eq 0 -and $i -ne 0) { $ProductKey = "-" + $ProductKey } } Write-Output "Product Key: $ProductKey" pause
Ou bien ça :
(Get-WmiObject SoftwareLicensingService).OA3xOriginalProductKey
3 avril 2024 à 08:17
Je suis curieux comme une chatte.
Les deux scripts licence ne rendent pas le même résultat, ils sont peut-être ambigus selon que la licence est OEM ou pas.
Comme je le supposais, celui programmes ne retourne que les programmes, pas les applications Windows: on n'a donc aucun moyen de savoir s'il y a eu sur le PC cible mission de service public par exemple en désinstallant Cortana.
Curieusement par ailleurs, il m'affiche en tête de gondole plusieurs lignes vierges et une avec un numéro de version sans nom, et on sélectionne les objets Publisher et InstallDate sans les afficher?
Ce qui nous poserait à nouveau un problème de mise en forme, par exemple:
Package de pilotes Windows - Dynastream Innovations, Inc. ANT LibUSB Drivers (04/11/2012 1.2.40.201)
va tout déplacer à droite du fait de sa longueur.
3 avril 2024 à 08:52
Et qui plus est ne rend que les programmes installés sur la partition système
3 avril 2024 à 10:12
Toujours en coupant les cheveux en quatre, ton script en <36> n'aligne pas correctement en tout cas chez moi les informations à Disque N°, Bus,... et les couleurs de titres faute du caractère d'échappement adéquat, mais ça, c'est peut-être délibéré, et on ne peut pas le copier-coller.
On l'obtient soit en le copiant d'un script où il existe déjà, soit en le générant une fois pour toutes:
FOR /F "delims=#" %%E IN ('"prompt #$E# & FOR %%E IN (1) DO REM"') DO SET "ESC=%%E" ECHO %ESC% > esc.txt
soit en allant se servir sur un site approprié, par exemple (Credits to Michele Locati):
https://gist.githubusercontent.com/mlocati/fdabcaeb8071d5c75a2d51712db24011/raw/b710612d6320df7e146508094e84b92b34c77d48/win10colors.cmd
3 avril 2024 à 16:23
Concernant l'alignement des titres, j'ai laissé tomber, enfin pour le moment.
3 avril 2024 à 16:26
Concernant les apps Windows comme Cortana on peut les lister comme ceci :
Get-AppxProvisionedPackage -Online | Format-Table DisplayName, Version
Modifié le 6 avril 2024 à 21:26
J'ai besoin d'un testeur pour ce mini-script permettant d'exporter les profils wifi, brucine es-tu là ?
if not exist "%~dp0Profils wifi sur %COMPUTERNAME%" (mkdir "%~dp0Profils wifi sur %COMPUTERNAME%") for /f "skip=1 tokens=2 delims=:" %%A in ('netsh wlan show profiles ^| findstr ":"') do netsh wlan export profile name="%%A" key=clear folder=".\Profils wifi sur %COMPUTERNAME%"
Modifié le 7 avril 2024 à 07:52
échoue dans un premier temps parce que mon adaptateur Wifi est désactivé (exprès): il faut donc prévoir un message d'erreur dans ce cas de figure.
Je n'ai qu'un adaptateur Wifi (physique), quand bien même y en aurait-il plusieurs (physiques ou virtuels) qu'on ne peut pas en activer plusieurs à la fois et que le script ne rendra que celui qui est activé?
Une fois activé, échoue une deuxième fois parce que la syntaxe findstr retourne un espace avant le nom de l'adaptateur (" SFR_A918_5GHZ"), il faut donc que la variable supprime le premier caractère sur le mode, à supposer que cette variable s'appelle wifi
set "wifi=%wifi:~1%".
Noter que n'est rendu que 5GHZ, je suppose que c'est le fait de la Box qui est paramétrée sur cette fréquence.
à ces conditions ça fonctionne, c'est une copie du fichier xml, que tu veux, ou sa seule existence?
Modifié le 7 avril 2024 à 08:27
Etant sur Linux, je fais mes tests sur une VM Windows 10 qui n'a pas d'adaptateur wifi, donc je suis aveugle sur ce coup là, c'est pour ça que j'ai besoin de quelqu'un pour m'aider.
.
Le but c'est de sauvegarder les différents profils de la machine, et pouvoir les restaurer le cas échéant, donc il me faut les profils au format XML.
.
Si ce n'est pas trop demander, est-ce que tu pourrais corriger mon code afin que je puisse l'intégrer dans le script global ?
.
A propos du script, j'ai corrigé dans la liste des programmes les premières lignes qui ne donnaient pas le nom du programme ainsi que la version.
J'ai ajouté la liste des "Windows Apps"
Concernant le fichier Powershell, j'ai transformé la fonction de conversion en méthode statique, comme cela j'ai pu créé une surcharge de la méthode. Du coup mon fichier n'est plus un fichier psm1 mais ps1.
.
Voilà où j'en suis :
@echo off ::Mode con cols=105 lines=40 ::AVERTISSEMENT ::LES PARTITIONS OU DISQUES DOIVENT AVOIR UN NOM, IL NE DOIT PAS AVOIR D'ESPACE setlocal enableextensions enabledelayedexpansion CHCP 65001 >nul IF NOT "%os%"=="Windows_NT" ( echo Erreur...OS Invalide... pause exit ) set "tools=%~dp0mytools.ps1" call :PsScript powershell.exe -ExecutionPolicy Bypass -File "%tools%" set "pow0=(Get-WmiObject SoftwareLicensingService).OA3xOriginalProductKey" set "pow1=Get-WMIObject win32_ComputerSystem | foreach-object {write-host " Mémoire totale: $('{0:N2}' -f ($_.TotalPhysicalMemory/1gb)) Go"}" set "pow2=Get-WMIObject Win32_OperatingSystem | Measure-Object -Property FreePhysicalMemory -Sum | %% {[Math]::Round($_.sum/1024/1024, 2)}" set "pow3=Get-PhysicalDisk | Select DeviceID, Size, BusType, MediaType, Model | Format-Table -HideTableHeaders" set "pow4=Get-CimInstance -ClassName Win32_LogicalDisk | Select-Object -Property DeviceID,@{'Name' = 'Total'; Expression= {[math]::round($_.Size/1GB, 2)}},@{'Name' = 'Libre'; Expression= {[math]::round($_.FreeSpace/1GB, 2)}}" set "pow5=Get-ItemProperty HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall\* | where {$_.DisplayName -notlike ''} | Select-Object DisplayName, DisplayVersion, Publisher | Sort-Object DisplayName | Format-Table -HideTableHeaders" set "pow6=Get-AppxProvisionedPackage -Online | Format-Table DisplayName, Version -HideTableHeaders" set "pow7=Gwmi Win32_LogicalDisk | where {$_.DriveType -ne '5'} | Select-Object -Property DeviceID,@{'Name' = 'Total'; Expression= {[math]::round($_.Size/1GB, 2)}},@{'Name' = 'Libre'; Expression= {[math]::round($_.FreeSpace/1GB, 2)}}" :: ------------------------------------------------------------------------------------------- :: on affiche les infos système :: ------------------------------------------------------------------------------------------- echo. & echo ^[103;91mRecherche en cours Ordinateur "%COMPUTERNAME%" Veuillez patienter.... [0m echo. ::Nom_ordinateur FOR /F "tokens=2 delims==" %%A in ('wmic os get CSName /value') DO SET "nomPC=%%A" ::Modèle FOR /F "tokens=2 delims==" %%A in ('wmic computersystem get Manufacturer /value') DO SET "manufacturer=%%A" FOR /F "tokens=2 delims==" %%A in ('wmic computersystem get Model /value') DO SET "model=%%A" FOR /F "tokens=2 delims==" %%A in ('wmic bios get SerialNumber /value') DO SET "serialnumber=%%A" ::OS FOR /F "tokens=2 delims==|" %%A in ('wmic os get Name /value') DO SET "osname=%%A" FOR /F %%A in ('wmic os get OSArchitecture ^| find /i "bit"') DO SET "osarchi=%%A" FOR /F "tokens=4" %%A in ('systeminfo ^| find /i "Version" ^| find /v "BIOS"') DO SET "osversion=%%A" FOR /F "tokens=2 delims==" %%A in ('wmic os get ServicePackMajorVersion /value') DO SET "sp=%%A" FOR /F "tokens=3" %%A in ('reg query "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows NT\CurrentVersion" /v "DisplayVersion"') DO SET "Version=%%A" ::Nom Processeur FOR /F "tokens=2 delims==" %%A in ('wmic cpu get name /value') DO SET "nomproc=%%A" FOR /F "tokens=2 delims==" %%I in ('wmic cpu get numberofcores /value') DO SET "cores=%%I" call :licence pow0 echo Nom ordinateur: %nomPC% echo Modèle: %manufacturer% %model% echo Type Processeur: %processor_architecture% %nomproc% %cores% coeur(s) echo Numéro Série: %serialnumber% echo OS: %osname% %osarchi% bits Service Pack %sp% echo Version: %Version% (%osversion%) echo Boot: ^< %FIRMWARE_TYPE% Mode ^> echo Clé produit: %productkey% :: ------------------------------------------------------------------------------------------- :: on utilise des commandes Powershell :: ------------------------------------------------------------------------------------------- call :disques pow3 call :partitions pow7 call :memoire pow1 pow2 call :programmes pow5 pow6 set "profils=Profils wifi sur %COMPUTERNAME%" if not exist "%~dp0%profils%" (mkdir "%~dp0%profils%") for /f "skip=1 tokens=2 delims=:" %%A in ('netsh wlan show profiles ^| findstr ":"') do netsh wlan export profile name="%%A" key=clear folder=".\%profils%" rem del /f /q "%tools%" echo. & pause exit :: ------------------------------------------------------------------------------------------- :: routine de récupération de la licence Windows :: ------------------------------------------------------------------------------------------- :licence FOR /F "tokens=* delims=" %%A IN ('powershell.exe -command "& { !%~1! }"') DO set "productkey=%%A" if not defined productkey (set "productkey=00000-00000-00000-00000-00000") goto :eof :: ------------------------------------------------------------------------------------------- :: routine de récupération des disques :: ------------------------------------------------------------------------------------------- :disques echo. ECHO ^[104;93mDisque N°, Bus, Type, Taille, Nom : [0m FOR /F "tokens=1-4,* delims= " %%A IN ('powershell.exe -command "& { !%~1! }"') DO ( FOR /F "tokens=1,2 delims= " %%H in ('powershell.exe -command "& { Import-Module %tools%; [MyTools]::ConversionUnites(%%B) }"') DO ( set "taille=%%H" set "taille= !taille:~-6! %%I" ) echo. %%A %%C %%D !taille! "%%E" ) echo. ECHO ^[104;93mDisques et partitions : [0m FOR /F "delims=" %%A IN ('powershell.exe -command "& { Import-Module %tools%; InfosPartitions }"') do echo %%A | findstr ": ," goto :eof :: ------------------------------------------------------------------------------------------- :: routine de récupération des partitions :: ------------------------------------------------------------------------------------------- :partitions echo. ECHO ^[104;93mOccupation des partitions : [0m FOR /F "tokens=1-3 skip=3 delims= " %%G IN ('powershell.exe -command "& { !%~1! }"') DO ( SET "lecteur=%%G" SET "total= %%H" SET "libre= %%I" echo. !lecteur! ^>^>^> Total / Libre : !total:~-8! / !libre:~-8! Go ) goto :eof :: ------------------------------------------------------------------------------------------- :: routine de récupération de la taille mémoire :: ------------------------------------------------------------------------------------------- :memoire FOR /F "tokens=3 delims=: " %%A IN ('powershell.exe -command "& { !%~1! }"') DO set "RamTotal= %%~A" FOR /F "tokens=1" %%A IN ('powershell.exe -command "& { !%~2! }"') DO set "RamLibre= %%~A" echo. ECHO ^[104;93mMémoire RAM : [0m echo. Mémoire totale : %RamTotal:~-7% Go echo. Mémoire libre : %RamLibre:~-7% Go goto :eof :programmes echo. ECHO ^[104;93mListe des programmes : [0m FOR /F "tokens=*" %%A IN ('powershell.exe -command "& { !%~1! }"') DO echo.%%A echo. ECHO ^[104;93mListe des "Windows Apps" : [0m FOR /F "tokens=*" %%A IN ('powershell.exe -command "& { !%~2! }"') DO echo.%%A goto :eof :: ------------------------------------------------------------------------------------------- :: routine de génération du script "mytools.ps1" :: ------------------------------------------------------------------------------------------- :PsScript If Exist "%tmp%\cbf0.0.8.26478eb6ed3f0d0e349fbac8e8e701fc" goto:cbf.26478eb6ed3f0d0e349fbac8e8e701fc (Set/p =Q2xhc3MgTXlUb29scyB7DQoNCiAgICBzdGF0aWMgW3N0cmluZ10gQ29udmVyc2lvblVuaXRlcyhbbG9uZ10gJHNpemUpIHsNCg0KICAgICAgICBpZiAoJHNpemUgLWx0IDEwMDApIHsNCiAgICAgICAgICAgIHJldHVybiAkc2l6ZS5Ub1N0cmluZygpICsgIiAiICsgIm9jdGV0cyINCiAgICAgICAgfQ0KDQogICAgICAgIFtkb3VibGVdICR0YWlsbGUgPSAkc2l6ZQ0KICAgICAgICBbYXJyYXldICR1bml0ZSA9IEAoJ0tvJywnTW8nLCdHbycsJ1RvJywnUG8nKQ0KICAgICAgICBbaW50XSAkaSA9IC0xDQoNCiAgICAgICAgRG8gew0KCSAgICAgICAgJHRhaWxsZS89MTAyNA0KCSAgICAgICAgJGkrKw0KICAgICAgICB9IFVudGlsICggJHRhaWxsZSAtbHQgMTAwMCApDQoNCiAgICAgICAgJHRhaWxsZSA9IFttYXRoXTo6Um91bmQoJHRhaWxsZSwyLFtTeXN0ZW0uTWlkcG9pbnRSb3VuZGluZ106OkF3YXlGcm9tWmVybykNCg0KICAgICAgICBbYXJyYXldICR2YWxldXI9JHRhaWxsZS5Ub1N0cmluZygpLlNwbGl0KCIsIikNCg0KICAgICAgICAkZGVjaW1hbGU9KCR2YWxldXJbMV0gKyAiMDAiKS5TdWJzdHJpbmcoMCwyKQ0KICAgIA0KICAgICAgICAkcmVzdWx0YXQ9JHZhbGV1clswXSArICIsIiArICRkZWNpbWFsZSArICIgIiArICR1bml0ZVskaV0NCg0KICAgICAgICByZXR1cm4gJHJlc3VsdGF0DQoNCiAgICB9DQoNCiAgICBzdGF0aWMgW3N0cmluZ10gQ29udmVyc2lvblVuaXRlcyhbbG9uZ10gJHNpemUsW2ludF0gJHByZWNpc2lvbikgew0KDQogICAgICAgIGlmICgkc2l6ZSAtbHQgMTAwMCkgew0KICAgICAgICAgICAgcmV0dXJuICRzaXplLlRvU3RyaW5nKCkgKyAiICIgKyAib2N0ZXRzIg0KICAgICAgICB9DQoNCiAgICAgICAgW2RvdWJsZV0gJHRhaWxsZSA9ICRzaXplDQogICAgICAgIFthcnJheV0gJHVuaXRlID0gQCgnS28nLCdNbycsJ0dvJywnVG8nLCdQbycpDQogICAgICAgIFtpbnRdICRpID0gLTENCg0KICAgICAgICBEbyB7DQoJICAgICAgICAkdGFpbGxlLz0xMDI0DQoJICAgICAgICAkaSsrDQogICAgICAgIH0gVW50aWwgKCAkdGFpbGxlIC1sdCAxMDAwICkNCg0KICAgICAgICBpZiAoJHByZWNpc2lvbiAtZ3QgMTUpIHsgJHByZWNpc2lvbiA9IDE1IH0NCg0KICAgICAgICAkdGFpbGxlID0gW21hdGhdOjpSb3VuZCgkdGFpbGxlLCRwcmVjaXNpb24sW1N5c3RlbS5NaWRwb2ludFJvdW5kaW5nXTo6QXdheUZyb21aZXJvKQ0KDQogICAgICAgIFthcnJheV0gJHZhbGV1cj0kdGFpbGxlLlRvU3RyaW5nKCkuU3BsaXQoIiwiKQ0KDQogICAgICAgICRkZWNpbWFsZT0oJHZhbGV1clsxXSArICIwMDAwMDAwMDAwMDAwMDAwMDAwMCIpLlN1YnN0cmluZygwLCRwcmVjaXNpb24pDQogICAgDQogICAgICAgICRyZXN1bHRhdD0kdmFsZXVyWzBdICsgIiwiICsgJGRlY2ltYWxlICsgIiAiICsgJHVuaXRlWyRpXQ0KDQogICAgICAgIHJldHVybiAkcmVzdWx0YXQNCg0KICAgIH0NCg0KfQ0KDQpmdW5jdGlvbiBJbmZvc1BhcnRpdGlvbnMoKSB7DQoNCiAgICBHZXQtV21pT2JqZWN0IFdpbjMyX0Rpc2tEcml2ZSB8IEZvckVhY2gtT2JqZWN0IHsgDQogICAgICAgICRkaXNrID0gJF8gDQogICAgICAgICRwYXJ0aXRpb25zID0gIkFTU09DSUFUT1JTIE9GICIgKyAie1dpbjMyX0Rpc2tEcml2ZS5EZXZpY2VJRD0nJCgkZGlzay5EZXZpY2VJRCknfSAiICsgIldIRVJFIEFzc29jQ2xhc3MgPSBXaW4zMl9EaXNrRHJpdmVUb0Rpc2tQYXJ0aXRpb24iIA0KICAgIA0KICAgICAgICBHZXQtV21pT2JqZWN0IC1RdWVyeSAkcGFydGl0aW9ucyB8IEZvckVhY2gtT2JqZWN0IHsgDQogICAgICAgICAgICAkcGFydGl0aW9uID0gJF8gDQogICAgICAgICAgICAkZHJpdmVzID0gIkFTU09DSUFUT1JTIE9GICIgKyAie1dpbjMyX0Rpc2tQYXJ0aXRpb24uRGV2aWNlSUQ9JyQoJHBhcnRpdGlvbi5EZXZpY2VJRCknfSAiICsgIldIRVJFIEFzc29jQ2xhc3MgPSBXaW4zMl9Mb2dpY2FsRGlza1RvUGFydGl0aW9uIiANCiAgIA0KICAgICAgICAgICAgR2V0LVdtaU9iamVjdCAtUXVlcnkgJGRyaXZlcyB8IEZvckVhY2gtT2JqZWN0IHsgDQogICAgICAgICAgICAgICAgTmV3LU9iamVjdCAtVHlwZSBQU0N1c3RvbU9iamVjdCAtUHJvcGVydHkgQHsgDQogICAgICAgICAgICAgICAgRGlza01vZGVsICAgPSAkZGlzay5Nb2RlbCANCiAgICAgICAgICAgICAgICBQYXJ0aXRpb24gICA9ICRwYXJ0aXRpb24uTmFtZSANCiAgICAgICAgICAgICAgICBEcml2ZUxldHRlciA9ICRfLkRldmljZUlEIA0KICAgICAgICAgICAgICAgIFZvbHVtZU5hbWUgID0gJF8uVm9sdW1lTmFtZSANCiAgICAgICAgICAgICAgICB9DQogICAgICAgICAgICB9DQogICAgICAgIH0NCiAgICB9DQp9 )<Nul>"%tmp%\cbf0.0.8.26478eb6ed3f0d0e349fbac8e8e701fc" :cbf.26478eb6ed3f0d0e349fbac8e8e701fc >Nul Certutil -f -decode "%tmp%\cbf0.0.8.26478eb6ed3f0d0e349fbac8e8e701fc" "%tools%" goto :eof
7 avril 2024 à 09:07
C'est ch..., il faut à chaque fois rajouter les codes d'échappement couleurs que la mise en ligne ne retient pas.
Toujours dans le pinaillage de la présentation, tu as une ligne vierge après "Recherche en cours" que tu n'as pas après les autres rubriques.
Comme évoqué précédemment, la routine retourne les applications Windows et les programmes installés sur la partition système, pas ceux qui sont comme dans mon cas principalement installés sur une partition dédiée (F:, peu importe); je ne sais plus si le registre regroupe ces informations ou si le chemin y est propre à chaque logiciel, je vais tâcher de vérifier.
Sur le Wifi et comme illustré ci-dessus, pour se débarrasser de l'espace après les 2 points dans findstr (en l'état la réponse est
"Le profil « SFR_A918_5GHZ » est introuvable sur toutes les interfaces.")
et à défaut de savoir le faire directement au niveau de la variable %%A dans la boucle FOR, j'obtiens le résultat par:
if not exist "%~dp0Profils wifi sur %COMPUTERNAME%" (mkdir "%~dp0Profils wifi sur %COMPUTERNAME%") for /f "skip=1 tokens=2 delims=:" %%A in ('netsh wlan show profiles ^| findstr ":"') do set wifi=%%A set "wifi=%wifi:~1%" netsh wlan export profile name="%wifi%" key=clear folder=".\Profils wifi sur %COMPUTERNAME%"
Modifié le 7 avril 2024 à 09:15
rectification, ce n'est qu'une partie des programmes installés en F: qui ne ressortent pas, sans pour autant qu'il s'agisse forcément de programmes auto-exécutables, par exemple Microsoft Money et Avidemux passent à la trappe.
J'oubliais aussi, mon transit moche par fichiers texte temporaires permet à Disque N°... d'aligner les informations, pas ta syntaxe.
Modifié le 7 avril 2024 à 09:22
Merci pour le retour.
Concernant la liste des programmes, je pensais que tout était regroupé dans :
HKLM:\Software\Microsoft\Windows\CurrentVersion\Uninstall
Je vais chercher si je trouve qq chose à ce propos.
17 mars 2024 à 07:52
Bonjour,
Au temps pour moi, j'avais écrit le tiret correctement dans la console PowerShell sans quoi je n'aurais jamais eu le retour, je ne sais pas ce que j'ai fait en écrivant la commande dans un Batch au kilomètre sans jamais voir l'erreur de tiret...
Merci.
17 mars 2024 à 16:34
Pendant que je te tiens et si je peux me permettre d'abuser, pourquoi le résultat est correct dans PowerShell et pas en Batch?
Modifié le 17 mars 2024 à 18:02
je ne sais pas, souvent la gestion des crlf n'est déjà pas simple, alors là en empilant 2 environnements différents