Копирование файлов из нескольких папок, где имя файла является частью папки - PullRequest
0 голосов
/ 28 февраля 2019

'Я пытаюсь скопировать несколько файлов из нескольких папок в другую папку.В папках есть часть имени файла.

Например - я хочу скопировать все файлы с именем «Телефон» или «ячейка» и серийный номер как часть имени файла.Каждая подпапка имеет серийный номер как часть имени папки.

C:\shared\112\products\112.phone blah blah.txt
C:\shared\112\products\112.my cell.txt
C:\shared\113\products\113.ugly phone.txt
C:\shared\113\products\113.the cell.txt
C:\shared\114\products\114.pretty phone.txt
C:\shared\115\products\115.phone lazy.txt
C:\shared\115\products\115.celly cell.txt

Проблема в том, что есть 20 000 серийных номеров, поэтому я хочу создать список серийных номеров и вытащить файл на основенабор серийного номера.Вот мой сценарий, но он ничего не тянет. '

$FirstSearchlist = @(“112”, “113”)
$SecondSearchlist = @("phone","cell")

$dirArray = @("c:\Shared\")
$NotFound = "Not Found"

cls
function Recurse([string]$path) {

    $fc = new-object -com scripting.filesystemobject
    $folder = $fc.getfolder($path)

    foreach ($i in $folder.files) {

        [string]$FullPath = $i.Path
        [string]$FileName = $i.Name
        foreach($first in $FirstSearchlist) {
            if ($filename.ToUpper().Contains($first.ToUpper())) {
                foreach($second in $SecondSearchlist) {
                    if ($filename.ToUpper().Contains($second.ToUpper())) {
                        Write-Host $Fullpath
                         Copy-Item $Fullpath -Destination "C:\Shared\Phones" -Recurse
                                 }
                }
            }
        }
    }

    foreach ($i in $folder.subfolders) {
        Recurse($i.path)
    }
}

function main() {

    foreach ($i in $FirstSearchlist){
        $NewFolder = $dirArray + $i
        foreach($SearchPath in $NewFolder) {
            Recurse $SearchPath
        }
    }

}

main

1 Ответ

0 голосов
/ 28 февраля 2019

Это сработало для меня при тестировании с предоставленным набором примеров (но обратите внимание, что в моем тестировании C: \ Shared пуст, может потребоваться изменить ваше дерево папок в зависимости от):

Function Get-FileMatches($Filter){
    $fileMatches = Get-ChildItem -Path "C:\Shared" -Recurse | ? {$_.Mode -notmatch 'd' -and $_.Name -match $Filter -and ($_.Name -match $SecondSearchlist[0] -or $_.Name -match $SecondSearchlist[1])}
    return $fileMatches
}

Function Run-Script() {

    $FirstSearchlist = @(“112”, “113”)
    $SecondSearchlist = @("phone","cell")
    $allMatches = @()

    $phonesFolderExists = Test-Path "C:\Shared\Phones"

    if($phonesFolderExists -eq $False)
    {
        New-Item -Path "C:\Shared\Phones" -ItemType Directory -Force
    }

    foreach($listItem in $FirstSearchList) {
        $currentMatches = Get-FileMatches -Filter $listItem
        if($currentMatches -ne $null)
        {
            foreach($item in $currentMatches)
            {
                $allMatches += $item
            }
        }
    }

    if($allMatches -ne $null)
    {
        foreach($item in $allMatches)
        {
            Copy-Item -Path $item.FullName -Destination "C:\Shared\Phones"
        }
    }
}

Run-Script
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...