Исключить определенные расширения файлов в сценарии резервного копирования PowerShell

0

Я новичок в сценариях PowerShell и мне нужна помощь с некоторым кодом. В коде есть большинство параметров, которые я ищу при резервном копировании профилей пользователей, но мне нужно установить исключения для расширений файлов, таких как .mp3 и .exe.

Как я могу настроить скрипт для этого?

$destination = "D:\CODs"

$folder = "Desktop",
"Downloads",
"Favorites",
"Documents",
"Music",
"Pictures",
"Videos",
"AppData\Local\Mozilla",
"AppData\Local\Google",
"AppData\Roaming\Mozilla"




###############################################################################################################

$username = gc env:username
$userprofile = gc env:userprofile
$appData = gc env:localAPPDATA


###### Restore data section ######
if ([IO.Directory]::Exists($destination + "\" + $username + "\")) 
{ 

    $caption = "Choose Action";
    $message = "A backup folder for $username already exists, would you like to restore the data to the local machine?";
    $Yes = new-Object System.Management.Automation.Host.ChoiceDescription "&Yes","Yes";
    $No = new-Object System.Management.Automation.Host.ChoiceDescription "&No","No";
    $choices = [System.Management.Automation.Host.ChoiceDescription[]]($Yes,$No);
    $answer = $host.ui.PromptForChoice($caption,$message,$choices,0)

    if ($answer -eq 0) 
    {

        write-host -ForegroundColor green "Restoring data to local machine for $username"
        foreach ($f in $folder)
        {   
            $currentLocalFolder = $userprofile + "\" + $f
            $currentRemoteFolder = $destination + "\" + $username + "\" + $f
            write-host -ForegroundColor cyan "  $f..."
            Copy-Item -ErrorAction silentlyContinue -recurse $currentRemoteFolder $userprofile

            if ($f -eq "AppData\Local\Mozilla") { rename-item $currentLocalFolder "$currentLocalFolder.old" }
            if ($f -eq "AppData\Roaming\Mozilla") { rename-item $currentLocalFolder "$currentLocalFolder.old" }
            if ($f -eq "AppData\Local\Google") { rename-item $currentLocalFolder "$currentLocalFolder.old" }

        }
        rename-item "$destination\$username" "$destination\$username.restored"
        write-host -ForegroundColor green "Restore Complete!"
    }

    else
    {
        write-host -ForegroundColor yellow "Aborting process"
        exit
    }
}

###### Backup Data section ########
else
{

    Write-Host -ForegroundColor green "Outlook is about to close, save any unsaved emails then press any key to continue ..."

    $x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

    Get-Process | Where { $_.Name -Eq "OUTLOOK" } | Kill

    write-host -ForegroundColor green "Backing up data from local machine for $username"


    foreach ($f in $folder)
    {   
        $currentLocalFolder = $userprofile + "\" + $f
        $currentRemoteFolder = $destination + "\" + $username + "\" + $f
        $currentFolderSize = (Get-ChildItem -ErrorAction silentlyContinue $currentLocalFolder -Recurse -Force | Measure-Object -ErrorAction silentlyContinue -Property Length -Sum ).Sum / 1MB
        $currentFolderSizeRounded = [System.Math]::Round($currentFolderSize)
        write-host -ForegroundColor cyan "  $f... ($currentFolderSizeRounded MB)"
        Copy-Item -ErrorAction silentlyContinue -recurse $currentLocalFolder $currentRemoteFolder
    }



    $oldStylePST = [IO.Directory]::GetFiles($appData + "\Microsoft\Outlook", "*.pst") 
    foreach($pst in $oldStylePST)   
    { 
        if ((test-path -path ($destination + "\" + $username + "\Documents\Outlook Files\oldstyle")) -eq 0){new-item -type directory -path ($destination + "\" + $username + "\Documents\Outlook Files\oldstyle") | out-null}
        write-host -ForegroundColor yellow "  $pst..."
        Copy-Item $pst ($destination + "\" + $username + "\Documents\Outlook Files\oldstyle")
    }    

    write-host -ForegroundColor green "Backup complete!"

} 
Эндрю Касайя
источник
Привет, Бен, у меня есть несколько требований, которые мне нужны для твоего ввода ... как сделать так, чтобы один и тот же скрипт делал приращения на основе даты последнего изменения всех файлов между источником и местом назначения, удалял старые файлы из папки назначения на основе дата из источника после указанного периода. Спасибо
Эндрю Касайя
Это становится немного сложнее. Вы можете проверить документацию для Remove-Itemи Rename-Itemкомандлетов. Обратите внимание, что вам может потребоваться использовать Get-ChildItem -Recurseи принимать индивидуальные решения о копировании, если вам нужен точный контроль. Если у вас возникнут какие-либо проблемы, я предлагаю опубликовать новый вопрос для лучшей наглядности.
Бен N

Ответы:

1

Вы можете использовать параметр Copy-Item' -Exclude. Он берет коллекцию имен файлов, которые могут содержать символы подстановки, и избегает их копирования. Таким образом, вы можете изменить эту строку:

Copy-Item -ErrorAction silentlyContinue -recurse $currentLocalFolder $currentRemoteFolder

Для этого (обратите внимание на дополнительный параметр в начале):

Copy-Item -Exclude '*.mp3', '*.exe' -ErrorAction silentlyContinue -recurse $currentLocalFolder $currentRemoteFolder

Вы можете добавить столько исключений, сколько захотите.

Бен Н
источник
Работал .... Очень ценил
Андрей Касайя,