Commandes PowerShell dans Batch
brucine Messages postés 22038 Date d'inscription Statut Membre Dernière intervention -
Bonjour,
Je ne comprends rien à PowerShell, je me contente d'en utiliser quelques commandes dans des Batchs quand c'est plus facile ou que l'option Batch n'existe pas.
Le retour se fait sans problème y compris quand la commande PowerShell inclut un pipe, comme par exemple ici (et où bien sûr la variable %letter% correspondant aux lettres de partitions successives a été définie précédemment).
powershell.exe -command "& { get-volume -DriveLetter %letter% | Format-Table -HideTableHeaders }">>%~dp0_tailledisque.txt
Je me fais par contre planter en cherchant à intégrer ça qui marche parfaitement dans le terminal PowerShell:
[System.IO.DriveInfo]::GetDrives() | Format_Table
J'ai un doute sur l'interpréteur de commandes se heurtant aux crochets, si je veux tester avec une commande ECHO en redirigeant ce "texte" vers un fichier txt ou ps1, je me fais planter sauf si je les échappe:
echo ^[System.IO.DriveInfo^]::GetDrives() ^| Format_Table>>%~dp0test.txt
Mais retour à la case départ si je mets ça dans les accolades de powershell.exe, c'est lui qui plante sur ces caractères d'échappement.
Ce n'est pas fondamental, j'obtiens le plus gros des champs souhaités par un autre Cmdlet sans "caractères spéciaux", mais pour résoudre ce type de problème à l'avenir, quelle est la bonne syntaxe?
Merci.
- Echo off powershell
- @Echo off ✓ - Forum Windows 7
- I o on off ✓ - Forum Loisirs / Divertissements
- On off symbole ✓ - Forum Matériel & Système
- Logo on off - Forum Facebook
- Switch off - Télécharger - Divers Utilitaires
6 réponses
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.
Pour avoir le même résultat dans batch, il faut utiliser write-host au lieu de write.
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.
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.
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
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
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.
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
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...).
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").
Tiens, mais comme je te l'ai dit, c'est efficace mais pas très orthodoxe.
https://www.cjoint.com/c/NDbjPBonshF
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.
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 questionPour 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
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.
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
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%"
é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?
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
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%"
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.
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.
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?
je ne sais pas, souvent la gestion des crlf n'est déjà pas simple, alors là en empilant 2 environnements différents