Сценарий PowerShell для копирования файлов, но не подпапок, в SFTP и перемещения в подпапку после завершения

Я использую следующий скрипт для копирования файлов из моей локальной папки в SFTP. Как только я загружаю файл, я хочу переместить файл в подпапку. Я хочу загружать только файлы в папку C:\Users\Administrator\Desktop\ftp, а не файлы в другие подпапки.

param (
    $backupPath = "C:\Users\Administrator\Desktop\ftp\moved"
)

# Load the Assembly and setup the session properties
try
{
    # Load WinSCP .NET assembly
    Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll" 

    $session = New-Object WinSCP.Session

    $filelist = Get-ChildItem C:\Users\Administrator\Desktop\ftp 

    # Connect And send files, then close session
    try
    {
        # Connect
        $session.Open($sessionOptions)

        $transferOptions = New-Object WinSCP.TransferOptions
        $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary

        foreach ($file in $filelist)
        {
            $transferResult = $session.PutFiles("C:\Users\Administrator\Desktop\ftp\$file", "/", $False, $transferOptions)
            foreach ($transfer in $transferResult.Transfers)
            {
                Write-Host "Upload of $($transfer.FileName) succeeded"
                Move-Item $transfer.FileName $backupPath
            }
        }
    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }

    exit 0
}
# Catch any errors
catch
{
    Write-Host "Error: $($_.Exception.Message)"
    exit 1
}

В этот момент, если я запущу скрипт, все файлы в папке moved также будут загружены через папку SFTP, и мне просто нужно загрузить файлы в корневой каталог папки ftp.

Я думаю, мне нужно будет изменить эту строку здесь, но не знаю, как ее изменить.

$filelist = Get-ChildItem C:\Users\Administrator\Desktop\ftp 

person Site    schedule 07.11.2019    source источник
comment
Get-ChildItem -File — возвращает только файловые объекты   -  person Scepticalist    schedule 08.11.2019


Ответы (2)


Чтобы пропустить папки, добавьте переключатель -File к Get-ChildItem (как уже прокомментировал @Scepticalist):

$filelist = Get-ChildItem -File C:\Users\Administrator\Desktop\ftp 

Хотя вы можете добиться того же с меньшим количеством кода, если вы позволите WinSCP перебирать файлы (и пропускать папки):

$transferOptions = New-Object WinSCP.TransferOptions
$transferOptions.TransferMode = [WinSCP.TransferMode]::Binary
$transferOptions.FileMask = "|*/" # Exclude the folders

$transferResult = $session.PutFiles(
    "C:\Users\Administrator\Desktop\ftp\*", "/", $False, $transferOptions)
foreach ($transfer in $transferResult.Transfers)
{
    Write-Host "Upload of $($transfer.FileName) succeeded"
    Move-Item $transfer.FileName $backupPath
}

И вам не нужен никакой Get-ChildItem вызов.

Вышеприведенный код в основном представляет собой код из статьи WinSCP Перемещение локальных файлов в другое место после успешной загрузки, просто с исключением вложенных папок.


Однако учтите, что в вашем коде (вопреки статье) нет теста на успешную загрузку. Таким образом, вы будете перемещать даже файлы, которые не удалось загрузить. Убедитесь, что вы добавили тест $transfer.Error -eq $Null.

foreach ($transfer in $transferResult.Transfers)
{
    # Success or error?
    if ($transfer.Error -eq $Null)
    {
        Write-Host "Upload of $($transfer.FileName) succeeded, moving to backup"
        # Upload succeeded, move source file to backup
        Move-Item $transfer.FileName $backupPath
    }
    else
    {
        Write-Host "Upload of $($transfer.FileName) failed: $($transfer.Error.Message)"
    }
}
person Martin Prikryl    schedule 08.11.2019

попробуй использовать

Get-Item C:\Users\Administrator\Desktop\ftp -include *.*

это не должно попасть в подпапки.

person Davide Piras    schedule 07.11.2019
comment
спасибо, к сожалению, когда я пытаюсь это сделать, он все еще попадает в подпапки - person Site; 08.11.2019