2012-07-24 5 views
1

J'essaie de créer un script pour supprimer les fichiers CAB dans les serveurs virtuels. Pour une raison quelconque, le code que j'ai créé finit par ne supprimer aucun fichier CAB et tente à la place de supprimer l'intégralité du répertoire WINDOWS, et je ne sais pas pourquoi cela se produit. Était curieux de savoir si quelqu'un pourrait avoir des idées sur ce que la question peut être, puisque je ne trouve rien:Suppression de fichiers CAB

$dir = "\\$server" + '\C$\windows' 

$cabinetArray = @() 
foreach ($item in get-childitem -path $dir){ 
    if ($item.name -like "*.cab"){ 
     $cabinetArray = $cabinetArray + $item 
     } 
    } 

for ($i = 0; $i -le $cabinetArray.length; $i++){ 
    $removal = $dir + "\" + $cabinetArray[$i] 
    remove-item $removal -force -recurse 
    } 

Je l'ai fait quelques tests et il semble que, pour une raison quelconque mon tableau que je suis en train d'utiliser pour rassembler tous les dossiers de coffret n'est même pas rempli pour une raison quelconque. Je ne suis pas sûr s'il y a une manière spécifique de rassembler seulement les dossiers de .cab puisque maintenant chaque fois que je l'exécute sur mon serveur de test il essaye de tout supprimer.

Répondre

2

Je ne sais pas si la suppression de tous les fichiers CAB dans ce dossier est une bonne idée ou non, mais je vais répondre à votre question. Vous faites beaucoup de maths et construisez votre propre collection d'objets quand PoweShell fera tout pour vous. Essayez quelque chose comme ceci:

$dir = "\\" + $server + '\C$\windows' 
$cabinetFiles = Get-ChildItem -Path $dir -Filter "*.cab" -Recurse 
$cabinetFiles | %{ 
    Remove-Item -Path $_.FullName -Force 
} 

Ou, comme une doublure:

Get-ChildItem -Path ("\\" + $server + '\C$\windows') -Filter "*.cab" -Recurse | %{Remove-Item -Path $_.FullName -Force} 
+0

Merci Chris! Je ne savais pas qu'il y avait un moyen de le faire en une ligne, mais cela rend les choses vraiment utiles. Question rapide ce paquebot fonctionnera-t-il à peu près tout ce que vous voulez obtenir? Je me demandais juste pour de futures références. – Valrok

+0

Il devrait, oui. En outre, avant de l'exécuter, ajoutez -WhatIf après l'applet de commande remove-item pour vous assurer qu'il ne supprime que ce que vous voulez. Puis supprimez-le afin que les fichiers seront effectivement supprimés. –

1

Pour une raison quelconque, le code que j'ai créé finit par ne pas supprimer des fichiers CAB et tente plutôt de supprimer l'intégralité du répertoire WINDOWS, et je ne sais pas pourquoi cela se produit.

Cela se produit parce que votre boucle for est entrée, et cela se produit parce que la longueur de $ cabinetArray est zéro. Une fois la boucle for entrée, la variable $ removal reçoit la valeur de $ dir plus une barre oblique inverse. Vous appelez ensuite remove-item dans le répertoire Windows.

2

Utilisez le pipeline, voici une version simplifiée de votre code (remove -WhatIf supprime les fichiers). Le code récupère tous les fichiers * .cab du répertoire windows de la boîte distante (de manière récursive), s'assure que seuls les objets du fichier sont transmis, puis les supprime.

Get-ChildItem "\\$server\admin$" -Filter *.cab -Recurse | 
Where-Object {!$_.PSIsContainer} | 
Remove-Item -Force -WhatIf