3
votes

Powershell supprime les sous-dossiers avec un nom spécifique

Je suis nouveau dans PowerShell et j'ai essayé de créer un script, mais jusqu'à présent, je n'ai pas réussi. Je veux qu'il fasse une tâche spécifique qui est;

Je dois pouvoir rechercher dans un lecteur un dossier spécifique appelé "Cookies" et le supprimer. Le problème est que les cookies du dossier sont définis à plusieurs endroits.

Exemple:

$cookies= Get-ChildItem \\myserver\test\User\Profiles\*\AppData\Roaming\Microsoft\Windows\Cookies

foreach ($cookie in $cookies){
    Remove-Item "$cookies" -Force -Recurse -ErrorAction SilentlyContinue   
}

et continuez ...

Comment puis-je obtenir PowerShell pour parcourir tous ces différents dossiers USER pour rechercher le dossier Cookies et le supprimer.

J'ai trouvé ceci, mais j'espérais qu'un gourou PowerShell pourrait m'aider.

\\\myserver\test\User\Profiles\USER1\AppData\Roaming\Microsoft\Windows\Cookies
\\\myserver\test\User\Profiles\USER2\AppData\Roaming\Microsoft\Windows\Cookies
\\\myserver\test\User\Profiles\USER3\AppData\Roaming\Microsoft\Windows\Cookies
\\\myserver\test\User\Profiles\USER4\AppData\Roaming\Microsoft\Windows\Cookies

Est-ce que cela fonctionnera?


0 commentaires

3 Réponses :


0
votes

Essayez cette doublure -

$path = "\\myserver\test\User\Profiles\"
Get-ChildItem $path -Recurse -Directory | Where-Object {$_.Name -eq 'Cookies'} | % {Remove-Item $_.FullName}


2 commentaires

Laisse moi essayer, je te tiendrai au courant


Salut Vivek, j'ai un peu changé le code parce que nous voulons qu'un code supprime les fichiers de cookies qui sont des fichiers .txt et ils doivent être plus anciens que 60 jours. `get-item -path D: \ User \ Profiles * \ AppData \ Roaming \ Microsoft \ Windows \ Cookies * -filter" * .txt "-force | Where-Object {$ _. LastWriteTime -lt (get-date) .addDays (-60)} `Mais maintenant j'obtiens une erreur de mémoire.



4
votes

Vous y êtes presque. Pas besoin de guillemets autour de $ cookies .

Si vous faites un foreach ($ cookie in $ cookies) , alors opérez sur $ cookie code > dans le bloc de script, pas $cookies.

Cela fonctionne:

Get-ChildItem \\myserver\test\User\Profiles\*\AppData\Roaming\Microsoft\Windows\Cookies | Remove-Item -Force -Recurse -ErrorAction SilentlyContinue

mais cela fonctionnera aussi, sans une boucle:

$cookies = Get-ChildItem \\myserver\test\User\Profiles\*\AppData\Roaming\Microsoft\Windows\Cookies
Remove-Item $cookies -Force -Recurse -ErrorAction SilentlyContinue

Si vous voulez un one-liner et aucune variable:

$cookies = Get-ChildItem \\myserver\test\User\Profiles\*\AppData\Roaming\Microsoft\Windows\Cookies

foreach ($cookie in $cookies){
    Remove-Item $cookie -Force -Recurse -ErrorAction SilentlyContinue   
}


6 commentaires

@Roy Travailler avec le pipeline (dernier exemple) est toujours préférable, lorsque cela est possible.


@Hoi Gert Jan, Merci pour cela, mais notre administrateur de sécurité souhaite une petite modification du code. Ce qui consiste à supprimer les fichiers .txt du dossier de cookies qui sont plus anciens que 60 jours, mais j'obtiens une erreur de mémoire. get-item -path D: \ User \ Profiles \ * \ AppData \ Roaming \ Microsoft \ Windows \ Cookies‌ \ * -filter "* .txt" -force | Where-Object {$ _. LastWriteTime -lt (get-date) .addDays (-60)}


@Roy Votre code me semble correct. Y a-t-il beaucoup de fichiers cookies à collecter?


Bien fait, mais vous devriez utiliser Remove-Item $ cookie.FullName , car le paramètre implicite -Path (idem pour -LiteralPath ) lie son argument sous forme de chaîne , et dans Windows PowerShell Get-ChildItem situationnellement se transforme en simple nom de fichier , ce qui entraîne le la commande échoue ou, pire, supprime le mauvais élément. Cela ne se produira pas avec cet appel Get-ChildItem particulier, mais toujours en utilisant .FullName lors du passage de Get-ChildItem / Get- L'élément comme argument est une bonne habitude à prendre (l'entrée du pipeline n'est pas affectée). Voir stackoverflow.com/a/53400031/45375 pour en savoir plus.


Oui, j'ai environ 700 utilisateurs et chacun d'entre eux a environ 4000 cookies ou plus ...


@Roy Ensuite, assurez-vous de ne pas stocker tous ces objets dans une variable, mais utilisez une procédure pipelined appropriée, comme celle ci-dessus.



0
votes

Ceci est une version un peu simplifiée. Juste pour des raisons de sécurité, je l'exécuterais d'abord avec -WhatIf pour vérifier si le résultat est correct. Ensuite, commentez simplement l'autre ligne

$path = ""
$pattern = ""
Get-ChildItem $path -recurse -directory -include $pattern |
   Remove-Item -WhatIf
   #Remove-Item -Force -ErrorAction SilentlyContinue


2 commentaires

Salut Bakudan, c'est pour la réponse rapide. J'ai dû modifier un peu le code car l'un de nos administrateurs de sécurité souhaite qu'il supprime les fichiers .txt du dossier cookies qui datent de plus de 60 jours. Mais maintenant, j'obtiens une erreur de mémoire. get-item -path D: \ User \ Profiles \ * \ AppData \ Roaming \ Microsoft \ Windows \ Cookies‌ \ * -filter "* .txt" -force | Where-Object {$ _. LastWriteTime -lt (get-date) .addDays (-60)}


@Roy Je n'ai pas vu une telle erreur, donc je ne peux pas vous aider avec ça. Pour l'autre chose, à propos des cookies datant de plus de 60 jours - il sera préférable de mettre à jour votre question.