2017-10-12 3 views
0

J'ai un extrait de code sur ce site m'a aidé et je voudrais modifier pour se comporter d'une manière différente si possible? L'exécution directe du fichier sur un ordinateur local analyse les dossiers des profils utilisateur, omet les profils système (pour éviter une analyse inutile) et supprime 2 dossiers spécifiés de chaque dossier local des données de l'application utilisateur.Supprimer certains dossiers de C: Users % username% AppData Local via la liste des noms d'hôtes

Ce que je dois faire maintenant est de l'exécuter sur le réseau où j'ai une liste de noms d'hôte et de le faire de cette façon. Ce qui suit fonctionne directement sur le PC.

For /F "Skip=1 Delims=" %%A In (
    '"WMIc Path Win32_UserProfile Where (Special!='True') Get LocalPath"' 
    ) Do For /F "Delims= " %%B In ("%%A") Do (
For %%I In (Folder1 Folder_2) Do (If Exist "%%B\AppData\Local\%%I\" (
    RMDIR "%%B\AppData\Local\%%I" /S /Q >nul 2>&1) 
    ) 
) 

Je voudrais changer quelque chose comme

for /f "usebackq tokens=*" %%A in ("%~dp0hostnames.txt") do (
    For /F "Skip=1 Delims=" %%A In (
     '"WMIc Path Win32_UserProfile Where (Special!='True') Get LocalPath"' 
     ) Do For /F "Delims= " %%B In ("%%A") Do (
    For %%I In (Folder1 Folder_2) Do (If Exist "\\%%B\C$\AppData\Local\%%I\" (
     RMDIR "\\%%B\C$\AppData\Local\%%I" /S /Q >nul 2>&1) 
     ) 
    ) 

J'ai eu un aller, mais il se fait au-delà de mes connaissances limitées, je pense que je dois delayedexpansion et aussi passer à autre chose la lettre autre variable le long l'alphabet, mais je ne sais pas dans quelle direction: -

Toute aide appréciée ..thanks

Répondre

0

Ceci est tout à fait non testé, mais je suppose que vous pouvez utiliser l'option /Node de WMIC:

@Echo Off 
For /F "UseBackQ Delims=" %%Z In ("%~dp0hostnames.txt" 
) Do For /F "UseBackQ Skip=1 Delims=" %%X In (`WMIC /Node:'%%~Z' Path^ 
Win32_UserProfile Where "Special='False'" Get LocalPath` 
) Do For /F "Delims=" %%Y In ("%%X") Do Call :Sub "%%~Z" %%Y 
Exit/B 

:Sub 
For /F "Tokens=1* Delims=:\" %%V In ("%~2") Do For %%U In (Folder1 Folder_2 
) Do If Exist "\\%~1\%%~V$\%%~W\AppData\Local\%%~U"^ 
RD/S/Q "\\%~1\%%~V$\%%~W\AppData\Local\%%~U" 
GoTo :EOF 
0

Voici une façon de le faire dans PowerShell. Lorsque vous êtes sûr que les répertoires corrects seront supprimés, supprimez le commutateur -WhatIf de la commande Remove-Item.

$dirlist = 'dir1', 'dir2' 
$userdirs = (Get-CimInstance -ClassName Win32_UserProfile -Filter "Special=$false").LocalPath 

foreach ($ud in $userdirs) { 
    foreach ($d in $dirlist) { 
     if (Test-Path -Path "$ud\$d") { 
      Remove-Item -Path "$ud\$d" -Recurse -WhatIf 
     } 
    } 
} 

L'utilisation Invoke-Command vous permettra d'exécuter le script sur tous les ordinateurs simultanément. Cela suppose que le script précédent a été enregistré en tant que udscan.ps1.

Invoke-Command -ComputerName 'host1', 'host2' -FilePath .\udscan.ps1