Skip to content

Instantly share code, notes, and snippets.

@ChrisStro
Created February 28, 2025 18:31
Show Gist options
  • Save ChrisStro/8ab40b0c5a328c7dd51ba25538e6b13a to your computer and use it in GitHub Desktop.
Save ChrisStro/8ab40b0c5a328c7dd51ba25538e6b13a to your computer and use it in GitHub Desktop.
Function Start-BCBitsDownload (
[parameter(mandatory=$true,Position=0,HelpMessage="enter an Displayname")]
[ValidateNotNullOrEmpty()]
$Product,
[parameter(mandatory=$true,Position=1,HelpMessage="enter Source URL")]
[ValidateNotNullOrEmpty()]
$Source,
[parameter(mandatory=$true,Position=2,HelpMessage="enter Destination Path")]
[ValidateNotNullOrEmpty()]
$Destination,
[parameter(mandatory=$false,Position=3,HelpMessage="enter Username",ParameterSetName="Credential")]
[ValidateNotNullOrEmpty()]
$Username,
[parameter(mandatory=$false,Position=4,HelpMessage="enter Password",ParameterSetName="Credential")]
[ValidateNotNullOrEmpty()]
$Password
)
{
#Set Basic Parameter for Bitstransfer cmdlet
$BitstransferParams = @{
Displayname = $Product
Source = $Source
Destination = $Destination
}
#set additional Parameter
if ($Username) {
$securePassword = ConvertTo-SecureString "$Password" -AsPlainText -force
$Credential = New-Object System.Management.Automation.PsCredential("$Username",$securePassword)
#add Credential Object to Param
$BitstransferParams.Credential = $Credential
$BitstransferParams.Authentication = "Negotiate"
}
#$Job = Start-BitsTransfer -DisplayName $Product -Source $Source -Destination $Destination -Asynchronous -TransferType Download -Priority Foreground
$Job = Start-BitsTransfer @BitstransferParams -Asynchronous -TransferType Download -Priority Foreground
$Starttime = $job.CreationTime
Write-Host -ForegroundColor Yellow "$Starttime Download startet"
while (($Job.JobState -eq "Transferring") -or ($Job.JobState -eq "Connecting") -or ($Job.JobState -eq "TransientError") -or ($Job.JobState -eq "Suspended") ){
$Percent = [int](($Job.BytesTransferred*100) / $Job.BytesTotal)
Write-Progress -Activity "Downloading file..." -CurrentOperation "$Percent% complete, be patiently"
Start-Sleep 3 # Poll for status, sleep for 5 seconds, or perform an action.
}
Switch($Job.JobState){
"Transferred" {Complete-BitsTransfer -BitsJob $Job}
"Error" {$Job | Format-List } # List the errors.
default {$Job | Format-List } # Perform corrective action.
}
if ((Get-BCStatus).BranchCacheIsEnabled){
#create Report from Eventlog
$Jobevent = Get-WinEvent -FilterHashTable @{ LogName = "Microsoft-Windows-Bits-Client/Operational"; StartTime = $Starttime ; ID = 60 }
$Xmlview = [xml]$Jobevent[0].ToXml()
$TransferredMB = ($Xmlview.Event.EventData.Data[9].'#text')/1MB
$TransferredFromPeerMB = ($Xmlview.Event.EventData.Data[12].'#text')/1MB
$TransferredFromPeerPer = ($TransferredFromPeerMB/$TransferredMB).ToString("P")
#create Table View
$Results+= [pscustomobject][ordered]@{Jobname = "$product"; "Transferred MB from Server" = $TransferredMB; "Transferred MB from Peers" = $TransferredFromPeerMB; "PercentBC" = $TransferredFromPeerPer}
$Results
}
}
function show-BCBitsreport {
param (
[int]$Numberoflastevents=1,
[int]$MinfilesizeinMB=0,
[switch]$incolor
)
#Get last events from Eventlog
$events = Get-WinEvent -FilterHashTable @{ LogName = "Microsoft-Windows-Bits-Client/Operational"; ID = 60 } -MaxEvents $Numberoflastevents
#create Empty Array
$Results = @()
#Loop through events
foreach ($event in $events) {
$Starttime = $event.TimeCreated
$Xmlview = [xml]$event[0].ToXml()
$Jobname = $Xmlview.Event.EventData.Data[1].'#text'
$TransferredMB = ($Xmlview.Event.EventData.Data[9].'#text')/1MB
$TransferredFromPeerMB = ($Xmlview.Event.EventData.Data[12].'#text')/1MB
$TransferredFromPeerPer = ($TransferredFromPeerMB/$TransferredMB).ToString("P")
$URL = $Xmlview.Event.EventData.Data[3].'#text'
#Add new Object to Array
if ($TransferredMB -gt $MinfilesizeinMB){
$Results += [PSCustomObject]@{
Jobname = $Jobname
"StartTime" = $Starttime
"RxSvr/MB" = $TransferredMB.ToString("N3")
"RxPeer/MB" = $TransferredFromPeerMB.ToString("N3")
"RxBC%" = $TransferredFromPeerPer
"DownloadURL" = $URL
}
}
}
#build table for right-alignment
$StartTime = @{
Label = " Startzeit "
E = {$_.StartTime}
Alignment = "right"
}
$RxSvr = @{
Label = "RxSvr/MB"
E = {$_.'RxSvr/MB'}
Alignment = "right"
}
$RxPeer = @{
Label = "RxPeer/MB"
E = {$_.'RxPeer/MB'}
Alignment = "right"
}
$RxPercBC = @{
Label = "% received via BC"
E = {$_.'RxBC%'}
Alignment = "right"
}
#Put Result into nice format
$Results = $Results | Format-Table Jobname, $Starttime, $RxSvr, $RxPeer, $RxPercBC, DownloadURL
if ($incolor){
$ResultsString = $Results | Out-String
$ResultsString -split "`n" | ForEach-Object {
if ($_ -match '\d{1,3}\,\d{2}\s\%'){
$Textsections = $_ -split '((?=\d{1,3}\,\d{2}\s\%).*(?<=\d{1,3}\,\d{2}\s\%))'
switch ($Textsections[1]) {
{[double]$_.Replace('%','').Replace(',','.') -gt 80}{$script:color = "Green";Break} # Best
{[double]$_.Replace('%','').Replace(',','.') -gt 15}{$script:color = "Yellow";Break} # Good
{[double]$_.Replace('%','').Replace(',','.') -lt 15}{$script:color = "Red";Break} # Bad
#Default {"something strange happened"}
}
Write-Host $Textsections[0] -NoNewline;Write-Host -ForegroundColor $color $Textsections[1] -NoNewline; Write-Host $Textsections[2]
}else{
$_
}
}
}else{
$Results
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment