逐个复制文件但保留文件夹结构

时间:2017-03-28 01:58:52

标签: powershell

我对Powershell相当新,我目前正在制作备份工具。

我遇到的问题是创建一个脚本来逐个复制文件,但保留任何文件夹结构(完全用户证明)。

我一个接一个地这样做的原因是,我可以检查它是否成功/失败,并将其输出到对象以从结果中创建HTML报告。

这个想法是这样的:

<html>
<style>
body {
    background-color: linen;
}

h1 {
    color: maroon;
    margin-left: 40px;
} 
</style>
<p>test text</p>
<html>

此外,我还想了解如何从输出对象中创建HTML表格的示例。虽然我有一个想法,但相当令人困惑。

function initCopy () {
    $global:objects = @()
    $contents = Get-ChildItem -recurse -path $f_from_path
    foreach ($item in $contents) {
        $str = "$item   "
        try {
            Copy-Item -Path $item.FullName -Destination $f_to_path -Force -ErrorVariable err_Copy -ErrorAction Stop
            $global:objects += New-Object -TypeName PSObject -Property @{
                Name = $item.Name
                OldPath = $item.FullName
                Result = "Success"
        } 
        $str += "Success"
        }
        catch {
            $str += "Failure : $err_Copy"
            $global:objects += New-Object -TypeName PSObject -Property @{
                Name = $item.Name
                OldPath = $item.FullName
                Result = "Failure"
            } 
        $str += "Failure"
        }
        echo $str >> $output_path
    }
    $global:object = New-Object -TypeName PSObject -Property $props
    return $true
}

1 个答案:

答案 0 :(得分:0)

要在PowerShell中一一复制文件和子文件夹,您需要更改每个文件副本的目标路径。而且您需要以不同于文件的方式处理子文件夹:

$f_from_path = "C:\Users\Michael\Documents"
$f_to_path = "C:\Users\Michael\Desktop\Test"

$contents = Get-ChildItem -Recurse -Path $f_from_path
foreach ($item in $contents) {
    $newPath = $item.FullName
    $newPath = $newPath.Replace($f_from_path, $f_to_path)
    if ($item.PSIsContainer) {
        #Write-Host ("Directory " +  $item.FullName)
        try {
            New-Item -ItemType "directory" -Path $newPath -Force -ErrorVariable err_Copy -ErrorAction Stop | Out-Null
        }
        catch {}
    }
    else {
        #Write-Host ("File      " +  $item.FullName)
        try {
            Copy-Item -Path $item.FullName -Destination $newPath -Force -ErrorVariable err_Copy -ErrorAction Stop
        }
        catch {}
    }
}

未显示错误处理。

对于HTML输出,我还没有尝试过HTML的PowerShell cmdlet,但是您始终可以将HTML标记和值输出到纯文本输出文件,即使用Add-Content逐行编写HTML 。添加内容可能比使用.NET中的StreamWriter类要慢。