【问题标题】:How can I implement a data migration with PowerShell?如何使用 PowerShell 实现数据迁移?
【发布时间】:2019-06-14 21:32:14
【问题描述】:

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

例子:

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

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

当前任务是从文件夹“C:\test\old\Data\Werkstatt\06”中的“C:\test\old\Data\Werkstatt\06.Aufträge\%company%\”成功复制的文件夹. 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,只有客户文件夹下的文件被移动,不幸的是,也被重命名了。有人可以帮我吗?

【问题讨论】:

  • 订单文件夹内(20031_Signs内)是否还有其他文件夹?
  • 在这些和大多数其他情况下是的
  • Powershell 5 可用吗?
  • 可以使用
  • 您发布的示例代码会从$sourcepath 重新创建子文件夹(由于对象属性未在字符串内展开,因此无法正常工作)。它甚至不会尝试生成所需的新名称。请再努力一点。

标签: powershell data-migration


【解决方案1】:

您可以通过将.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 的两个级别。替换将在文件夹名称中查找_,因此请确保它们都只包含一个。

【讨论】:

  • 我已经调整了变量。我使用 Copy-Item 而不是 Move-Item。在我的测试中,并非所有文件都被复制,可能是什么情况?如果文件夹名称中有几个“_”可用,是否也有可能?问题是有几千个文件夹。一些文件夹还使用“-”作为标志。不幸的是,目前的结构并不统一。
  • 现在Order-foldername中的每个_都将被"_$($Order.parent)_"替换>多个不好:)。如果您有其他分隔符,您可以添加它们以替换($order.Name.replace("_","_$($Order.parent)_").replace("-","_$($Order.parent)_"),但这将替换所有_-。最好的解决方案是创建多个if 语句来检查订单属于哪个公司,并根据您将使用什么样的替换来选择......
  • 对于copy-item 不复制所有内容的问题,请尝试-force(可能具有管理员权限)
  • copy-item 使用参数-recurse-force
  • 是否也可以使用两个循环?一个读出客户的姓名,另一个读出客户的每个子文件夹以创建新名称并复制文件。现在只有文件夹被复制和重命名,“20”从第六个字符开始,然后是客户名称,插入一个。
【解决方案2】:

它有效:)

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

$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"
 }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 2019-10-10
    • 2023-04-01
    • 1970-01-01
    • 2020-04-21
    • 2020-05-11
    • 2023-04-03
    • 2020-08-21
    相关资源
    最近更新 更多