Скрипт PowerShell для удаления файлов и папок по определенным критериям

Я пытаюсь написать скрипт, который будет искать:

  1. Папки с определенными именами.
  2. Файлы с определенными расширениями во время
  3. Исключение определенных каталогов из поиска.

После выполнения поиска я бы хотел, чтобы все 1 и 2 были удалены, а также родительские папки, если они не соответствуют 3. Вот что у меня есть до сих пор:

#Define list of computers to search for the files and folders in question
$ComputerList = Get-Content -Path "C:\computers.txt"

#Define a function for searching files and folders based on criteria:
function search {
    PROCESS {
        $srcFolder ="C:\test"
        Get-ChildItem $srcFolder -ErrorAction SilentlyContinue  -recurse -Force | Where-Object {`
            $_.Name -eq “keyword1” -or`
            $_.Name -eq “keyword2” -or`

              -and $_.fullname -notmatch 'C:\\Windows'`
              -and $_.fullname -notmatch 'C:\\Program Files'
        } | foreach-object -process { _.FullName }
    }
}

foreach ($strComputer in $ComputerList)
{
    #Perform the search function on all the computers listed
    foreach ($objItem in $colItems)
    {
        write-host         "-------------------------$strComputer ----------------" -foregroundcolor "red"
        write-host         "                      Files Found                                                    " -foregroundcolor "yellow" -backgroundcolor "black"
             $ComputerList | search

        "Number of files and folders found: " +($ComputerList | search | Measure-Object | Select-Object -ExpandProperty Count)
        write-host "------------------------------------------------------------------" -foregroundcolor "red"
    }

    if (($ComputerList | search).count -lt 1) {
        write-host "No files found to delete"
    }
    else {
        #Prompt if you want to delete the files
        write-host         "Do you want to delete these files?" -foregroundcolor "yellow" -backgroundcolor "black"
        $ComputerList | search | Remove-Item -Force -confirm
    }
}
Out-File -FilePath C:\results.txt

Итак, вот проблемы, которые у меня есть:

  1. Я могу заставить скрипт работать. Однако я не уверен, как удалить родительскую папку, защищая исключенные.

  2. Вывод в файл не работает. Файл создается, но он пустой. Почему?

Посмотрев на Get-ChildItem | Get-Member, я понял, что свойство Parent определяется System.IO.DirectoryInfo Parent, поэтому, если я могу добавить это в список элементов, которые нужно удалить, это должно работать.

Структура папок ниже. Чтобы повторить, возможно, более четко, я хочу удалить папку:

  1. Чье имя или содержание соответствует ключевому слову (ам)
  2. Если содержимое соответствует ключевому слову (ключевым словам), но имя папки не соответствует>, проверьте, не исключено ли оно явно, например. C:\Windows, C:\Program Files и т. д. > Если это так, не трогайте. Если это не так, удалите папку.**

Вот простые URL:

oi42.tinypic.com/2nulmz4.jpg
oi43.tinypic.com/fwlxd0.jpg
oi42.tinypic.com/315hdw9.jpg

person coding1    schedule 02.12.2011    source источник


Ответы (1)


Вы можете сделать это просто:

$folder = "C:\pst"
$excludedFolders = "c:\Windows", "c:\PST\new"

$itemsFromFolder = get-childitem $folder -recurse
$itemsToDelete = New-Object System.Collections.Generic.List[string]

foreach ($item in $itemsFromFolder)
{
    $exclude = $false
    foreach ($exclusion in $excludedFolders)
    {
        if ($item.FullName.ToLower().StartsWith($exclusion.ToLower()))
        {
            $exclude = $true
        }
    }
    if (!$exclude)
    {
        $itemsToDelete.Add($item.FullName)
    }
}

Как видите, вы можете заранее определить, какие папки вам нужно исключить, а затем отсортировать все свои элементы, отфильтровав каталоги, которые следует сохранить. Затем вы можете также исключить некоторые пути или расширения с помощью Remove-Item:

Remove-Item c:\scripts\* -include *.txt -exclude *test*
person Andrey Marchuk    schedule 05.12.2011
comment
Спасибо за ваш вклад. Я хотел бы, чтобы родитель также был удален, если он содержит папку или файл, содержащий указанные ключевые слова. - person coding1; 05.12.2011
comment
Другими словами, я хочу удалить оба, если они не соответствуют путям, которые я исключаю, то есть папке Windows и т. Д. - person coding1; 05.12.2011
comment
Еще раз спасибо. Боюсь, это не включает удаление родительской папки, если вы не знаете их имени. Пользователи будут создавать папки, содержащие файлы/другие папки, найденные по указанным выше ключевым словам. У меня нет возможности узнать имена родительских папок, только их содержимое, поэтому я не могу их явно включить. Есть ли какой-то общий способ включения родительских папок, таких как ../? - person coding1; 06.12.2011