如何使用PowerShell实施数据迁移?

时间:2019-06-11 09:35:23

标签: powershell data-migration

我应该在更改结构时将数据从旧服务器移动到新服务器。

示例:

  • 旧版:“ C:\ test \ old \ Data \ Werkstatt \06。Aufträge\ companyA \ 200031_Signs”
  • 新:“ C:\ test \ new \ Data \ 06。Aufträge\ companyA \ 200031_companyA_Signs”

在旧结构中,公司的订单位于单个文件夹中。 在新结构中,所有订单都将直接迁移到orders文件夹下。名称由订单号+分隔符+公司名称+名称组成。

当前任务是从“ C:\ test \ old \ Data \ Werkstatt \ 06。Aufträge\%company%\”成功复制的文件夹“ C:\ test \ old \ Data \ Werkstatt \ 06”中的文件夹。Aufträge\%company%\ Z_Transfered”进行移动。

我尝试过:

$sourcepath = "C:\test\old\Data\Werkstatt\06. Aufträge"
$basepath = "C:\test\new\Data\06. Aufträge"


$Orders = Get-ChildItem -Path $sourcepath -Directory -Recurse -Depth 1
ForEach ($Order in $Orders ) {
if  ($Order.name.StartsWith("20")){
    $NewFolderName = "{0}\{1}" -f ($BasePath),($order.Name.insert(6,"_" + $order.parent.Name))
    $NewFolder = New-Item -Path $NewFolderName -ItemType "directory"
    Copy-Item -Path "$($Order.FullName)\*" -Destination $NewFolder -Recurse -Force

#under construction
    $MoveFolderName = Join-Path -path $sourcepath -ChildPath $order.parent | Join-Path -ChildPath "Z_Transfered"
    if (-not (Test-Path $MoveFolderName))
     {
     New-Item -Path  $MoveFolderName -ItemType "directory"
     }
    $MoveFolder = $MoveFolderName +"\" + $order.name
    Move-Item -Path "$($Order.FullName)\*" -Destination $MoveFolder
    $error > $sourcepath"\error.log"
}

}

我修改了昨天得到的代码。目前,代码中还有一个错误。

现在可以将内容复制到正确的位置。 目前,他在客户文件夹下创建文件夹Z_Transfered。问题似乎出在Move-Item上。 当前,该文件夹未移动到Z_Transfered,仅移动了customer文件夹下的文件,而且不幸的是,该文件也已重命名。有人可以帮我吗?

2 个答案:

答案 0 :(得分:0)

可以通过将.parent放在路径对象> $path.parent中来获得文件夹的父文件夹。您甚至可以通过这种方式获取祖父母> $path.parent.parent。 因此,剩下的就是一些字符串操作来获取新的文件夹名称:

$sourcepath = "d:\test\Data\Orders"    # Adjust this
$BasePath = "d:\test\Data\Orders"    # Adjust this

$Orders = Get-ChildItem -Path $sourcepath -Directory -Recurse -Depth 2
ForEach ($Order in $Orders ) {

    if ( $Order.parent.parent.Name -eq "Orders" ){
        $NewFolderName = "{0}\{1}" -f ($BasePath),($order.Name.replace("_","_$($Order.parent)_"))
        $NewFolder = New-Item -Path $NewFolderName -ItemType "directory"
        Move-Item -Path "$($Order.FullName)\*" -Destination $NewFolder -WhatIf
    }
} 

在Powershell 5中,Get-ChildItem获得了-Depth参数,因此您可以将其限制为仅搜索$sourcepath以下两个级别。替换将在文件夹名称中寻找_,因此请确保thery全部只包含一个。

答案 1 :(得分:0)

有效:)

非常感谢您的帮助。 该脚本现在可以根据需要运行。

$sourcepath = "C:\test\old\Data\Werkstatt\06. Aufträge"
$basepath = "C:\test\new\Data\06. Aufträge"


$Orders = Get-ChildItem -Path $sourcepath -Directory -Recurse -Depth 1
ForEach ($Order in $Orders ) {
if  ($Order.name.StartsWith("20")){
    $NewFolderName = "{0}\{1}" -f ($BasePath),($order.Name.insert(6,"_" + $order.parent.Name))
    $NewFolder = New-Item -Path $NewFolderName -ItemType "directory"
    Copy-Item -Path "$($Order.FullName)\*" -Destination $NewFolder -Recurse -Force
    $MoveFolderName = Join-Path -path $sourcepath -ChildPath $order.parent | Join-Path -ChildPath "Z_Transfered"
     if (-not (Test-Path $MoveFolderName))
       {
        $MoveFolder = New-Item -Path  $MoveFolderName -ItemType "directory"
       }
    Move-Item -path "$($Order.FullName)\" -Destination $MoveFolderName -force
    $error > $sourcepath"\error.log"
 }
}