<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en-GB">
	<id>http://vwiki.co.uk/index.php?action=history&amp;feed=atom&amp;title=FTP_%28PowerShell%29</id>
	<title>FTP (PowerShell) - Revision history</title>
	<link rel="self" type="application/atom+xml" href="http://vwiki.co.uk/index.php?action=history&amp;feed=atom&amp;title=FTP_%28PowerShell%29"/>
	<link rel="alternate" type="text/html" href="http://vwiki.co.uk/index.php?title=FTP_(PowerShell)&amp;action=history"/>
	<updated>2026-04-06T08:55:15Z</updated>
	<subtitle>Revision history for this page on the wiki</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>http://vwiki.co.uk/index.php?title=FTP_(PowerShell)&amp;diff=1826&amp;oldid=prev</id>
		<title>Sstrutt: Initial creation - content from PowerShell Examples page</title>
		<link rel="alternate" type="text/html" href="http://vwiki.co.uk/index.php?title=FTP_(PowerShell)&amp;diff=1826&amp;oldid=prev"/>
		<updated>2012-04-18T13:30:15Z</updated>

		<summary type="html">&lt;p&gt;Initial creation - content from PowerShell Examples page&lt;/p&gt;
&lt;p&gt;&lt;b&gt;New page&lt;/b&gt;&lt;/p&gt;&lt;div&gt;= Operations =&lt;br /&gt;
Bear in mind that different FTP servers will respond in differing ways - see [[#Gotchas|Gotchas]]&lt;br /&gt;
== Directory Listing ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
$site = &amp;quot;ftp://ftp-srv/logfiles&amp;quot;&lt;br /&gt;
$user = &amp;quot;Anonymous&amp;quot;&lt;br /&gt;
$pass = &amp;quot;Hello&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Write-Host &amp;quot;Get FTP site dir listing...&amp;quot; -nonewline&lt;br /&gt;
&lt;br /&gt;
# Do directory listing&lt;br /&gt;
$FTPreq = [System.Net.FtpWebRequest]::Create($site)&lt;br /&gt;
$FTPreq.Timeout = 30000                             # msec (default is infinite)&lt;br /&gt;
$FTPreq.ReadWriteTimeout = 10000                    # msec (default is 300,000 - 5 mins)&lt;br /&gt;
$FTPreq.KeepAlive = $false                          # (default is enabled)&lt;br /&gt;
$FTPreq.Credentials = New-Object System.Net.NetworkCredential($user,$pass)&lt;br /&gt;
$FTPreq.Method = [System.Net.WebRequestMethods+FTP]::ListDirectory&lt;br /&gt;
&lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
    $FTPres = $FTPreq.GetResponse()&lt;br /&gt;
}&lt;br /&gt;
catch&lt;br /&gt;
{&lt;br /&gt;
   Write-Host &amp;quot;FAILED: $_&amp;quot;&lt;br /&gt;
   Exit&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
Write-Host $FTPres.StatusCode -nonewline&lt;br /&gt;
Write-Host $FTPres.StatusDescription &lt;br /&gt;
&lt;br /&gt;
$list = Receive-Stream $FTPres.GetResponseStream()&lt;br /&gt;
$FTPres.Close()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Get ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;powershell&amp;quot;&amp;gt;&lt;br /&gt;
$site = &amp;quot;ftp://ftp-srv/logfiles&amp;quot;&lt;br /&gt;
$file = &amp;quot;activity1.log&amp;quot;&lt;br /&gt;
$user = &amp;quot;Anonymous&amp;quot;&lt;br /&gt;
$pass = &amp;quot;Hello&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Write-Host &amp;quot;Download $file &amp;quot; -nonewline&lt;br /&gt;
    &lt;br /&gt;
$FTPreq = [System.Net.FtpWebRequest]::Create(&amp;quot;$site\$file&amp;quot;)&lt;br /&gt;
$FTPreq.Timeout = 15000                             # msec (defult is infinite)&lt;br /&gt;
$FTPreq.ReadWriteTimeout = 10000                    # msec (defult is 300,000 - 5 mins)&lt;br /&gt;
$FTPreq.KeepAlive = $false                          # (default is enabled)&lt;br /&gt;
$FTPreq.Credentials = New-Object System.Net.NetworkCredential($user,$pass)&lt;br /&gt;
$FTPreq.UseBinary = $true &lt;br /&gt;
$FTPreq.Method = [System.Net.WebRequestMethods+FTP]::DownloadFile&lt;br /&gt;
    &lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
    $FTPres = $FTPreq.GetResponse()&lt;br /&gt;
}&lt;br /&gt;
catch&lt;br /&gt;
{&lt;br /&gt;
   Write-Host &amp;quot;FAILED: $_&amp;quot;&lt;br /&gt;
   Exit&lt;br /&gt;
}&lt;br /&gt;
$dest = &amp;quot;$DestDir\$file&amp;quot;&lt;br /&gt;
    &lt;br /&gt;
Write-Host $FTPres.StatusDescription &amp;quot;Write to $DestDir\$file&amp;quot;&lt;br /&gt;
$FTPstream = $FTPres.GetResponseStream()&lt;br /&gt;
try&lt;br /&gt;
{&lt;br /&gt;
    $dest = New-Object IO.FileStream (&amp;quot;$DestDir\$file&amp;quot;,[IO.FileMode]::Create)&lt;br /&gt;
}&lt;br /&gt;
catch&lt;br /&gt;
    Write-Host &amp;quot;FAILED: $_&amp;quot;&lt;br /&gt;
    $FTPstream.Close()&lt;br /&gt;
    $FTPres.Close()&lt;br /&gt;
    Exit&lt;br /&gt;
}&lt;br /&gt;
        &lt;br /&gt;
[byte[]]$buffer = New-Object byte[] 1024&lt;br /&gt;
$read = 0&lt;br /&gt;
do&lt;br /&gt;
{&lt;br /&gt;
    $read=$FTPstream.Read($buffer,0,1024)&lt;br /&gt;
    $dest.Write($buffer,0,$read)&lt;br /&gt;
}&lt;br /&gt;
while ($read -ne 0)&lt;br /&gt;
{&lt;br /&gt;
    $dest.Close()&lt;br /&gt;
}&lt;br /&gt;
$FTPstream.Close()&lt;br /&gt;
$FTPres.Close()&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Gotchas =&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;KeepAlive&amp;#039;s&amp;#039;&amp;#039;&amp;#039; - Its generally safer to disable keep alives, this causes the FTP session to be dropped after each request.  This is less efficient, but leads to more reliable results.  If requests don&amp;#039;t get completed properly the .NET API gets into a stuck state whereby new FTP requests appear to time-out (though no request actually goes to the FTP server.&lt;br /&gt;
* &amp;#039;&amp;#039;&amp;#039;Inconsistent Results&amp;#039;&amp;#039;&amp;#039; - Results from IIS and non-IIS FTP servers can look different, for example a directory listing on an IIS FTP server results in a basic/raw text result, where as from a non-IIS FTP server this results in HTML rendered text&lt;br /&gt;
&lt;br /&gt;
= Further Reading =&lt;br /&gt;
* [http://msdn.microsoft.com/en-us/library/system.net.ftpwebrequest.aspx MSDN FtpWebRequest Class]&lt;br /&gt;
* Examples I&amp;#039;ve worked from&lt;br /&gt;
** http://rcovelo.blogspot.com/2008/10/powershell-very-simple-ftp-client.html&lt;br /&gt;
** http://stackoverflow.com/questions/265339/whats-the-best-way-to-automate-secure-ftp-in-powershell&lt;br /&gt;
** http://powershell.com/cs/media/p/804.aspx&lt;br /&gt;
&lt;br /&gt;
[[Category:PowerShell]]&lt;br /&gt;
[[Category:FTP]]&lt;/div&gt;</summary>
		<author><name>Sstrutt</name></author>
	</entry>
</feed>