Powershell使用日志记录创建/检查文件夹副本数据

时间:2014-05-26 22:40:08

标签: powershell

大家好,我在下面有这个代码,此刻它有点混乱。 基本上,我需要一个函数来获取Source的名称并将其复制到Destination,它将从Source获取文件夹的名称,如果它不存在则在Destination上创建它,然后将所有文件和文件夹复制到其中。另外还有登录每一步。下面的工作,但当我再次运行它来测试它是否存在它再次复制它在文件夹下,所以重复它。如何让它覆盖?还需要简化代码,我认为它对于一个简单的任务来说有点多了。

编辑 - 我更改了MoveData函数,只是尝试让每个文件的进度条位工作。

提前致谢。

#Copy Users Data to Storage
Function MoveData ($Src, $Dest) {

$counter = 1
get-childItem $FolderSource -filter *.* | foreach-object {
# here you can put your pre-copy tests...

$status = "Copy files {0} on {1}" -f $counter,$foldersource.Count
Write-Progress -Activity "Copy data" $status -PercentComplete ($counter)

copy-item $_.FullName -destination $NewFolder -errorAction SilentlyContinue -errorVariable errors -force -Recurse
foreach($error in $errors)
{
if ($error.Exception -ne $null)
{
write-host -foregroundColor Red "Exception: $($error.Exception)"
}
write-host -foregroundColor Red "Error: An error occured during copy operation."
}
}
$counter++
}#End Function

1 个答案:

答案 0 :(得分:0)

因此,我没有很好的方法来捕获此脚本中的错误,但您可能会使用Try {} / Catch {}来获取错误。这样做的是复制文件,并显示带有文件计数的进度条。它还会相互检查源文件夹和目标文件夹。如果源中的最后一个文件夹和dest中的最后一个文件夹相同,则检查dest是否存在,如果不存在则创建它。如果它们不同,则检查源中的最后一个文件夹是否存在于目标中,如果不存在则创建它并将目标设置为该目标。它还包括一个开关-Exact,以防你希望它完全按照给定的方式复制到目标文件夹,并且它有一个-Force选项,如果它们已经存在,它会覆盖文件。

Function Copy-Files{
Param(
    [Parameter(Position=0)]$Source = $(Throw "You must specify the source path."),
    [Parameter(Position=1)]$Dest = $(Throw "You must specify the destination path."),
    [switch]$Exact = $False,
    [switch]$Force = $False
)
    Begin{
        $Source = Resolve-Path $Source
        Switch($Source){
            {!$Exact -and !((Split-Path $Source -Leaf) -ieq (Split-Path $dest -Leaf)) -and !(Test-Path "$dest\$(Split-Path $Source -Leaf)")}{New-Item (Join-Path $dest (Split-Path $Source -Leaf)) -ItemType Directory|Out-Null;$dest = Join-Path $dest (Split-Path $Source -Leaf)}
            {$Exact -and !(Test-Path $Dest)}{New-Item -path $dest -ItemType Directory}
            {!$Exact -and !((Split-Path $Source -Leaf) -ieq (Split-Path $dest -Leaf)) -and (Test-Path "$dest\$(Split-Path $Source -Leaf)")}{$dest = Join-Path $dest (Split-Path $Source -Leaf)}
        }
        $Files = GCI $Source -Recurse
        $i = 0
    }
    Process{
        ForEach($File in $Files){
            $i++
            If($File.PSIsContainer -and !(Test-Path ($File.fullname -replace [RegEx]::Escape($Source),"$Dest"))){New-Item ($File.FullName -replace [RegEx]::Escape($Source),"$Dest") -ItemType Directory|Out-Null}ElseIf(!$File.PSIsContainer){
                Write-Progress -Activity ("Copying Files ({0} of {1})" -f $i, $files.Count) -PercentComplete (($i/$files.count)*100)
                If($Force){
                    Copy-Item -path $File.fullname -Destination ($File.fullname -replace [RegEx]::Escape($Source),"$Dest") -ErrorAction SilentlyContinue -force
                }else{
                    Copy-Item -path $File.fullname -Destination ($File.fullname -replace [RegEx]::Escape($Source),"$Dest") -ErrorAction SilentlyContinue
                }
            }
        }
    }
}

我认为在你的情况下,你会做Copy-Files "c:\users\someguy\documents" "z:\userbackups" -force或类似的事情。

编辑:好的,现在修复了重复的子文件夹问题。它正在复制项目,但由于文件夹的FileInfo对象的FullName属性实际上包含文件夹复制时文件夹本身的名称,因此在目标中导致了自身的重复(尽管是空的)副本。更新的函数检查正在复制的项目是否是文件夹,如果是,则检查目标中是否存在该文件夹,如果不存在则创建该文件夹。如果确实存在,它会悄然继续前进。实际复制的唯一内容是文件,文件夹在目的地中确实存在,并根据需要创建,而不是复制它们。