![Powershell: ¿eliminar por lotes archivos que CONTIENEN alguna cadena?](https://rvso.com/image/1654379/Powershell%3A%20%C2%BFeliminar%20por%20lotes%20archivos%20que%20CONTIENEN%20alguna%20cadena%3F.png)
PS C:\RetroArch-Win64\_ROMS\nointro.n64> foreach ($file in (get-childitem $ParentFolder)){
>> write-verbose "($file.name)" -Verbose
>> if ((get-content $file.name) -match '(Beta)'){
>> write-verbose "found the string, deleting" -Verbose
>> remove-item $file.name -force -WhatIf
>> }else{ write-verbose "Didnt match" -Verbose
>> }
>>
>> }
VERBOSE: (007 - The World Is Not Enough (Europe) (En,Fr,De).7z.name)
VERBOSE: Didnt match
VERBOSE: (007 - The World Is Not Enough (USA) (v2) (Beta).7z.name)
VERBOSE: Didnt match
VERBOSE: (007 - The World Is Not Enough (USA) (v21) (Beta).7z.name)
VERBOSE: Didnt match
VERBOSE: (007 - The World Is Not Enough (USA).7z.name)
PS C:\RetroArch-Win64\_ROMS\nointro.n64>
Estoy intentando eliminar por lotes todos los archivos cuyo nombre CONTIENE la cadena '(Beta)'. El resultado pegado arriba muestra el código que escribí y el resultado. Como puede ver, "No coincidió" con la cadena a pesar de que los nombres contienen esa cadena.
Soy un novato y trato de entender los documentos, pero en todos los lugares que leo debo usar -match not -contains.
Cualquier ayuda es muy apreciada.
Respuesta1
Si está intentando hacer coincidir nombres de archivos que contienen la cadena (Beta)
, entonces no debería utilizar Get-Content
. Con Get-Content
, estás abriendo los archivos y buscando en su contenido/valores la palabra (Beta)
que está fallando.
Sólo debes probar el nombre del archivo. Tu código debería ser:
ForEach ($file in (Get-ChildItem $ParentFolder)){
Write-Verbose "($file.name)" -Verbose
if ($file.Name -Match '(Beta)'){
Write-Verbose "found the string, deleting" -Verbose
Remove-Item $file.Name -WhatIf
}else{ Write-Verbose "Didnt match" -Verbose}
}
Respuesta2
Si bien la respuesta aceptada funciona y corrige su código, simplemente quiero mostrarle una solución que sería muy fácil de usar, también directamente en el shell.
Get-ChildItem $ParentFolder | Where-Object { $_.Name -like '*(Beta)*' } | Remove-Item -force
o en resumen:
gci $ParentFolder | ? Name -like '*(Beta)*' | del -Force
de hecho, podemos hacerlo aún más corto, ya que Get-ChildItem
tiene un -Filter
parámetro
gci $ParentFolder -Filter '*(Beta)*' | del -force
o, para que sea lo más corto posible, simplemente puedes hacer lo siguiente, ya que incluso Remove-Item
tiene un filtro:
del $ParentPath\*(Beta)* -Force
Dado que todo en PowerShell es un objeto, simplemente puede filtrar los objetos que Get-ChildItem
(o cualquier otro cmdlet) devuelve con Where-Object
o su alias ?
.
En este caso, dado que Get-ChildItem
y Remove-Item
tiene un -filter
parámetro, incluso puede obtener los objetos deseados sin necesidad deWhere-Object