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>
Я пытаюсь удалить все файлы, имя которых СОДЕРЖИТ строку '(Beta)'. Вывод, вставленный выше, показывает код, который я написал, и вывод. Как вы можете видеть, он 'Не соответствует' строке, хотя имена содержат эту строку.
Я новичок и пытаюсь понять документацию, но везде, где я читаю, мне следует использовать -match, а не -contains.
Любая помощь будет высоко оценена.
решение1
Если вы пытаетесь сопоставить имена файлов, которые содержат строку (Beta)
, то вам не следует использовать Get-Content
. С помощью Get-Content
вы открываете файлы и ищете в их содержимом/значениях слово, (Beta)
которое не удается.
Вам следует проверить только имя файла. Ваш код должен быть:
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}
}
решение2
Хотя принятый ответ работает и исправляет ваш код, я просто хочу показать вам решение, которое было бы очень просто использовать, в том числе непосредственно в оболочке.
Get-ChildItem $ParentFolder | Where-Object { $_.Name -like '*(Beta)*' } | Remove-Item -force
или короче:
gci $ParentFolder | ? Name -like '*(Beta)*' | del -Force
на самом деле, мы можем сделать его еще короче, так как Get-ChildItem
имеет -Filter
параметр
gci $ParentFolder -Filter '*(Beta)*' | del -force
или, чтобы сделать это максимально коротко, вы можете просто сделать следующее, поскольку даже Remove-Item
есть фильтр:
del $ParentPath\*(Beta)* -Force
Поскольку все в PowerShell является объектом, вы можете просто отфильтровать объекты, которые Get-ChildItem
(или любой другой командлет) возвращает с помощью Where-Object
или его псевдонима ?
.
В этом случае, поскольку Get-ChildItem
и Remove-Item
имеют -filter
параметр, вы даже можете получить желаемые объекты без необходимостиWhere-Object