Aide sur une amélioration d'un script powershell

Aide sur une amélioration d'un script powershell - Divers - Programmation

Marsh Posté le 26-08-2020 à 20:25:22    

Bonjour,
 
J'ai compilé plusieurs éléments batch afin de créer un script permettant de nettoyer mes installations Windows 10 fraîches.
Mais j'ai un soucis d'optimisation.
Le script est visible ici : https://github.com/Bagu/W10CrapRemo [...] %20One.bat
 
En fait, la partie powershell me pose un problème d'optimisation.
Actuellement, j'ai une variable contenant les appels de programmes Windows 10 à virer.
Puis je boucle dessus afin d'exécuter la suppression :

Code :
  1. foreach ($Bloat in $Bloatware) {
  2.  Get-AppxPackage $Bloat| Remove-AppxPackage
  3.  Get-AppxProvisionedPackage -Online | Where-Object DisplayName -like $Bloat | Remove-AppxProvisionedPackage -Online
  4.  Write-Output "Trying to remove $Bloat."
  5. }


 
Quelqu'un aurait-il les connaissances afin de modifier ce comportement.
L'idée serait de lister ce qui est installé effectivement sur le système par une commande de ce type :

Code :
  1. Get-AppxPackage | Select Name, PackageFullNameGet-AppxPackage | Select Name, PackageFullName


 
puis de n'exécuter que s'il y a une correspondance (en prenant en compte le *) la suppression. (partie que je ne parviens pas à faire)
 
Merci de vos suggestions et/ou aide.

Reply

Marsh Posté le 26-08-2020 à 20:25:22   

Reply

Marsh Posté le 26-08-2020 à 22:21:54    

L'idée est la suivante:
 
La commande (comme tu l'as décrite ci-dessus) te renvoie une liste d'applications, que tu vas stocker dans une variable (p.ex $applications). D'ailleurs, as-tu vraiment besoin du PackageFullName ? A mon avis, Name est suffissant
 
Ensuite:  
 
foreach ($application in $applications) {
     xxx
}
 
Dans xxx, tu vas devoir voir si $application se trouve dans la liste $Bloatware. Pour cela, je te recommande de voir -contains.
 
 
Voilà !
 

Reply

Marsh Posté le 27-08-2020 à 10:28:09    

Merci.
 
Cependant j'ai un soucis pour stocker le résultat de la commande dans une variable.
Je pensais qu'écrire :

Code :
  1. $var = $(Get-AppxPackage | Select Name)


 
Suffirait pour avoir une variable de type tableau avec chaque nom représentant un nom de programme, et visiblement pas.
 
Par contre, le Contains est effectivement prometteur pour la suite.

Reply

Marsh Posté le 27-08-2020 à 12:32:47    

Code :
  1. $apps = $(Get-AppxPackage | Select Name)
  2. foreach ($app in $apps) {
  3.     xxx
  4. }


 
$app contient un string.
 
xxx: Maintenant, tu regardes dans ta liste $Bloatware si elle contient $app.

Reply

Marsh Posté le 27-08-2020 à 14:04:33    

Hé bien actuellement, cela ne fonctionne pas.

Code :
  1. $apps = $(Get-AppxPackage | Select Name)
  2. foreach ($app in $apps) {
  3.         Write-Output $app
  4. }


 
Renvoi du vide.
 
C'est bien là le soucis. Et je ne comprends pas pourquoi.
 
J'ai fait un petit test comme ceci :

Code :
  1. $Bloatware = @(
  2.  "*Camera*"
  3.  "Windows" )
  4. $apps = $(Get-AppxPackage | Select Name)
  5. foreach ($app in $apps) {
  6.         if ($Bloatware -contains $app -eq $true) { Write-Host $app }
  7. }


 
Histoire de voir à tester...Sans succès


Message édité par bagu le 27-08-2020 à 14:12:14
Reply

Marsh Posté le 27-08-2020 à 14:09:44    

Bizarre.
 
https://i.postimg.cc/8zSbSvfL/cap.png
 
Même avec Write-Output, cela fonctionne dans mon cas.

Reply

Marsh Posté le 27-08-2020 à 14:12:57    

J'ai fait un petit test comme ceci :

Code :
  1. $Bloatware = @(
  2.  "*Camera*"
  3.  "Windows" )
  4. $apps = $(Get-AppxPackage | Select Name)
  5. foreach ($app in $apps) {
  6.         if ($Bloatware -contains $app -eq $true) { Write-Host $app }
  7. }


 
Histoire de voir à tester...Sans succès
 
Alors par contre, j'ai une sortie si je modifie Write-output en Write-Host mais la condition ne match jamais :S


Message édité par bagu le 27-08-2020 à 14:13:48
Reply

Marsh Posté le 29-08-2020 à 11:52:05    

Salut,
D'après ce que j'ai compris de l'opérateur "-contains", il faut que les deux expressions comparées soient rigoureusement identiques pour qu'il renvoie "true".
Dans ton cas, il faudrait qu'un des éléments du tableau $Bloatware soit strictement égal à $app  pour que la condition soit vérifiée.
 
Si j'ai bien compris, tu souhaites avoir un retour si l'un des éléments $apps contient en partie un des mots de $Bloatware. Donc, ce n'est pas "-contains" qu'il te faut utiliser mais a priori "-match".  
 
Voir ici (en anglais) la documentation https://docs.microsoft.com/en-us/po [...] wershell-7
 
Il faut aussi écrire la commande dans "l'autre sens" $app -match <un élément de $Bloatware>


Message édité par itela le 29-08-2020 à 12:37:11
Reply

Marsh Posté le 30-08-2020 à 21:55:04    

Salut,
 
Merci pour le lien, mais match ne semblait pas fonctionner.
Par contre, like, lui semble donner le bon résultat...
 
Voici un test :

Code :
  1. $bloatware = @(
  2.  "Microsoft.BingNews"
  3.  "Microsoft.Windows.Cortana"
  4.  "Microsoft.549981C3F5F10"
  5.  "*Camera*"
  6.  "*Windows*" )
  7. $apps = $(Get-AppxPackage | Select Name)
  8. foreach ($bloat in $bloatware)
  9. {
  10.     foreach ($app in $apps)
  11.     {
  12.         if ($app -like $bloat -eq $true) { Write-Host $app }
  13.     }
  14. }


 
Il semblerait que je tienne le bon bout.
Je vais faire plus de tests afin de voir si ça répond à mes besoins.
Je me suis monter une image virtualbox afin de faire des essais.

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed