Как скопировать папку в другую папку, найдя подходящую строку, содержащуюся в имени каждой папки, с помощью Powershell - PullRequest
0 голосов
/ 18 октября 2018

Я новичок в этом, так что, надеюсь, я понимаю это правильно.За последние пару дней я провел довольно много исследований, которые я боролся с этим кодом, и я просто не могу заставить его делать то, что я хочу.

У меня есть исходный каталог, содержащий несколько каталогов.У меня есть каталог назначения, содержащий несколько каталогов.Все имена каталогов имеют четырехзначное число внутри них, но не в одном и том же месте имени.Я хочу найти этот номер в имени каждого из исходных каталогов и использовать этот номер, чтобы найти каталоги в целевом каталоге с такими же номерами в их имени.Как только я найду соответствующий каталог назначения, переместите исходный каталог, скажем, имя папки 33-fit-1234, в каталог назначения с соответствующим номером, т.е.33-F-1234.В настоящее время я делаю движение, копируя, а затем удаляю источник.

Имена исходных папок могут быть 33-ait-1743A или 33-xx-4533 UNKNOWN и т. Д.
Все имена целевых папок имеют формат: 33-x - ####, с некоторымис суффиксом из одной буквы, таким как A, B и т. д.

Вот код:

$sourceDirectory = "D:\Test Source"
$destinationDirectory = "D:\Test Dest"

$sourceFolders = Get-ChildItem -Path $sourceDirectory -Directory | Select-Object -ExpandProperty Name
$destinationFolders = Get-ChildItem -Path $destinationDirectory -Directory | Select-Object -ExpandProperty Name
$matchesInBoth = $sourceFolders -match "\d{4}" | ?{$_ -eq $_}
$matchesInBoth | ForEach-Object{
    $sourcePath = (Join-Path $sourceDirectory $_)
    Copy-Item -Path $sourcePath -Destination 
$destinationDirectory\$matchesInBoth\$_ -Recurse -whatif
    Remove-Item $sourcePath -Force -Recurse -WhatIf 
}

Это близко, вывод, который я получаю:

What if: Performing the operation "Copy Directory" on target "Item: D:\Test 
Source\33-FV-1414 Destination: D:\Test Dest\33-FIT-1414 33-FIT-1576 33-FIT- 
1654A 33-fred-1234 unknown 33-FSL-1649 33-FV-1414 33-FV-1654 33-FV-1882 
33-H-1657 33-H-1814 33-H-1924\33-FV-1414".
What if: Performing the operation "Remove Directory" on target "D:\Test 
Source\33-FV-1414".

Проблема в том, что я в итоге копирую исходную папку в новую папку, названную в честь всех имен папок в моем исходном каталоге.

Я также пробовал этот код безрезультатно:

$sourceDirectory = "D:\Test Source"
$destinationDirectory = "D:\Test Dest"

$sourceFolders = Get-ChildItem -Path $sourceDirectory -Directory | Select-    Object -ExpandProperty BaseName | Select-String "\d{4}"
$destinationFolders = Get-ChildItem -Path $destinationDirectory -Directory | Select-Object -ExpandProperty BaseName

$matchesInBoth = $destinationFolders | ?{$_ -contains $sourceFolders}
$matchesInBoth | ForEach-Object{
$sourcePath = (Join-Path $sourceDirectory $_)
Copy-Item -Path $sourcePath -Destination $destinationDirectory\$matchesInBoth\$_ -Recurse -whatif
Remove-Item $sourcePath -Force -Recurse -WhatIf 
}

Имена исходных папок:

"D:\Test Source\33-FIT-1414"
"D:\Test Source\33-FIT-1576"
"D:\Test Source\33-FIT-1654A"
"D:\Test Source\33-fred-1234 unknown"
"D:\Test Source\33-FSL-1649"
"D:\Test Source\33-FV-1414"
"D:\Test Source\33-FV-1654"
"D:\Test Source\33-FV-1882"
"D:\Test Source\33-H-1657"
"D:\Test Source\33-H-1814"
"D:\Test Source\33-H-1924"
"D:\Test Source\asjhdsdlljhsdflj"

Имена папок назначения:

"D:\Test Dest\33"
"D:\Test Dest\33-F-1108"
"D:\Test Dest\33-F-1111"
"D:\Test Dest\33-F-1120"
"D:\Test Dest\33-F-1125"
"D:\Test Dest\33-F-1130"
"D:\Test Dest\33-F-1135"
"D:\Test Dest\33-F-1209"
"D:\Test Dest\33-F-1223"
"D:\Test Dest\33-F-1252"
"D:\Test Dest\33-F-1254"
"D:\Test Dest\33-F-1307"
"D:\Test Dest\33-F-1309"
"D:\Test Dest\33-F-1317"
"D:\Test Dest\33-F-1351"
"D:\Test Dest\33-F-1414"
"D:\Test Dest\33-F-1426"
"D:\Test Dest\33-F-1428"
"D:\Test Dest\33-F-1432"
"D:\Test Dest\33-F-1433"
"D:\Test Dest\33-F-1434"
"D:\Test Dest\33-F-1435"
"D:\Test Dest\33-F-1451"
"D:\Test Dest\33-F-1476"
"D:\Test Dest\33-F-1526"
"D:\Test Dest\33-F-1528"
"D:\Test Dest\33-F-1532"
"D:\Test Dest\33-F-1533"
"D:\Test Dest\33-F-1554"
"D:\Test Dest\33-F-1565"
"D:\Test Dest\33-F-1576"
"D:\Test Dest\33-F-1623"
"D:\Test Dest\33-F-1626"
"D:\Test Dest\33-F-1649"
"D:\Test Dest\33-F-1654"
"D:\Test Dest\33-F-1659"
"D:\Test Dest\33-F-1671"
"D:\Test Dest\33-F-1709"
"D:\Test Dest\33-F-1712"
"D:\Test Dest\33-F-1799"
"D:\Test Dest\33-F-1800"
"D:\Test Dest\33-F-1801"
"D:\Test Dest\33-F-1882"
"D:\Test Dest\33-F-1883"
"D:\Test Dest\33-F-2000"
"D:\Test Dest\33-F-2001"
"D:\Test Dest\33-F-2002"
"D:\Test Dest\33-ggg-1234"
"D:\Test Dest\1234"
"D:\Test Dest\daddybear"

Мысли?

1 Ответ

0 голосов
/ 18 октября 2018

Ваш вопрос довольно двусмысленный,

  • в заголовке, который вы хотите скопировать,
  • в тексте написано move
  • код копирует и удаляет источник вместо использованияMove-Item

## Q:\Test\2018\10\18\SO_52866947.ps1
$SrcDir = "A:\Test\Source"
$DstDir = "A:\Test\Dest"

# Build hash table from Destination with 4digit key and Directory FullName as value
$DstHash = @{}
Get-ChildItem $DstDir -Directory | Where-Object Name -match '\d{4}'| ForEach-Object {
    $DstHash.$($Matches.Values)=$_.FullName
}

# Iterate source and check if destination key/value pair exists
Get-ChildItem $SrcDir -Directory | Where-Object Name -match '\d{4}'| ForEach-Object {
    if ($DstHash.ContainsKey($($Matches.Values))){
        "Move {0} to {1}" -f $_.FullName, $DstHash.$($Matches.Values)
        Move-Item $_.FullName -Destination $DstHash.$($Matches.Values) -Force
    } else {
        "no corresponding Destination found for: {0}" -f $_.FullName
    }
}

Пример вывода:
(с папками на моем ramdrive A:)

> Q:\Test\2018\10\18\SO_52866947.ps1
Move A:\Test\Source\33-FIT-1414 to A:\Test\Dest\33-F-1414
Move A:\Test\Source\33-FIT-1576 to A:\Test\Dest\33-F-1576
Move A:\Test\Source\33-FIT-1654A to A:\Test\Dest\33-F-1654
Move A:\Test\Source\33-fred-1234 unknown to A:\Test\Dest\33-ggg-1234
Move A:\Test\Source\33-FSL-1649 to A:\Test\Dest\33-F-1649
Move A:\Test\Source\33-FV-1414 to A:\Test\Dest\33-F-1414
Move A:\Test\Source\33-FV-1654 to A:\Test\Dest\33-F-1654
Move A:\Test\Source\33-FV-1882 to A:\Test\Dest\33-F-1882
no corresponding Destination found for: A:\Test\Source\33-H-1657
no corresponding Destination found for: A:\Test\Source\33-H-1814
no corresponding Destination found for: A:\Test\Source\33-H-1924
...