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))

Voir aussi

  •