• Status: Solved
  • Priority: Medium
  • Security: Public
  • Views: 896
  • Last Modified:

Sample Windows 2008 batch script : test status of files transfer & retransfer if status fails

In one new project, our Win 2008 (client) ftp scripts had been failing
intermittently & the network chaps can't isolate where on the
network is the 'disconnect' happening.  Sometimes, files at the
remote ftp server end are locked or not there yet (ie apps at remote
end delayed by a couple of minutes in  creating the data file).

In ncftp, there are various status codes that we can test for:
These are the errorlevel values returned by ncftpget:

    ncftpget returns the following exit values:

       0. Success.
       1. Could not connect to remote host.
       2. Could not connect to remote host - timed out.
       3. Transfer failed.
       4. Transfer failed - timed out.
       5. Directory change failed.
       6. Directory change failed - timed out.
       7. Malformed URL.
       8. Usage error.
       9. Error in login configuration file.
      10. Library initialization failed.
      11. Session initialization failed.

My customer does not allow us to use opensource tools but
only Windows native ftp client, thus I'll a way to test if a
file get (or mget)'s status & if it fails, to pause for 10 mins
(doing 'ping localhost -n 600 > nul' would do as 1 ping is
abt 1 sec) & attempt retransfer again & if it fails attempt
again a 3rd time.

Will need some sample Windows batch script as I don't
quite know the syntax to check the %errorlevel% for
ftp.
0
sunhux
Asked:
sunhux
  • 2
  • 2
  • 2
3 Solutions
 
arnoldCommented:
You may want to explore using vbscript or c# and maybe powershell to script your FTP session which will provide you th control you are looking for.
Vbscript ref.
http://community.spiceworks.com/scripts/show/99-an-ftp-vbscript-class

A search will provide you with many options depending on which scripting/programming approach you are comfortable with.
0
 
David Johnson, CD, MVPOwnerCommented:
You may want to elaborate on this approach using powershell


function Get-FtpFile {
	<#
		.SYNOPSIS
			Retrieves A file from an FTP Server

		.DESCRIPTION
			Using a Powershell Module this script retrieves a file from an ftp server

		.PARAMETER  Username
			The Username required to login to the ftp server
	
		.PARAMETER  Password
			The Password associated with the Username
		
		.PARAMETER  FtpServer
			The url for the Ftp server i.e. ftp:\\ftp.example.com
		
		.PARAMETER  Serverpath
			The path to the file on the ftp server
		
		.PARAMETER  LocalPath
			Where you want the file saved
		.PARAMETER  Password
			The Password associated with the Username
		.PARAMETER  Password
			The Password associated with the Username

		.EXAMPLE
			PS C:\> Get-FtpFile -username USERNAME -password PASSWORD -ftpserver ftp:\\ftp.example.com -serverpath /abc/ -localpath c:\temp -filename fileame.txt

		.EXAMPLE
			PS C:\> Get-FtpFile -username USERNAME -password PASSWORD -ftpserver ftp:\\ftp.example.com -filename fileame.txt

		.NOTES
			Additional information about the function go here.

		
#>	
	param(
	[Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] 	[System.String] $username,
	[Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] 	[System.String] $password,
	[Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()] 	[System.String] $ftpserver,
	[Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()]  [System.String] $filename,
	[System.String] $serverpath,
	[Parameter(Mandatory=$true)][ValidateNotNullOrEmpty()]  [System.String] $localpath
	)

Import-Module psftp
# get the module from http://gallery.technet.microsoft.com/scriptcenter/PowerShell-FTP-Client-db6fe0cb
#
# initiaize a few variables
#
$fileSize = "0"
$remotefileSize = "0"

$secstr = New-Object -TypeName System.Security.SecureString
$password.ToCharArray() | ForEach-Object {$secstr.AppendChar($_)}
$credentials = new-object -typename System.Management.Automation.PSCredential -argumentlist $username, $secstr
#connect to ftp server

Set-FTPConnection -Credentials $credentials -Server $FtpServer -UseBinary

#
#  Test to see if the file exists by getting the file size by name.
#  If a -1 is returned, the file does not exist.

$remotefileSize = Get-FTPItemSize -Path $filename
if ($remotefileSize -lt 0) { $("file does not exist") }
else {     $("The file exists and is " + $remotefileSize + " bytes in size")   }
#
# transfer the file
#
Get-FTPChildItem -path $filename -Recurse | Get-FTPItem -localpath $localpath -RecreateFolders 
#
# check recieved file is the same size as the remote filesize
#
$filesize = Get-childItem  -Path $localpath -Filter $filename
$localfilesize = $fileSize.length
}

if ($localfilesize -ne $remotefileSize) {
Write-Output("The Remote and Local Files don't have the same length")
return 3
}

}

Open in new window

0
 
sunhuxAuthor Commented:
Bear with me as I'm totally new to PowerShell:

"Import-Module psftp" : does this mean this uses psftp or it's ftp?

Does Win 2003 Enterprise (32bit) comes with PowerShell?
0
Free Tool: ZipGrep

ZipGrep is a utility that can list and search zip (.war, .ear, .jar, etc) archives for text patterns, without the need to extract the archive's contents.

One of a set of tools we're offering as a way to say thank you for being a part of the community.

 
sunhuxAuthor Commented:
Btw, how do I execute the Powershell script?

Can it do the equivalent of ftp 'mget' ?
0
 
arnoldCommented:
To get the control you want in determining what is going on, relying on a script provides you with a larger level of control.

powershell is available depending on whether you deployed it using WSUS or installed it as part of a windows update.

powershell get-help

Are you familiar with vbscript or c#?
0
 
David Johnson, CD, MVPOwnerCommented:
1. Yes it uses the module psftp
2. you would get a listing of files and then use a for/each loop to retrieve each file individually
3. you would need powershell installed. it is part of winrm http://support.microsoft.com/kb/968929?wa=wsignin1.0
4. c:\windows\system32\windowspowershell\1.0\powershell -noprofile <path>\scriptname.ps1
0

Featured Post

[Webinar] Improve your customer journey

A positive customer journey is important in attracting and retaining business. To improve this experience, you can use Google Maps APIs to increase checkout conversions, boost user engagement, and optimize order fulfillment. Learn how in this webinar presented by Dito.

  • 2
  • 2
  • 2
Tackle projects and never again get stuck behind a technical roadblock.
Join Now