Solved

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

Posted on 2013-01-13
6
848 Views
Last Modified: 2013-01-27
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
Comment
Question by:sunhux
  • 2
  • 2
  • 2
6 Comments
 
LVL 77

Assisted Solution

by:arnold
arnold earned 120 total points
ID: 38772690
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
 
LVL 79

Accepted Solution

by:
David Johnson, CD, MVP earned 380 total points
ID: 38773341
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
 

Author Comment

by:sunhux
ID: 38774641
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
3 Use Cases for Connected Systems

Our Dev teams are like yours. They’re continually cranking out code for new features/bugs fixes, testing, deploying, testing some more, responding to production monitoring events and more. It’s complex. So, we thought you’d like to see what’s working for us.

 

Author Comment

by:sunhux
ID: 38774784
Btw, how do I execute the Powershell script?

Can it do the equivalent of ftp 'mget' ?
0
 
LVL 77

Expert Comment

by:arnold
ID: 38775089
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
 
LVL 79

Assisted Solution

by:David Johnson, CD, MVP
David Johnson, CD, MVP earned 380 total points
ID: 38776570
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Use this article to create a batch file to backup a Microsoft SQL Server database to a Windows folder.  The folder can be on the local hard drive or on a network share.  This batch file will query the SQL server to get the current date & time and wi…
Active Directory replication delay is the cause to many problems.  Here is a super easy script to force Active Directory replication to all sites with by using an elevated PowerShell command prompt, and a tool to verify your changes.
In this fourth video of the Xpdf series, we discuss and demonstrate the PDFinfo utility, which retrieves the contents of a PDF's Info Dictionary, as well as some other information, including the page count. We show how to isolate the page count in a…
With the advent of Windows 10, Microsoft is pushing a Get Windows 10 icon into the notification area (system tray) of qualifying computers. There are many reasons for wanting to remove this icon. This two-part Experts Exchange video Micro Tutorial s…

867 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

17 Experts available now in Live!

Get 1:1 Help Now