| Set-PSDebug -Strict$host.UI.RawUI.WindowTitle = "Bits転送ホスト"
 Import-Module BitsTransferAdd-Type -AssemblyName System.Windows.Forms
 Add-Type -AssemblyName Microsoft.VisualBasic
 $bindingSource = [System.Windows.Forms.BindingSource]
 $bindingSource1 = New-Object $bindingSource
 $bindingSource2 = New-Object $bindingSource
 $path = Split-Path $myInvocation.MyCommand.path
 $MessageBox = [System.WIndows.Forms.MessageBox]
 $StartedEndMark,$endedEndMark = "☆","★"
 
 function Main{
 
 #Formソースの読み込み
 Write-Host "Bits転送起動中・・・"
 $source1 = "Form1.cs"
 $source2 = "Form1.Designer.cs"
 $source3 = "CommonClasses.cs"
 $source = gc (Join-Path $path $source1)
 $source += gc (Join-Path $path $source2)
 $source += gc (Join-Path $path $source3)
 Add-Type -TypeDefinition ($source | out-string) -ReferencedAssemblies System.Windows.Forms,
 System.Drawing,
 System.Data,
 System.Core
 #Form表示
 $form = New-Object Bits.Form1
 $iconPath =  Join-Path $path "prodicon.ico"
 if(Test-Path $iconPath){
 $icon = New-Object System.Drawing.Icon (Join-Path $path "prodicon.ico")
 $form.icon = $icon
 }
     #イベント登録$form.Add_Load({formLoad})                      #フォームLoad処理
 $form.Add_FormClosing({formClosing})            #フォームクローズ処理
 
 $form.btnSync.Add_Click({btnSyncClick})         #同期実行処理
 
 $form.btnSerial.Add_Click({btnSerialClick})     #直列キュー投入処理
 $form.btnSuspend.Add_Click({btnSuspendClick})   #サスペンド処理
 $form.btnResume.Add_Click({btnResumeClick})     #Resume処理
 $form.btnDelete.Add_Click({btnDeleteClick})     #削除処理
 
 $form.btnParallel.Add_Click({btnParallelClick}) #並列キュー投入処理
 $form.btnSuspend2.Add_Click({btnSuspend2Click}) #サスペンド処理
 $form.btnResume2.Add_Click({btnResume2Click})   #Resume処理
 $form.btnDelete2.Add_Click({btnDelete2Click})   #削除処理
 
 $form.foreground.Add_Click({contextGridPriorityClick("foreground")})  #コンテキストメニュー
 $form.High.Add_Click({contextGridPriorityClick("High")})  #コンテキストメニュー
 $form.Normal.Add_Click({contextGridPriorityClick("Normal")})  #コンテキストメニュー
 $form.Low.Add_Click({contextGridPriorityClick("Low")})  #コンテキストメニュー
 
 #データソース設定
 $form.DataGridView1.DataSource = $bindingSource1
 $form.DataGridView2.DataSource = $bindingSource2
 
 fncRegistTimer
 
 cls
 [Windows.Forms.Application]::Run($form)
 }
 #フォームLoad処理function formLoad{
 #投入済みで未完了のJOBを回復
 Get-BitsTransfer | %{
 $job = New-Object Bits.Job
 $_.FileList | Set file
 $job.FileName = Split-Path $file.RemoteName -Leaf
 $job.FromText = $file.RemoteName
 $job.ToText = $file.LocalName
 $job.Status = $_.JobState
 $job.JobID = $_.JobId
 $job.EndMark = $StartedEndMark
 if($_.DisplayName -eq "Serial"){
 $bindingSource1.Add($job)
 }else{
 $bindingSource2.Add($job)
 }
 }
 
 #直列キューの未投入分を回復
 $xmlpath = Join-Path $path "bindingsource1.xml"
 if(Test-Path $xmlpath){
 Import-Clixml $xmlpath | %{
 $job = New-Object Bits.Job
 $job.FileName = $_.FileName
 $job.FromText = $_.FromText
 $job.ToText = $_.ToText
 $job.Status = ""
 $job.EndMark = $StartedEndMark
 $bindingSource1.Add($job)
 }
 }
 
 #GridViewを選択解除&表示行調整
 if($bindingSource1.Count -gt 0){
 $form.DataGridView1.FirstDisplayedScrollingRowIndex = $bindingSource1.Count - 1
 $form.DataGridView1.ClearSelection()
 }
 if($bindingSource2.Count -gt 0){
 $form.DataGridView2.FirstDisplayedScrollingRowIndex = $bindingSource2.Count - 1
 $form.DataGridView2.ClearSelection()
 }
 }
 #フォームClosing処理function formClosing{
 #$_.Cancel = $true
 $message1 = @"
 キューに未終了のJOBが存在します。
 JOBはそのまま継続されますが、
 再度アプリケーションを実行するまで転送は完了しません。
 "@
 
 #直列キュー未投入分を退避
 $bindingSource1 | ?{$_.Status -eq ""} | Export-Clixml -Path (Join-Path $path "bindingsource1.xml")
 
 foreach($job in $bindingSource1){
 if($job.EndMark -eq $StartedEndMark){
 $MessageBox::Show($message1)
 return
 }
 }
 
 foreach($job in $bindingSource2){
 if($job.EndMark -eq $StartedEndMark){
 $MessageBox::Show($message1)
 return
 }
 }
 }
 #同期実行処理function btnSyncClick{
 if(fncCheckPath){
 [Microsoft.VisualBasic.Interaction]::AppActivate("Bits転送ホスト")
 Start-BitsTransfer $form.txtFrom.text $form.txtTo.text
 [Microsoft.VisualBasic.Interaction]::AppActivate("Bits転送")
 }else{
 $MessageBox::Show("転送元と転送先に正しいパスを指定してください")
 Return
 }
 }
 #直列キュー投入処理function btnSerialClick{
 if(fncCheckPath){
 $job = New-Object Bits.Job
 $job.FileName = Split-Path $form.txtFrom.text -Leaf
 $job.FromText = $form.txtFrom.text
 $job.ToText = $form.txtTo.text
 $job.Status = ""
 $job.EndMark = $StartedEndMark
 $bindingSource1.Add($job)
 $form.DataGridView1.ClearSelection()
 $form.DataGridView1.FirstDisplayedScrollingRowIndex = $bindingSource1.Count - 1
 }else{
 $MessageBox::Show("転送元と転送先に正しいパスを指定してください")
 Return
 }
 
 }
 #コンテキストメニュー処理(プライオリティ変更処理)function contextGridPriorityClick($priority){
 $arrJobIds = @()
 foreach ($row in $form.dataGridView2.SelectedRows)
 {
 if($bindingSource2[$row.Index].EndMark -eq $StartedEndmark){
 $arrJobIds += $bindingSource2[$row.Index].JobID
 }
 }
 
 if($arrJobIds.Count){
 Get-BitsTransfer -JobId $arrJobIds | Set-BitsTransfer -Priority $priority
 }
 }
 #パス中の不要文字削除&空白チェックfunction fncCheckPath{
 $form.txtFrom.text = $form.txtFrom.text -replace '"',""
 $form.txtTo.text = $form.txtTo.text -replace '"',""
 try{
 if($form.txtFrom.text.StartsWith("http")){
 $result = Test-Path $form.txtTo.text -ea Stop
 if($result){
 $form.txtTo.text = Resolve-Path $form.txtTo.text
 }
 return $result
 }else{
 $result =  (Test-Path $form.txtFrom.text -ea Stop) -and (Test-Path $form.txtTo.text -ea Stop)
 if($result){
 $form.txtFrom.text = Resolve-Path $form.txtFrom.text
 $form.txtTo.text = Resolve-Path $form.txtTo.text
 }
 return $result
 }
 }Catch{
 Write-Warning $error[0]
 return $false
 }
 }
 #サスペンド処理function btnSuspendClick{
 fncSuspend $form.DataGridView1 $bindingSource1
 }
 function btnSuspend2Click{
 fncSuspend $form.DataGridView2 $bindingSource2
 }
 function fncSuspend($grid,$bindingSource){
 $selectedRows = $grid.SelectedRows
 if($selectedRows.Count){
 $selectedRows | %{
 $job = $bindingSource[$_.index] #選択行に対応するJOBオブジェクト
 if($job.EndMark -eq $StartedEndMark -and $job.JobId){
 Get-BitsTransfer -JobId $job.JobId | Suspend-BitsTransfer
 }
 }
 }else{
 $MessageBox::Show("対象の行(JOB)を選択してください")
 }
 }
 #Resume処理function btnResumeClick{
 foreach($job in $bindingSource1){
 if(("Transferring","Connecting") -contains $job.Status){
 $MessageBox::Show("他のJOBが実行中です")
 return
 }
 }
 
 fncResume $form.DataGridView1 $bindingSource1 {break}
 
 }
 function btnResume2Click{
 fncResume $form.DataGridView2 $bindingSource2 {continue}
 }
 function fncResume($grid,$bindingSource,$script){
 $selectedRows = $grid.SelectedRows
 if($selectedRows.Count){
 foreach($selectedRow in $selectedRows){
 $job = $bindingSource[$selectedRow.index]
 if($job.Status -eq "Suspended"){
 Get-BitsTransfer -JobId $job.JobId | Resume-BitsTransfer -Asynchronous
 Invoke-Command $script #直列キューの時はResumeはひとつだけ
 }
 }
 }else{
 $MessageBox::Show("対象の行(JOB)を選択してください")
 }
 }
 #削除処理function btnDeleteClick{
 fncDelete $form.DataGridView1 $bindingSource1
 }
 function btnDelete2Click{
 fncDelete $form.DataGridView2 $bindingSource2
 }
 function fncDelete($grid,$bindingSource){
 $selectedRows = $grid.SelectedRows
 if($selectedRows.Count){
 $selectedRows | %{
 $job = $bindingSource[$_.index] #選択行に対応するJOBオブジェクト
 #TransferredはComplete-Transferで既に消えている
 if($job.EndMark -eq $StartedEndMark -and $job.JobId){
 Get-BitsTransfer -JobId $job.JobId | Remove-BitsTransfer
 }
 $bindingSource.RemoveAt($_.index)
 $grid.Refresh()
 }
 }else{
 $MessageBox::Show("対象の行(JOB)を選択してください")
 }
 }
 #並列キュー投入処理function btnParallelClick{
 if(fncCheckPath){
 $job = New-Object Bits.Job
 #JOB情報を取得しGridへ表示
 $job.FromText = $form.txtFrom.text
 $job.ToText = $form.txtTo.text
 $job.EndMark = $StartedEndMark
         #フォームからプライオリティ判定foreach($cntrl in $form.groupBox2.Controls){
 if($cntrl -is [System.Windows.Forms.RadioButton]){
 if($cntrl.Checked){
 $priority = $cntrl.Text
 break
 }
 }
 }
 
 #Tranfertype判定
 $type = fncSetTransfertype
 $job.FileName = Split-Path $form.txtFrom.text -Leaf
 
 #JOB投入
 $ret = Start-BitsTransfer $form.txtFrom.text $form.txtTo.text  `
 -Async -TransferType $type -Priority $priority
 Set-BitsTransfer -BitsJob $ret -DisplayName "Parallel"
 
 #JOBステータス更新処理
 fncSetJobInfo $job $ret
         $bindingSource2.Add($job)$form.DataGridView2.ClearSelection()
 $form.DataGridView2.FirstDisplayedScrollingRowIndex = $bindingSource2.Count -1
 }else{
 $MessageBox::Show("転送元と転送先に正しいパスを指定してください")
 Return
 }
 
 }
 #タイマー処理function fncRegistTimer{
     $form.timer1.Add_Tick({#直列キューJOBステータス更新処理
 fncUpdateJobStatus $bindingSource1
 
 #並列キューJOBステータス更新処理
 fncUpdateJobStatus $bindingSource2
 
 #直列キューJOB投入処理
 :outer foreach($job in $bindingSource1){
 switch($job.Status){
 "Transferring"{break outer}
 "Connecting" {break outer}
 "" {
 $type = fncSetTransfertype
 $ret = Start-BitsTransfer $job.FromText $job.ToText  `
 -Async -TransferType $type -Priority Foreground
 Set-BitsTransfer -BitsJob $ret -DisplayName "Serial"
 fncSetJobInfo $job $ret
 break outer
 }
 default{}
 }
 }
 
 #データグリッドリフレッシュ
 $form.DataGridView1.AutoResizeColumns()
 $form.DataGridView1.Refresh()
 $form.DataGridView2.AutoResizeColumns()
 $form.DataGridView2.Refresh()
         })
 }
 function fncSetTransfertype{if($form.txtFrom.text.StartsWith("http")){
 return "Download"
 }elseif($form.txtTo.text.StartsWith("\\")){
 return "Upload"
 }else{
 return "Download"
 }
 }
 #JOBステータス更新処理function fncUpdateJobStatus($bindingSource){
 foreach($job in $bindingSource){
 if($job.EndMark -eq $endedEndMark){continue}
 if($job.JobID){
 $ret = Get-BitsTransfer -JobId $job.JobID
 fncSetJobInfo $job $ret
 }
 }
 }
 #JOBステータス設定処理function fncSetJobInfo($job,$bitsInfo){
 $job.Status = $bitsInfo.JobState
 $job.JobID = $bitsInfo.JobId
 $job.StartTime = $bitsInfo.CreationTime
 $job.Priority = $bitsInfo.Priority
 $job.Percent = [int](($bitsInfo.BytesTransferred/$bitsInfo.BytesTotal)*100)
 if($job.Status -eq "Transferred"){
 $job.EndTime = $bitsInfo.TransferCompletionTime
 $job.EndMark = $endedEndMark
 $job.Percent = 100
 Complete-BitsTransfer -BitsJob $bitsInfo.JobId
 }
 }
 Main
 | 
0 件のコメント:
コメントを投稿