PowerShell/Fichier/BITS
Aller à la navigation
Aller à la recherche
BITS, exemple 1
Source : https://www.it-connect.fr
<#
.SYNOPSIS
Download files recursively with BITS with the same arborescence.
.DESCRIPTION
This script download files recursively using BITS transfer method.
It recreate the arborescence of the source in the destination folder, and download each file at the same place that in the source.
.PARAMETER Source
The path to the source folder, all files in his subfolders will be copied. PLEASE, DO NOT INCLUDE A BACKSLASH AT THE END OF THE PATH
.PARAMETER Destination
The path to the destination folder, where you want to store downloaded files. PLEASE, DO NOT INCLUDE A BACKSLASH AT THE END OF THE PATH
.EXAMPLE
.\Start-BitsDownloadRecursive.ps1 -Source "\\192.168.1.150\Download\BITS\" -Dest "C:\temp\BITS"
.INPUTS
.OUTPUTS
.NOTES
NAME: Start-BitsDownloadRecursive.ps1
AUTHOR: Florian Burnel
EMAIL: florian.burnel@it-connect.fr
WWW: www.it-connect.fr
Twitter:@FlorianBurnel
VERSION HISTORY:
1.0 2017.02.02
Initial Version
TODO
* Include a parameter for credentials
* Improve control over transfers
* Add possibility to exclude folders
#>
### Parameters
param (
[parameter(Mandatory=$true)][ValidateScript({Test-Path $_ })][String]$Source,
[parameter(Mandatory=$true)][ValidateScript({Test-Path $_ })][String]$Dest
)
# Import module BitsTransfer
Import-Module BitsTransfer -ErrorAction SilentlyContinue -ErrorVariable ModuleState
# Continue only if the module is correctly imported
If (!($ModuleState)) {
Get-ChildItem $Source -Recurse -Directory | ForEach-Object {
# Start the download of files which are in the root of the source
If ((Get-BitsTransfer -Name "Root-Source" -ErrorAction SilentlyContinue).Count -eq 0) {
Start-BitsTransfer -Asynchronous -Source "$Source\*.*" -Destination $Dest -DisplayName "Root-Source"
}
# Path to the child item (directory)
$DestChild = ($_.FullName).Replace($Source, "")
# If the directory in the destination is already created, start the BITS transfer, else it will be create before start the job.
If (Test-Path "$Dest\$DestChild\") {
Start-BitsTransfer -Asynchronous -Source "$($_.FullName)\*.*" -Destination "$Dest\$DestChild\" -DisplayName $_.Name
}
Else {
New-Item -ItemType Directory -Path "$Dest\$DestChild" -ErrorVariable FolderCreation
If (!($FolderCreation)) {
Start-BitsTransfer -Asynchronous -Source "$($_.FullName)\*.*" -Destination "$Dest\$DestChild\" -DisplayName $_.Name
}
Else {
Write-Output "ERROR ! Impossible to create the destination folder ($DestChild) !"
} # if(!($FolderCreation))
} # if(Test-Path "$Dest\$DestChild\")
}
# Wait during the BITS transfer before to complete it
While (((Get-BitsTransfer).JobState -eq "Transferring") -or ((Get-BitsTransfer).JobState -eq "Connecting")) {
Start-Sleep -Seconds 3
}
# Complete all the BITS transfer
Get-BitsTransfer | Complete-BitsTransfer
# Check that the source and the destination are the same number of elements
If ((Get-ChildItem $Source -Recurse).Count -eq (Get-ChildItem $Dest -Recurse).Count) {
Write-Output "Transfer complete ! All elements are transferred !"
}
Else {
Write-Output "ERROR ! One or several elements aren't transferred !"
}
}
Else {
Write-Output "ERROR ! Impossible to load the module BitsTransfer"
} # if(!($ModuleState))