带标签的 RoboCopy ForEach 循环?
RoboCopy ForEach Loop with Tags?
我们有一个 PowerShell GUI,用于备份文件。此 GUI 包含多个复选框,每个复选框代表一个文件路径,可以根据需要选中或取消选中它们。
我们有一个带有 ForEach 循环的函数,当单击备份按钮时调用该循环,然后在每个复选框上使用标记 属性 定义源路径和目标路径,并且标记是 "Split"函数,因此 Powershell 知道将什么用作源,将什么用作目标。
这非常有效。
问题是,对于其中一个复选框,我们有多个要备份的路径,而不仅仅是标签中定义的一个源。例如,我们希望在选中 "Folder3" 复选框时同时备份 C:\Src\Folder3 和 D:\Src2\Folder3"。
我们该怎么做?
-是否可以向复选框添加更多标签?如果是这样,对于 Split,必须在 ForEach 循环中进行哪些更改?
提前感谢您提供的任何帮助!
完整代码在这里:
#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()```
您可以使用逗号运算符 (,
) 将 .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")
}
}
}
}
我们有一个 PowerShell GUI,用于备份文件。此 GUI 包含多个复选框,每个复选框代表一个文件路径,可以根据需要选中或取消选中它们。 我们有一个带有 ForEach 循环的函数,当单击备份按钮时调用该循环,然后在每个复选框上使用标记 属性 定义源路径和目标路径,并且标记是 "Split"函数,因此 Powershell 知道将什么用作源,将什么用作目标。
这非常有效。 问题是,对于其中一个复选框,我们有多个要备份的路径,而不仅仅是标签中定义的一个源。例如,我们希望在选中 "Folder3" 复选框时同时备份 C:\Src\Folder3 和 D:\Src2\Folder3"。 我们该怎么做? -是否可以向复选框添加更多标签?如果是这样,对于 Split,必须在 ForEach 循环中进行哪些更改?
提前感谢您提供的任何帮助!
完整代码在这里:
#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()```
您可以使用逗号运算符 (,
) 将 .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")
}
}
}
}