2016-08-16 2 views
0

Мне нужно показать прогресс, пакет запущенных командных файлов в определенной последовательности, используя скрипт powershell. Допустим, есть 10 пакетных файлов: 1.bat, 2.bat и т. Д. До 10.bat. Прогресс бара должен увеличиваться при выполнении 1.bat, тогда он должен увеличиваться при выполнении 2.bat, а индикатор выполнения должен достигать 100% при выполнении 10.bat. Так что мне удалось создать индикатор выполнения, используя Powershell. Как связать прогресс этих пакетных файлов с этим индикатором выполнения? любые указатели в этом направлении будут полезны. Спасибо заранее.показать ход выполнения сценариев с помощью powershell

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") 
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") 

# Init Form 
$Form = New-Object System.Windows.Forms.Form 
$Form.width = 1000 
$Form.height = 200 
$Form.Text = "**OSP Installation in Progress**" 

# Init ProgressBar 
$pbrTest = New-Object System.Windows.Forms.ProgressBar 
$pbrTest.Maximum = 100 
$pbrTest.Minimum = 0 
$pbrTest.Location = new-object System.Drawing.Size(10,70) 
$pbrTest.size = new-object System.Drawing.Size(967,10) 
$i = 0 
$Form.Controls.Add($pbrTest) 

# Show Form 
$Form.Add_Shown({$Form.Activate()}) 
$Form.ShowDialog() 
+1

Любая причина для использования forms.progress бар? https://technet.microsoft.com/en-us/library/hh849902.aspx звучит как хорошее решение. – Deptor

+0

Если вы хотите показать прогресс в форме, вам нужно создать какое-либо действие (то есть 'OnLoad') и увеличить индикатор выполнения там внутри цикла foreach. OR (как гораздо лучшее решение) не использует форму и использует «Write-Progress», как было предложено выше. – n01d

+0

@Deptor Чтобы показать пользовательский индикатор выполнения GUI, я сначала попытался Write_Progress, но почувствовал, что form.progress bar показывает лучший графический интерфейс пользователя. – n00b

ответ

2

Что-то вроде этого:

[System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms") | Out-Null 
[System.Reflection.Assembly]::LoadWithPartialName("System.Drawing") | Out-Null 
$batches = Get-Item 'D:\Soft\Scripts\testbat\*.bat' 

# Init Form 
$Form = New-Object System.Windows.Forms.Form 
$Form.width = 1000 
$Form.height = 200 
$Form.Text = "**OSP Installation in Progress**" 

# Init ProgressBar 
$pbrTest = New-Object System.Windows.Forms.ProgressBar 
$pbrTest.Maximum = $batches.Count 
$pbrTest.Minimum = 0 
$pbrTest.Location = new-object System.Drawing.Size(10,70) 
$pbrTest.size = new-object System.Drawing.Size(967,10) 
$Form.Controls.Add($pbrTest) 

# Add_Shown action  
$ShownFormAction = { 
    $Form.Activate() 

    foreach ($b in $batches) { 
     $pbrTest.Increment(1) 
     Start-Process $b.FullName -Wait -WindowStyle Hidden 
    } 
    $Form.Dispose() 
} 
$Form.Add_Shown($ShownFormAction) 

# Show Form 
$Form.ShowDialog() 
+0

Почему бы просто не использовать 'Write-Progress'? – alroc

+0

Согласно OP, последовательность имеет значение для этих файлов. 'Get-Item' должен быть' Get-ChildItem' с соответствующим 'sort-object' – alroc