Search code examples
batch-filessisscriptingftpwinscp

Using if condition in WinSCP script file to check if a file exist


In an SSIS package using the execute process task I am executing a script file which is WinSCP scripting to connect to an FTP site via WinSCP.

I am able to use the basics like get, put, open commands in WinSCP.

But there is a scenario where I want to check if a file exist on an FTP site and if it does I pull the file else I pull a different file WinSCP.

However it seems that the moment I put if it just fails the script like it cannot read that syntax.

Does if statement not exist for WinSCP script files?

I was using this link for reference in building the if statement: https://winscp.net/eng/docs/script_checking_file_existence#scripting

This is the WinSCP script file code I have.

# Automatically abort script on errors
option batch abort
# Disable overwrite confirmations that conflict with the previous
option confirm off
# Connect
open FTP
# Remote FTP Folder
cd SSISFTP
# get file attributes
stat FILEONE.txt
# conditional statement
if %ERRORLEVEL% neq 0 goto error
# Get FILEONE File
get FILEONE.txt
# Disconnect
close
# Exit WinSCP
exit /b 0

:error
get FILETWO.txt
# Disconnect
close
# Exit WinSCP
exit /b 1`

Solution

  • The article you refer to does not contain the code that you are attempting.

    The article shows that you need to create a Windows batch file (.bat) and use it first to run WinSCP to determine if a file exists. And then do something based on that finding. In your case, you will need to run WinSCP again to do the actual download. Something like this (not tested):

    @echo off
    
    set SESSION=mysession 
    set REMOTE_DIR=/home/user
    set REMOTE_FILE=test.txt
    winscp.com /command ^
        "open %SESSION%" ^
        "stat %REMOTE_DIR%/%REMOTE_FILE%" ^
        "exit"
     
    if %ERRORLEVEL% equ 0 (
        echo File %REMOTE_FILE% exists, will download it
    ) else (
        set REMOTE_FILE=other.txt
        echo Error or file %REMOTE_FILE% not exists, will download %REMOTE_FILE%
    )
    
    winscp.com /command ^
        "open %SESSION%" ^
        "get %REMOTE_DIR%/%REMOTE_FILE%" ^
        "exit"
    

    Though from SSIS, I'd recommend you to instead use Script Task with C# (or other) code and WinSCP .NET assembly. See Using WinSCP .NET Assembly from SQL Server Integration Services (SSIS).

    In the code, you can use Session.FileExists method to determine if a file exists. This is also covered in the article that you refer to (although for PowerShell).