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

martin

Re: Why didn't the library throw an error?

@john_roa: Hard to tell without any information. Please post your code and log file. I can only guess that you do not call the Check method. See https://winscp.net/eng/docs/library_session#results
john_roa

Why didn't the library throw an error?

This article helped me troubleshoot an issue I was having where the PutFiles method was firing but the file I was trying to push wasn't landing on the site I was pushing to.

My question, though, is why did the error (in my case I was trying to push to a directory that didn't exist on the target site) only show up in the log? Why didn't the library throw the error? It would have saved me a lot of time if it had thrown the error rather than just eating it and having to search your logs to see that an error happened.
martin

Re: PowerShell Error Transferring File - PutFiles?

Thanks for posting your solution.

lkubler wrote:

Ah Ha! Got it! Problem seems to be that in the PutFiles method I need to include *.* on the destination path.

Well, you do not. But you need to include the trailing slash.
See https://winscp.net/eng/docs/library_session_putfiles
lkubler

Re: PowerShell Error Transferring File - PutFiles?

Ah Ha! Got it! Problem seems to be that in the PutFiles method I need to include *.* on the destination path. So I changed the following lines of code from above:
$transferResult = $session.PutFiles("C:\Scripts\MyFile.CSV", $remotePath + "/*.*", $false, $transferOptions)

And
$directory = $session.ListDirectory($remotePath + "/Outgoing")

To match the location of the files I need to download after the upload. I'll work that bit out next.

Thanks for the offer of help, Martin.
Linn
lkubler

Re: PowerShell Error Transferring File - PutFiles?

Hi Martin,

Attached are the log files, I believe I sufficiently sanitized them.

Thanks,
Linn
martin

Re: PowerShell Error Transferring File - PutFiles?

Please attach a full session log file showing the problem (using the latest version of WinSCP).

To generate log file, set Session.SessionLogPath. Submit the log with your post as an attachment. Note that passwords and passphrases not stored in the log. You may want to remove other data you consider sensitive though, such as host names, IP addresses, account names or file names (unless they are relevant to the problem). If you do not want to post the log publicly, you can mark the attachment as private.


A log from WinSCP GUI for comparison would be helpful too.
lkubler

PowerShell Error Transferring File - PutFiles?

Hi, New to PowerShell and WinSCP but trying to setup a script to upload files to an FTP server. I can connect and read the remote folder contents but when I try to send a file with PutFiles method I get a rather generic error.
"Error transferring file"

Is there any way to get more detail as to what exactly the error is? Like I said I can read the file names of the remote folder using ListDirectory method so I'm sure I'm connecting with the FTP server all right. Just can't figure out why the transfer is failing.

Here's my code: (Maybe I'm missing something?)
try {
   # Load WinSCP .NET assembly
   Add-Type -Path "C:\Scripts\WinSCPnet.dll"
   
   # Setup variables
   $localPath = "C:\Scripts"
   $logFilePath = "C:\Scripts\Log Files"
   $remotePath = "/Orders"
   
   # Setup session options
   $sessionOptions = New-Object winscp.sessionoptions
   $sessionOptions.protocol = [WinSCP.Protocol]::ftp
   $sessionOptions.HostName = "ftp_server"
   $sessionOptions.username = "ftp_user"
   $sessionOptions.password = "password"
   
   $session = New-Object WinSCP.Session
 
   # Clear the host screen.
   Write-Host | Clear-Host
   
   try
   {
      # Connect
      $session.Open($sessionOptions)
      
      # Upload files.
      $transferOptions = New-Object winscp.TransferOptions
      $transferOptions.TransferMode = [WinSCP.TransferMode]::Binary
            
      $transferResult = $session.PutFiles("C:\Scripts\MyFile.CSV", "Orders", $false, $transferOptions)
            
      # Thow an error.
      $transferResult.Check()
            
      # Print results of transfer.
      foreach ($transfer in $transferResult.Transfers)
      {
         Write-Host ("Upload of {0} succeeded" -f $transfer.FileName)
      }
      
      # No new orders to send or finished sending.
      # Check remote site for return files.
      $directory = $session.ListDirectory($remotePath)
      
      # Select files matching wildcard.
      $remoteFiles = $directory.Files | Where-Object { $_.Name -like "*.csv" }
      
      if ($remoteFiles)
      {
      # Download each return file.
         foreach ($file in $remoteFiles)
         {
            Write-Host ("{0} with size {1} and last modification at {2}`n" -f
               $file.Name, $file.length, $file.LastWriteTime)
         }
      }
   }
   finally
   {
      # Disconnect, clean up
      $session.Dispose()
   }
   Write-Host "Done, no errors!"
   exit 0
}
catch [Exception]
{
   Write-Host $_.Exception.Message
   Write-Host "Complete with Error!"
   exit 1
}


Any help is greatly appreciated.

Thanks in advance,
Linn

Update: I was able to figure out how to use the $TransferResult.Failures to see more details and it says access denied on the remote folder. But I can use WinSCP on the same computer to manually transfer files to that folder with the same user credentials. Any thoughts about the rights differences?

Thanks!