Powershell スクリプトで新しいファイルを SFTP する

Powershell スクリプトで新しいファイルを SFTP する

ここに、ある場所から別の場所にファイルを SFTP するスクリプトがあります。スクリプトは正常に動作しますが、まだ存在しないファイルのみをコピーするようにスクリプトを変更したいと思います。PowerShell の初心者なので、助けていただければ幸いです。

cd "c:\Program Files (x86)\WinSCP\" # location of .NET assembly ddl file

try
{
    # Load WinSCP .NET assembly
    Add-Type -Path "WinSCPnet.dll"

    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions
    $sessionOptions.Protocol = [WinSCP.Protocol]::Sftp
    $sessionOptions.HostName = "192.168.xxx.xxx"
    $sessionOptions.UserName = "xxxx"
    $sessionOptions.Password = "xxxx"
    $sessionOptions.SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx"


    $session = New-Object WinSCP.Session

    try
    {
        # Connect
        $session.Open($sessionOptions)

        $stamp = Get-Date -f "yyyyMMdd"
        $fileName = "export_$stamp.txt"
        $remotePath = "/home/user/john/reports"
        $localPath = "\\fileserver\reports\"


        if ($session.FileExists($remotePath))
        {
            if (!(Test-Path $localPath))
            {
                Write-Host (
                    "File {0} exists, local backup {1} does not" -f
                    $remotePath, $localPath)
                $download = $True
            }


            if ($download)
            {
                # Download the file and throw on any error
                $session.GetFiles($remotePath, $localPath).Check()

                Write-Host "Download to backup done."
            }
        }
        else
        {
            Write-Host ("File {0} does not exist yet" -f $remotePath)
        }
    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }

    exit 0
}
catch [Exception]
{
    Write-Host $_.Exception.Message
    exit 1
}

どうもありがとう。

答え1

WinSCPの例から取得したスクリプトSession.GetFilesは単一のファイルのみを対象に設計されています。代わりにディレクトリを同期するように変更しようとしました。これは機能しません。

ディレクトリを同期するには、Session.SynchronizeDirectories:

# Synchronize files
$synchronizationResult = $session.SynchronizeDirectories(
    [WinSCP.SynchronizationMode]::Local, $localPath $remotePath)

# Throw on any error
$synchronizationResult.Check()

関連情報