1

I'm using this script in a loop to download a number of files from the server and it works pretty good.

$sourceuri = "ftp://ftp.secureftp-test.com/hamlet.zip"
$targetpath = "C:\hamlet.zip"
$username = "test"
$password = "test"

# Create a FTPWebRequest object to handle the connection to the ftp server
$ftprequest = [System.Net.FtpWebRequest]::create($sourceuri)

# set the request's network credentials for an authenticated connection
$ftprequest.Credentials =
New-Object System.Net.NetworkCredential($username,$password)

$ftprequest.Method = [System.Net.WebRequestMethods+Ftp]::DownloadFile
$ftprequest.UseBinary = $true
$ftprequest.KeepAlive = $false

# send the ftp request to the server
$ftpresponse = $ftprequest.GetResponse()

# get a download stream from the server response
$responsestream = $ftpresponse.GetResponseStream()

# create the target file on the local system and the download buffer
$targetfile = New-Object IO.FileStream ($targetpath,[IO.FileMode]::Create)
[byte[]]$readbuffer = New-Object byte[] 1024

# loop through the download stream and send the data to the target file
do{
    $readlength = $responsestream.Read($readbuffer,0,1024)
    $targetfile.Write($readbuffer,0,$readlength)
}
while ($readlength -ne 0)

$targetfile.close()

But sometimes the target file is not there and then this script starts flushing my command prompt with errors. this is kinda anoying to debug, which of the files is missing. is there a way, to turn of this script as soon as there is a missing file and skip to to the next one?

Here is the error:

Exception calling "GetResponse" with "0" argument(s): "The remote server returned a
n error: (550) File unavailable (e.g., file not found, no access)."
At D:\powershell\IPO_preveri_CMD_ALL\ftp.ps1:37 char:5
+     $ftpresponse = $ftprequest.GetResponse()
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
    + FullyQualifiedErrorId : WebException

You cannot call a method on a null-valued expression.
At D:\powershell\IPO_preveri_CMD_ALL\ftp.ps1:40 char:5
+     $responsestream = $ftpresponse.GetResponseStream()
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

the last 6 lines get then repeated...

4
  • Can you edit the question to include the error that is generated? Commented Jul 14, 2015 at 12:07
  • So you are just looking for a simple try/catch block then? Commented Jul 14, 2015 at 12:30
  • Yes. Nothing fancy. :) Only I must know, which file is missing. Commented Jul 14, 2015 at 12:53
  • thanks, your code helped me connect to an ftp with powershell :) Commented Sep 1, 2021 at 20:07

1 Answer 1

1

Sounds like you are just asking for a simple try-catch. I don't know of what error handling [System.Net.FtpWebRequest] has to offer so this generic approach is a good place to start.

$SavedErrorActionPreference = $ErrorActionPreference
$ErrorActionPreference = "Stop" 

Try{
    # send the ftp request to the server
    $ftpresponse = $ftprequest.GetResponse()

    # get a download stream from the server response
    $responsestream = $ftpresponse.GetResponseStream()

    # create the target file on the local system and the download buffer
    $targetfile = New-Object IO.FileStream ($targetpath,[IO.FileMode]::Create)
    [byte[]]$readbuffer = New-Object byte[] 1024

    # loop through the download stream and send the data to the target file
    do{
        $readlength = $responsestream.Read($readbuffer,0,1024)
        $targetfile.Write($readbuffer,0,$readlength)
    }
    while ($readlength -ne 0)

    $targetfile.close()
} Catch {
    # Notify user an error occured. 
    Write-Warning "Unable to download '$sourceuri' because: $($_.exception)"
}

$ErrorActionPreference = $SavedErrorActionPreference 

So if any terminating error occurs in the try block processing is stopped and the catch block is executed. From the looks of it those errors are not terminating so we need to to temporarily change it to Stop to ensure that try block functions properly.

Then in the catch block we take the simplest approach and just write out the file path that failed while also providing the message associated to the error. Using the above example you should get something like:

Unable to download 'ftp://ftp.secureftp-test.com/hamlet.zip' because: The remote server returned an error: (550) File unavailable (e.g., file not found, no access).

This should stop on the first error. By ceasing processing it will avoid the null expression errors.

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.