PowerShell 进度条调用在运行空间中失败
PowerShell progress Bar invocation fails in Runspace
我正在创建一个带有 GUI 的 PowerShell 脚本,它将用户配置文件从选定的源磁盘复制到目标磁盘。我在 XAML 中使用 VS Community 2019 创建了 GUI。
我的复制函数是从运行空间调用的并且工作正常。我想在此运行空间内放置一个进度条,以便它随着每个文件夹的复制而增加,但我不知道该怎么做。
这是我的运行空间:
function RunspaceBackupData {
$Runspace = [runspacefactory]::CreateRunspace()
$Runspace.ApartmentState = "STA"
$Runspace.ThreadOptions = "ReuseThread"
$Runspace.Open()
$Runspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
$Runspace.SessionStateProxy.SetVariable("SelectedFolders",$global:SelectedFolders)
$Runspace.SessionStateProxy.SetVariable("SelectedUser",$global:SelectedUser)
$Runspace.SessionStateProxy.SetVariable("ReturnedDiskSource",$global:ReturnedDiskSource)
$Runspace.SessionStateProxy.SetVariable("ReturnedDiskDestination",$global:ReturnedDiskDestination)
$code = {
foreach ($item in $global:SelectedFolders) {
copy-item -Path "$global:ReturnedDiskSource\Users$global:SelectedUser$item" -Destination "$global:ReturnedDiskDestination\Users$global:SelectedUser$item" -Force -Recurse
}
}
$PSinstance = [powershell]::Create().AddScript($Code)
$PSinstance.Runspace = $Runspace
$job = $PSinstance.BeginInvoke()
}
这是我的事件处理程序:
$var_btnStart.Add_Click( {
RunspaceBackupData -syncHash $syncHash -SelectedFolders $global:SelectedFolders -SelectedUser $global:SelectedUser -ReturnedDiskSource $global:ReturnedDiskSource -ReturnedDiskDestination $global:ReturnedDiskDestination
})
你能帮帮我吗?
在 $code
内部你需要保持计数,所以我建议使用 for 循环。
在循环内,您可以调用 window-object 中的调度程序:
$syncHash.Window.Dispatcher.Invoke([action]{$syncHash.Progressbar.Value = [double] <code for finished percentage>}, "Normal")
我怀疑你在 $syncHash
中有 window 和进度条
好的,我已经设法让我的进度条正常工作了。首先,您必须将它添加到哈希表变量中:
$syncHash.ProgressBar = $syncHash.Window.FindName("ProgressBar")
然后你可以像这样创建你的事件处理程序:
$var_btnStart.Add_Click( {
$Runspace = [runspacefactory]::CreateRunspace()
$Runspace.ApartmentState = "STA"
$Runspace.ThreadOptions = "ReuseThread"
$Runspace.Open()
$Runspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
$Worker =
[PowerShell]::Create().AddScript({$syncHash.ProgressBar.Dispatcher.Invoke([action]
{$SyncHash.ProgressBar.IsIndeterminate = $true }, "Normal")}
##YOUR CODE HERE
$syncHash.Error = $Error
$syncHash.ProgressBar.Dispatcher.Invoke([action]{$SyncHash.ProgressBar.IsIndeterminate = $false }, "Normal")
})
$Worker.Runspace = $Runspace
$Worker.BeginInvoke()})
请注意,在此示例中,您的进度条是不确定的,因此它会在您单击按钮时开始循环,并在代码结束时停止。
别忘了处理你的运行空间:
$Runspace.PowerShell.Close($Runspace) $Runspace.PowerShell.Dispose($Runspace)
我正在创建一个带有 GUI 的 PowerShell 脚本,它将用户配置文件从选定的源磁盘复制到目标磁盘。我在 XAML 中使用 VS Community 2019 创建了 GUI。
我的复制函数是从运行空间调用的并且工作正常。我想在此运行空间内放置一个进度条,以便它随着每个文件夹的复制而增加,但我不知道该怎么做。
这是我的运行空间:
function RunspaceBackupData {
$Runspace = [runspacefactory]::CreateRunspace()
$Runspace.ApartmentState = "STA"
$Runspace.ThreadOptions = "ReuseThread"
$Runspace.Open()
$Runspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
$Runspace.SessionStateProxy.SetVariable("SelectedFolders",$global:SelectedFolders)
$Runspace.SessionStateProxy.SetVariable("SelectedUser",$global:SelectedUser)
$Runspace.SessionStateProxy.SetVariable("ReturnedDiskSource",$global:ReturnedDiskSource)
$Runspace.SessionStateProxy.SetVariable("ReturnedDiskDestination",$global:ReturnedDiskDestination)
$code = {
foreach ($item in $global:SelectedFolders) {
copy-item -Path "$global:ReturnedDiskSource\Users$global:SelectedUser$item" -Destination "$global:ReturnedDiskDestination\Users$global:SelectedUser$item" -Force -Recurse
}
}
$PSinstance = [powershell]::Create().AddScript($Code)
$PSinstance.Runspace = $Runspace
$job = $PSinstance.BeginInvoke()
}
这是我的事件处理程序:
$var_btnStart.Add_Click( {
RunspaceBackupData -syncHash $syncHash -SelectedFolders $global:SelectedFolders -SelectedUser $global:SelectedUser -ReturnedDiskSource $global:ReturnedDiskSource -ReturnedDiskDestination $global:ReturnedDiskDestination
})
你能帮帮我吗?
在 $code
内部你需要保持计数,所以我建议使用 for 循环。
在循环内,您可以调用 window-object 中的调度程序:
$syncHash.Window.Dispatcher.Invoke([action]{$syncHash.Progressbar.Value = [double] <code for finished percentage>}, "Normal")
我怀疑你在 $syncHash
好的,我已经设法让我的进度条正常工作了。首先,您必须将它添加到哈希表变量中:
$syncHash.ProgressBar = $syncHash.Window.FindName("ProgressBar")
然后你可以像这样创建你的事件处理程序:
$var_btnStart.Add_Click( {
$Runspace = [runspacefactory]::CreateRunspace()
$Runspace.ApartmentState = "STA"
$Runspace.ThreadOptions = "ReuseThread"
$Runspace.Open()
$Runspace.SessionStateProxy.SetVariable("syncHash",$syncHash)
$Worker =
[PowerShell]::Create().AddScript({$syncHash.ProgressBar.Dispatcher.Invoke([action]
{$SyncHash.ProgressBar.IsIndeterminate = $true }, "Normal")}
##YOUR CODE HERE
$syncHash.Error = $Error
$syncHash.ProgressBar.Dispatcher.Invoke([action]{$SyncHash.ProgressBar.IsIndeterminate = $false }, "Normal")
})
$Worker.Runspace = $Runspace
$Worker.BeginInvoke()})
请注意,在此示例中,您的进度条是不确定的,因此它会在您单击按钮时开始循环,并在代码结束时停止。 别忘了处理你的运行空间:
$Runspace.PowerShell.Close($Runspace) $Runspace.PowerShell.Dispose($Runspace)