2010-10-13 18 views
5

¿Es posible definir una matriz de nombres de archivos (todos los archivos en carpetas diferentes) y luego en un bucle eliminarlos a todos, o hacer algo más?Eliminar archivos definidos en una matriz con Powershell

En realidad, necesito crear algunos enlaces simbólicos usando mklink a un archivo, colocando esos enlaces en carpetas diferentes, reemplazando los enlaces anteriores si hubiera alguno.

Respuesta

6

La eliminación de una serie de nombres de archivo es simple:

Remove-Item foo.txt,c:\temp\bar.txt,baz\baz.txt 

O a través de una variable:

$files = 'foo.txt','c:\temp\bar.txt','baz\baz.txt' 
Remove-Item $files 

Y a continuación, sobre la base de todos los archivos en carpetas diferentes:

$folders = 'C:\temp','C:\users\joe\foo' 
Get-ChildItem $folders -r | Where {!$_.PSIsContainer} | Remove-Item -WhatIf 

quitar el -WhatIf para hacer la eliminación real.

Si desea eliminar un archivo con un nombre específico, puede usar el parámetro -Filter en Get-ChildItem. Este sería el enfoque de mejor rendimiento:

$folders = 'C:\temp','C:\users\joe\foo' 
Get-ChildItem $folders -r -filter foo.bak | Remove-Item -WhatIf 

Si el nombre requiere coincidencia más sofisticado, puede utilizar una expresión regular en un caso ScriptBlock por ejemplo:

$folders = 'C:\temp','C:\users\joe\foo' 
Get-ChildItem $folders -r | Where {$_.Name -match 'f\d+.bak$'} | 
          Remove-Item -WhatIf 
+0

¿qué es PSIsContainer? – Agzam

+0

¿Puede decirme cómo eliminar archivos con el nombre de archivo dado en todas las carpetas definidas en una variable? – Agzam

+1

$ PSIsContainer es una propiedad añadida por PowerShell que indica si el "elemento hijo" es un contenedor (directorio) o no (archivo). Tenga en cuenta que este concepto es independiente del proveedor real (sistema de archivos, certificado, wsman, etc.). –

1

algo como esto debería funcionar: puede 't prueba en este momento, lo siento

$filenames = @('filename1.txt', 'filename2.txt', 'filename3.txt') 

foreach($file in $filenames) 
{ 
    #GCI recursive to find all instances of this filename 
    $filesToDelete = Get-ChildItem -R | where {$_.Name -eq $file} 

    foreach($f in $filesToDelete) 
    { 
     #delete the file that matches, etc. here 
     # just using Write-Host to echo out the name for now 
     Write-Host $f.Name 
    } 

} 

Como con la mayoría PowerShell, puede comprimir realmente esto, pero quiero ed para extender para la explicación.

Puede extender esto para que coincida con sus necesidades. Por ejemplo, si necesita todos los archivos que contienen la palabra "eliminar", podría hacer gci | donde {$ _. Nombre -como "$ archivo"}

+0

Su parte .net produce un resultado no deseado (el método "Agregar") que debe descartarse. Intente ejecutar '$ filelist = New-Object System.Collections.ArrayList; $ filelist.add ("filename1.txt") '. – stej

+0

No tuve tiempo de probarlo ayer. Eliminado por ahora. –

Cuestiones relacionadas