iNNOKENTIY21
Silver Member | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Код: <# .NOTES Автор: iNNOKENTIY21 #> #Requires -RunAsAdministrator Param ( # Что копировать. Полный путь к папке источнику [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string] $Source, # Куда копировать. Полный путь к папке назначения [Parameter(Mandatory)] [ValidateNotNullOrEmpty()] [string] $Destination ) function New-ShadowCopy { #Requires -RunAsAdministrator Param ( # Диск для создания теневой копии (Пример: C:\ или C:) [Parameter(Mandatory = $true, HelpMessage = 'Укажите диск (например c:) для создания теневой копии')] [ValidateNotNullOrEmpty()] [ValidateCount(2, 3)] [ValidateScript( { (Test-Path $_ -PathType Container) -and (Split-Path $_ -IsAbsolute) })] [String] $Disc ) if ($Disc.EndsWith(':')) { $Disc = Join-Path -Path $Disc -ChildPath \ } # Создаём теневую копию $ShadowID = ((Get-WmiObject -List Win32_ShadowCopy).Create($Disc, "ClientAccessible")).ShadowID $DeviceObject = (Get-WmiObject Win32_ShadowCopy | Where-Object { $_.ID -eq $ShadowID }).DeviceObject $ShadowCopyPath = Join-Path -Path $DeviceObject -ChildPath \ # Создаём ссылку на теневую копию $MountName = (Split-Path $ShadowCopyPath -Leaf) + '-' + (Get-Date -Format ("yyyy.MM.dd-hh.mm.ss")) $MountPoint = Join-Path -Path $Disc -ChildPath $MountName $null = cmd /c mklink /d "$MountPoint" "$ShadowCopyPath" [pscustomobject] @{ "Disc" = $Disc "ShadowID" = $ShadowID "DeviceObject" = $DeviceObject "ShadowCopyPath" = $ShadowCopyPath "MountName" = $MountName "MountPoint" = $MountPoint } } function Remove-ShadowCopy { param ( # ID теневой копии [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string] $ShadowID, # Точка монтирования теневой копии (ntfs link) [Parameter(Mandatory = $true)] [ValidateNotNullOrEmpty()] [string] $MountPoint ) # Удаление теневой копии $null = vssadmin Delete Shadows /Shadow="$ShadowID" /Quiet # Удаление точки монтирования теневой копии # Remove-Item баг # https://github.com/powershell/powershell/issues/621 # https://stackoverflow.com/questions/51160864/delete-children-directories-in-powershell-including-symlinks (Get-Item $MountPoint).Delete() } # Создание теневой копии $Disc = Split-Path -Path $Source -Qualifier $ShadowCopy = New-ShadowCopy -Disc $Disc # Копирование из теневой копии $SourceWithoutQualifier = Split-Path -Path $Source -NoQualifier $SourcePath = Join-Path -Path $ShadowCopy.MountPoint -ChildPath $SourceWithoutQualifier Copy-Item -LiteralPath $SourcePath -Destination $Destination -Recurse -Force # Удаление теневой копии и ссылки на неё Remove-ShadowCopy -ShadowID $ShadowCopy.ShadowID -MountPoint $ShadowCopy.MountPoint |
|