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-ChildItem
hat einen -Filter
Parameter
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-Item
ein 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-Object
oder seinem Alias zurückgibt ?
.
In diesem Fall, da Get-ChildItem
und Remove-Item
einen Parameter haben -filter
, können Sie sogar Ihre gewünschten Objekte erhalten, ohne dass SieWhere-Object