Переместить файлы, соответствующие указанной c дате, из массива серверов / папок в локальную папку (Powershell) - PullRequest
0 голосов
/ 17 января 2020

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

[string[]]$ProdServerArray = "prdserver1", "prdserver2", "prdserver3"
[string[]]$InterfaceArray = "interfacefolder1", "interfacefolder2", "interfacefolder3", "interfacefolder4", "interfacefolder5"

New-Item -ItemType "directory" -Path "C:\GetFilesResults\$($date.toshortdatestring().replace("/","-"))\$search" -Force
$LocalPath = "C:\GetFilesResults\$($date.toshortdatestring().replace("/","-"))\$search"

do
{
    $date = Read-host "Enter date (MM/DD/YYYY): "
}
while ($date -as [datetime] -isnot [datetime])
$date = $date -as [datetime]
$date

$search = foreach ($ProdServer in $ProdServerArray)
{
    foreach ($Interface in $InterfaceArray)
    {
        '\\{0}\InterfaceFiles\{1}\' -f $ProdServer, $Interface
        Get-ChildItem $search -File -Recurse | Where {$_.LastWriteTime -gt $date.date} | ForEach {
        $actualSource = Split-Path $_.FullName
        $actualDest = Split-Path $_.FullName.Replace($search,$LocalPath)
        robocopy $actualSource $actualDest $_.Name /SEC }
    }
}

Мне удалось получить структуру папок, которая мне нужна - "\ prdserver1 \ InterfaceFiles \ interfacefolder1 \", но я не смог получить дату создания / изменения файлов внутри этих папок и скопировать их их на мою локальную машину. Я пытался Copy-Item, robocopy, batch и т. Д. c., Но не нашел способа запустить al oop через все это, и в лучшем случае он, похоже, разорвется, если столкнется с файлом или папка, которая не соответствует критериям ... в худшем случае ничего не делает.

1 Ответ

0 голосов
/ 17 января 2020

Хотя я не смог полностью проверить это, для каждого l oop, казалось, сделал это для меня. Параметр -Recurse для Copy-Item , кажется, является решением, наряду с некоторыми другими изменениями в логике c и синтаксисе. Дайте мне знать, если это решит вашу проблему.

[string[]]$ProdServerArray = "prdserver1", "prdserver2", "prdserver3"
[string[]]$InterfaceArray = "interfacefolder1", "interfacefolder2", "interfacefolder3", "interfacefolder4", "interfacefolder5"


$LocalPath = New-Item -ItemType "directory" -Path "C:\GetFilesResults\$($date.toshortdatestring().replace("/","-"))\$search" -Force | select -Property FullName

do
{
    $date = Read-host "Enter date (MM/DD/YYYY): "
}
while ($date -as [datetime] -isnot [datetime])
[datetime] $date = $date -as [datetime]
Write-Output $date


foreach ($ProdServer in $ProdServerArray)
{
    foreach ($Interface in $InterfaceArray)
    {
        $search = '\\{0}\InterfaceFiles\{1}\' -f $ProdServer, $Interface

          Get-ChildItem $search -File -Recurse | Where {$_.LastWriteTime -gt $date.date} |
          ForEach {
                $actualSource = Split-Path $_.FullName
                $actualDest = Split-Path $_.Replace($search,$LocalPath)
                Copy-Item -Path $actualSource -Destination $actualDest -Recurse

    }
}

...