Powershell – Dateien, die eine Zeichenfolge ENTHALTEN, stapelweise löschen?

Powershell – Dateien, die eine Zeichenfolge ENTHALTEN, stapelweise löschen?
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>

Ich versuche, alle Dateien stapelweise zu löschen, deren Name die Zeichenfolge „(Beta)“ ENTHÄLT. Die oben eingefügte Ausgabe zeigt den von mir geschriebenen Code und die Ausgabe. Wie Sie sehen, stimmte es nicht mit der Zeichenfolge überein, obwohl die Namen diese Zeichenfolge enthalten.

Ich bin ein Neuling und versuche, die Dokumentation zu verstehen, aber überall, wo ich lese, sollte ich -match und nicht -contains verwenden.

Für jede Hilfe bin ich sehr dankbar.

Antwort1

Wenn Sie versuchen, Dateinamen abzugleichen, die die Zeichenfolge enthalten (Beta), sollten Sie nicht verwenden Get-Content. Mit Get-Contentöffnen Sie die Dateien und suchen in deren Inhalten/Werten nach dem Wort, (Beta)was fehlschlägt.

Sie sollten nur den Dateinamen testen. Ihr Code sollte sein:

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}
 }

Antwort2

Während die akzeptierte Antwort funktioniert und Ihren Code korrigiert, möchte ich Ihnen einfach eine Lösung zeigen, die sehr einfach zu verwenden wäre, auch direkt in der Shell

Get-ChildItem $ParentFolder | Where-Object { $_.Name -like '*(Beta)*' } | Remove-Item -force

oder kurz:

gci $ParentFolder | ? Name -like '*(Beta)*' | del -Force

eigentlich können wir es sogar noch kürzer machen, da Get-ChildItemhat einen -FilterParameter

gci $ParentFolder -Filter '*(Beta)*' | del -force

oder, um es so kurz wie möglich zu machen, können Sie einfach Folgendes tun, da sogar Remove-Itemein Filter vorhanden ist:

del $ParentPath\*(Beta)* -Force

da in PowerShell alles ein Objekt ist, können Sie einfach die Objekte filtern, die Get-ChildItem(oder ein beliebiges anderes Cmdlet) mit Where-Objectoder seinem Alias ​​zurückgibt ?.

In diesem Fall, da Get-ChildItemund Remove-Itemeinen Parameter haben -filter, können Sie sogar Ihre gewünschten Objekte erhalten, ohne dass SieWhere-Object

verwandte Informationen