Как реализовать миграцию данных с помощью PowerShell? - PullRequest
0 голосов
/ 11 июня 2019

Я должен перенести данные со старого сервера на новый при изменении структуры.

Пример:

  • old: "C: \ test \ old \ Data \ Werkstatt \ 06. Aufträge \ companyA \ 200031_Signs"
  • new: "C: \ test \ new \ Data \ 06. Aufträge \ companyA \ 200031_companyA_Signs"

В старой структуре заказы компании находятся в одной папке. В новой структуре все заказы должны быть перенесены непосредственно в папку заказов. Название состоит из номера заказа + разделитель + название компании + название.

текущая задача - это папки, которые были успешно скопированы из "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, только файлы из папки клиента перемещаются и, к сожалению, также переименовываются. Может кто-нибудь помочь мне здесь, пожалуйста?

Ответы [ 2 ]

0 голосов
/ 13 июня 2019

это работает:)

большое спасибо за вашу помощь.Скрипт теперь работает так, как мне нужно.

$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"
 }
}
0 голосов
/ 11 июня 2019

Вы можете получить родительскую папку папки, указав .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. Замена будет искать _ в следующем имени, поэтому убедитесь, что все они содержат только один.

...