简体   繁体   中英

PowerShell BitsTransfer use file names from variable as source

I am new to PowerShell and I get a lot done using this forum along with other internet searched answers but this one is getting the better of me. I have a script that compares two folders and the part where I'm having problems I cannot get the BitsTransfer source to work. $Differences identifies files from the source folder that are not in the target folder by modified date. I want the BitsTransfer to move the files identified by $Differences but I'm not having any luck getting that behavior. The operation works when I use "Copy-Item -Path $Differences -Destination $Local –Force" instead but i want the progress bar BitsTransfer Uses. The code i am using is as follows

$Local = 'c:\test\local\' 
$Remote = 'c:\test\server\' 
$Target = Get-ChildItem -Path $Local -File 
$Source = Get-ChildItem -Path $Remote -File 

Import-Module BitsTransfer

Set-Location $Remote

filter timestamp {"$(Get-Date -Format g): $_"} 

if ($Target -eq $null) { 
    $bitsjob = Start-BitsTransfer -Source $Remote\*.* -Destination $Local 
    Write-Output "$Local Folder Empty" | timestamp | Out-File -Encoding Ascii -append "D:\Mitek\DCS Stuff\Display PC Scripts\test\log.txt"
    Rename-Item -Path "D:\Mitek\DCS Stuff\Display PC Scripts\test\RemoteComplete.bat" -NewName "Remote.bat"
    Exit
} Else { 

if ($Target -ne $null){
    Compare-Object $Source $Target -Property Name  -PassThru | Where-Object {$_.SideIndicator -eq "=>"} | % {
        if(-not $_.FullName.PSIsContainer) {
            Write-Output "Removed From $Local" | timestamp | Out-File -Encoding Ascii -append "D:\Mitek\DCS Stuff\Display PC Scripts\test\log.txt"
            Remove-Item -Path $_.FullName -Force -ErrorAction SilentlyContinue}}}}

$Differences = Compare-Object -ReferenceObject $Source -DifferenceObject $Target -Property LastWriteTime -PassThru 
$Differences | Group-Object Name | Select -ExpandProperty Group | Sort-Object LastWriteTime | Select-Object -Last 1


if ($Differences -ne $null) { 
       foreach ($file in $Differences) {
        #Copy-Item -Path $Differences -Destination $Local –Force
        Start-BitsTransfer -Source $Differences -Destination $Local
        Write-Output "Copied to $Local" | timestamp | Out-File -Encoding Ascii -append "D:\Mitek\DCS Stuff\Display PC Scripts\test\log.txt"
        Rename-Item -Path "D:\Mitek\DCS Stuff\Display PC Scripts\test\RemoteComplete.bat" -NewName "Remote.bat"}

} Else {

Write-Output "$Local and $Remote are Equal" | timestamp | Out-File -Encoding Ascii -append "D:\Mitek\DCS Stuff\Display PC Scripts\test\log.txt"}`

I got the issue figured out with some looping behavior the code used to resolve the issue is bellow for those who may find this helpful in the future...

$Local = 'C:\test\local\'
$Remote = 'C:\test\server\' 
$Target = Get-ChildItem -Path $Local -File 
$Source = Get-ChildItem -Path $Remote -File 
$One = 1 

Set-Location $Remote 

filter timestamp {"$(Get-Date -Format g): $_"} 

if ($Target -eq $null) { 
    $TotalA = $Source | Measure | Select-Object -ExpandProperty Count 
    echo "Total Number of Files to be Copied= $TotalA" 
    echo "---------------------------------------------------------------" 
    Write-Output "$Local Folder Empty" | timestamp | Out-File -Encoding Ascii -append "D:\Mitek\DCS Stuff\Display PC Scripts\test\log.txt" 
    Start-BitsTransfer -Source $Remote\*.* -Destination $Local -Description "Copying $TotalA Files" 
    Rename-Item -Path "C:\test\RemoteComplete.bat" -NewName "Remote.bat" 
    exit 

} Else { 

if ($Target -ne $null){ 
Compare-Object $Source $Target -Property Name -PassThru | Where-Object {$_.SideIndicator -eq "=>"} | % { 

if(-not $_.FullName.PSIsContainer) { 
    Write-Output "Removed From $Local" | timestamp | Out-File -Encoding Ascii -append "D:\Mitek\DCS Stuff\Display PC Scripts\test\log.txt" 
    Remove-Item -Path $_.FullName -Force -ErrorAction SilentlyContinue}}}} 

$Differences = Compare-Object -ReferenceObject $Source -DifferenceObject $Target -Property LastWriteTime -PassThru 

if ($Differences -ne $null) { 
    $TotalB=$Differences | Group-Object Name | Select -ExpandProperty Group | Sort-Object Name | Measure | Select-Object -ExpandProperty Count 
    echo "Total Number of Files to be Copied= $TotalB" 
    Write-Output "Copied to $Local" | timestamp | Out-File -Encoding Ascii -append "D:\Mitek\DCS Stuff\Display PC Scripts\test\log.txt" 
        do { 
            $Tar = Get-ChildItem -Path $Local -File 
            $Src = Get-ChildItem -Path $Remote -File 
            $Diffs = Compare-Object -ReferenceObject $Src -DifferenceObject $Tar -Property LastWriteTime -PassThru 
            $ListB=$Diffs | Group-Object Name | Select -ExpandProperty Group | Sort-Object Name | Select-Object -First 1 
                if ($ListB -ne $null) { 
                    echo "---------------------------------------------------------------" 
                    $Rmn=$Diffs | Group-Object Name | Select -ExpandProperty Group | Sort-Object Name | Measure | Select-Object -ExpandProperty Count 
                    $RemainB = $Rmn - $One 
                    Start-BitsTransfer -Source $ListB -Destination $Local -Description "$RemainB Files Remain     Copying - $List" }} 
            Until ($ListB -eq $null) 
    Rename-Item -Path "C:\test\RemoteComplete.bat" -NewName "Remote.bat" 

} Else { 

Write-Output "$Local and $Remote are Equal" | timestamp | Out-File -Encoding Ascii -append "D:\Mitek\DCS Stuff\Display PC Scripts\test\log.txt"} 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM