Post a reply

Options
Add an Attachment

If you do not want to add an Attachment to your Post, please leave the Fields blank.

(maximum 10 MB; please compress large files; only common media, archive, text and programming file formats are allowed)

Options

Topic review

popotzo

Perfect! Thanks a lot dotps1!
dotps1

popotzo wrote:

Thanks dotps1! It's working now but the script is adding %5C in front of each file name.

Any idea or suggestion?


Sorry, i forgot that $directoryInfo.Files already only returns the file name, so, you should beable to remove the .Name from $($file.Name) in the GetFiles().

         foreach ($file in $latest) 

         {
             $session.GetFiles("$remotePath/$file", $localPath)
         }


i edited the original post as well.
see if that fixes it.

thanks.
popotzo

Thanks dotps1! It's working now but the script is adding %5C in front of each file name.

Any idea or suggestion?
dotps1

Try a foreach loop for the .GetFiles method

I got it to work by adding a Foreach Loop to the list of files:

Param ( $localPath = 'c:\downloaded\', $remotePath = '/home/user/' ) 


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 = 'example.com'
    $sessionOptions.UserName = 'user'
    $sessionOptions.Password = 'mypassword'
    $sessionOptions.SshHostKeyFingerprint = 'ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx'

    $session = New-Object -TypeName WinSCP.Session

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

        # Get list of files in the directory
        $directoryInfo = $session.ListDirectory($remotePath)

        # Select the most recent file
        $latest = $directoryInfo.Files | Where-Object { -Not $_.IsDirectory } | Sort-Object -Property LastWriteTime -Descending | Select-Object -First 12

        # Any file at all?
        if ($latest -eq $null)
        {
            Write-Output -InputObject "No file found"
            exit 1
        }

        # Download the selected file
        # $session.GetFiles($session.EscapeFileMask($remotePath + $latest.Name), $localPath).Check()

        # Download list of files in foreach loop
        foreach ($file in $latest)
        {
            $session.GetFiles("$remotePath/$file", $localPath)
        }
    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }

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


because what is happing is your GetFiles command looks like this:
$session.GetFiles($session.EscapeFileMask(/home/user/file1.txt file2.txt file3.text file4.txt), $localPath).Check()

and im sure that is not what you where going for.

Check out https://winscp.net/eng/docs/library_session_getfiles, the RemotePath Property takes an object of Type [String] not [String[]].
popotzo

Thank you for the reply. It's the code from your website but instead of copying just 1 file I need to copy multiple files with the latest date stamp.

https://winscp.net/eng/docs/script_download_most_recent_file

param (
$localPath = "c:\downloaded\",
$remotePath = "/home/user/"
)

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 = "example.com"
$sessionOptions.UserName = "user"
$sessionOptions.Password = "mypassword"
$sessionOptions.SshHostKeyFingerprint = "ssh-rsa 2048 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"

$session = New-Object WinSCP.Session

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

# Get list of files in the directory
$directoryInfo = $session.ListDirectory($remotePath)

# Select the most recent file
$latest =
$directoryInfo.Files |
Where-Object { -Not $_.IsDirectory } |
Sort-Object LastWriteTime -Descending |
Select-Object -First 1

# Any file at all?
if ($latest -eq $Null)
{
Write-Host "No file found"
exit 1
}

# Download the selected file
$session.GetFiles($session.EscapeFileMask($remotePath + $latest.Name), $localPath).Check()
}
finally
{
# Disconnect, clean up
$session.Dispose()
}

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

Re: copy multiple files using ps script

Your code will resolve to a collection. So you have to iterate the collection and call Session.GetFiles for each file in the collection. Are you doing this? Show us your complete code. A session log file would be useful too.
popotzo

copy multiple files using ps script

Hello,

I am trying to use the PS script from your site to copy multiple files from a remove server to a local folder. The original script is copying only 1 file but i need to copy 12 files. I 've changed from 1 to 12 but im receiving Can't get attributes of file. What am i doing wrong?


# Select the most recent file
$latest =
$directoryInfo.Files |
Where-Object { -Not $_.IsDirectory } |
Sort-Object LastWriteTime -Descending |
Select-Object -First 12
Thanks