RoboCopy ForEach Loop с тегами? - PullRequest
       11

RoboCopy ForEach Loop с тегами?

0 голосов
/ 25 сентября 2019

У нас есть PowerShell GUI для резервного копирования файлов.Этот графический интерфейс содержит несколько флажков, каждый из которых представляет путь к файлу, и они могут быть отмечены или сняты по требованию.У нас есть функция с циклом ForEach, которая вызывается при нажатии кнопки резервного копирования, а затем пути источника и назначения определяются со свойством Tag в каждом флажке, а тег в функции «Split», поэтому Powershell знает, чтоиспользовать в качестве источника и что использовать в качестве пункта назначения.

Это прекрасно работает.Проблема в том, что для одного из флажков у нас есть несколько путей, которые мы хотим сохранить, а не только один источник, определенный в теге.Например, мы хотим, чтобы как C: \ Src \ Folder3, так и D: \ Src2 \ Folder3 "создавались резервные копии, когда установлен флажок" Folder3 ". Как бы мы это сделали? - Можно ли добавить дополнительные теги к флажку? Иесли это так, какие изменения необходимо внести в цикл ForEach в отношении Split?

БЛАГОДАРЮ ЗА ПРЕДОСТАВЛЕНИЕ ДЛЯ ЛЮБОЙ ПОМОЩИ!

Полный код здесь:


#ENABLE VISUALSTYLES#
[System.Windows.Forms.Application]::EnableVisualStyles()

#------------------------------------------------------------------------------FORM START------------------------------------------------------------------------------#

$form = New-Object System.Windows.Forms.Form
$form.Size = New-Object System.Drawing.Size(1450,842)
$form.FormBorderStyle = "FixedDialog"
$form.StartPosition = "CenterScreen"
$form.Topmost = $False
$form.add_Load($FormEvent_Load)

$outputBox = New-Object System.Windows.Forms.TextBox 
$outputBox.Location = New-Object System.Drawing.Size(200,110)
$outputBox.Size = New-Object System.Drawing.Size(1220,643)
$outputBox.MultiLine = $True 
$outputBox.ScrollBars = "Both"
$outputBox.BackColor = "White"
$outputBox.ForeColor = "Black"
$outputBox.WordWrap = $False
$outputBox.ReadOnly = $True
$outputBox.Font = New-Object System.Drawing.Font("Consolas",10)
$Form.Controls.Add($outputBox)      

#------------------------------------------------------------------------------FORM END------------------------------------------------------------------------------#

#------------------------------------------------------------------------------BUTTONS START------------------------------------------------------------------------------#

$CopyButton = New-Object System.Windows.Forms.Button
$CopyButton.Location = New-Object System.Drawing.Size(10,200)
$CopyButton.Size = New-Object System.Drawing.Size(180,35)
$CopyButton.Text = "Backup selected files"
$CopyButton.Add_Click({FILE_BACKUP})
$form.Controls.Add($CopyButton)

$CloseButton = New-Object System.Windows.Forms.Button
$CloseButton.Location = New-Object System.Drawing.Size(10,250)
$CloseButton.Size = New-Object System.Drawing.Size(180,35)
$CloseButton.Text = "Close"
$CloseButton.Add_Click({$form.Close()})
$form.Controls.Add($CloseButton)


#------------------------------------------------------------------------------BUTTONS END------------------------------------------------------------------------------#

#------------------------------------------------------------------------------CHECKBOXES START------------------------------------------------------------------------------#

$CheckBoxFolder1 = New-Object System.Windows.Forms.checkbox
$CheckBoxFolder1.Location = New-Object System.Drawing.Size(10,15)
$CheckBoxFolder1.Size = New-Object System.Drawing.Size(90,20)
$CheckBoxFolder1.Checked=$True
$CheckBoxFolder1.Text = "Path 1"
$CheckBoxFolder1.Tag = "C:\src\Folder1>C:\dest\Folder1"
$form.Controls.Add($CheckBoxFolder1)

$CheckBoxFolder2 = New-Object System.Windows.Forms.checkbox
$CheckBoxFolder2.Location = New-Object System.Drawing.Size(10,35)
$CheckBoxFolder2.Size = New-Object System.Drawing.Size(94,20)
$CheckBoxFolder2.Checked=$True
$CheckBoxFolder2.Text = "Path 2"
$CheckBoxFolder2.Tag = "C:\src\Folder2>C:\dest\Folder2"
$form.Controls.Add($CheckBoxFolder2)

$CheckBoxFolder3 = New-Object System.Windows.Forms.checkbox
$CheckBoxFolder3.Location = New-Object System.Drawing.Size(10,55)
$CheckBoxFolder3.Size = New-Object System.Drawing.Size(115,20)
$CheckBoxFolder3.Checked=$True
$CheckBoxFolder3.Text = "Path 3"
$CheckBoxFolder3.Tag = "C:\src\Folder3>C:\dest\Folder3"
$form.Controls.Add($CheckBoxFolder3)

#------------------------------------------------------------------------------CHECKBOXES END------------------------------------------------------------------------------#

#------------------------------------------------------------------------------FUNCTIONS START------------------------------------------------------------------------------#

function FILE_BACKUP {
$CheckBoxes = @($CheckBoxFolder1, $CheckBoxFolder2, $CheckBoxFolder3)

    foreach ($CheckBox in $CheckBoxes)
    {
    $FilePath=$($CheckBox.Tag.Split(">"))
     if ($CheckBox.Checked) 
        {
            robocopy $FilePath[0] $FilePath[1] /njh /njs /ndl /np /tee | ForEach-Object { $outputBox.AppendText($_ + "`r`n") }
        } 
        else 
        {
            $outputBox.AppendText("$($checkbox.Text) NOT SELECTED" + "`r`n")
        }
    }
}

#------------------------------------------------------------------------------FUNCTIONS END------------------------------------------------------------------------------#

$form.ShowDialog()```

1 Ответ

0 голосов
/ 25 сентября 2019

Вы можете просто сделать .Tag массив, используя оператор запятой (,).

$checkboxfolder2.Tag = "C:\src\Folder2>C:\dest\Folder2","C:\src\Folder3>C:\dest\Folder3"

Затем, позже в своем вызове функции, вы можете передать каждый тег в Foreach-Object и обработатьсоответственно.

function FILE_BACKUP {
$CheckBoxes = $CheckBoxFolder1,$CheckBoxFolder2,$CheckBoxFolder3

    foreach ($CheckBox in $CheckBoxes)
    {
        $CheckBox.Tag | Foreach-Object {
            $FilePath = $_.Split(">")
            if ($CheckBox.Checked) 
            {
                robocopy $FilePath[0] $FilePath[1] /njh /njs /ndl /np /tee |
                    ForEach-Object { $outputBox.AppendText($_ + "`r`n") }
            } 
            else 
            {
                $outputBox.AppendText("$($checkbox.Text) NOT SELECTED" + "`r`n")
            }
        }
    }
}
...