如何使用 PowerShell 实施数据迁移?
How can I implement a data migration with PowerShell?
我应该在更改结构时将数据从旧服务器移动到新服务器。
示例:
- 旧:"C:\test\old\Data\Werkstatt. Aufträge\companyA0031_Signs"
- 新:"C:\test\new\Data. Aufträge\companyA0031_companyA_Signs"
在旧结构中,一家公司的订单都在一个文件夹中。
在新结构中,所有订单都将直接迁移到订单文件夹下。名称由订单号+分隔符+公司名称+姓名组成。
当前任务是从"C:\test\old\Data\Werkstatt. Aufträge\%company%\"成功复制到文件夹"C:\test\old\Data\Werkstatt. Aufträge\%company%\Z_Transfered"中的文件夹。
我试过了:
$sourcepath = "C:\test\old\Data\Werkstatt. Aufträge"
$basepath = "C:\test\new\Data. 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,仅移动了客户文件夹下的文件,不幸的是,还重命名了。有人可以帮我吗?
您可以通过将 .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
的两个级别。替换将在文件夹名称中查找 _
,因此请确保它们都只包含一个。
有效:)
非常感谢您的帮助。
该脚本现在可以正常工作了。
$sourcepath = "C:\test\old\Data\Werkstatt. Aufträge"
$basepath = "C:\test\new\Data. 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"
}
}
我应该在更改结构时将数据从旧服务器移动到新服务器。
示例:
- 旧:"C:\test\old\Data\Werkstatt. Aufträge\companyA0031_Signs"
- 新:"C:\test\new\Data. Aufträge\companyA0031_companyA_Signs"
在旧结构中,一家公司的订单都在一个文件夹中。 在新结构中,所有订单都将直接迁移到订单文件夹下。名称由订单号+分隔符+公司名称+姓名组成。
当前任务是从"C:\test\old\Data\Werkstatt. Aufträge\%company%\"成功复制到文件夹"C:\test\old\Data\Werkstatt. Aufträge\%company%\Z_Transfered"中的文件夹。
我试过了:
$sourcepath = "C:\test\old\Data\Werkstatt. Aufträge"
$basepath = "C:\test\new\Data. 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,仅移动了客户文件夹下的文件,不幸的是,还重命名了。有人可以帮我吗?
您可以通过将 .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
的两个级别。替换将在文件夹名称中查找 _
,因此请确保它们都只包含一个。
有效:)
非常感谢您的帮助。 该脚本现在可以正常工作了。
$sourcepath = "C:\test\old\Data\Werkstatt. Aufträge"
$basepath = "C:\test\new\Data. 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"
}
}