FTP + Powershell
Autor: Eduardo Spaki | Publicado: 2011-11-16T15:30:00-02:00

Bem, como já relatado em outros posts, é possível utilizar classes do .NET Framework no Powershell. Com isso em mente, podemos utilizar uma simples requisição com um WebRequest para estabelecer conexão com um servidor FTP.  Vejamos esse exemplo de como copiar um diretório (seus arquivos e subpastas) para um servidor FTP (mantendo a mesma estrutura).     function DoLogFTP($tamanhoBytes, $fullName)       {        &#160;&#160;&#160; if($tamanhoBytes -eq $null)        &#160;&#160;&#160; {        &#160;&#160;&#160;&#160;&#160;&#160;&#160; return;        &#160;&#160;&#160; }    &#160;&#160;&#160; $tamanho = $tamanhoBytes/1024;       &#160;&#160;&#160; $unidade = &quot;KB&quot;;        &#160;&#160;&#160; &#160;&#160;&#160; if($tamanho -ge 1024.0)        &#160;&#160;&#160; {        &#160;&#160;&#160;&#160;&#160;&#160;&#160; $tamanho = $tamanho/1024;        &#160;&#160;&#160;&#160;&#160;&#160;&#160; $unidade = &quot;MB&quot;;        &#160;&#160;&#160; }        &#160;&#160;&#160; &#160;&#160;&#160; $mensagem = [string]::Format(&quot;FTP: copiando ({0:0.00} {1}) '{2}' ... &quot;, $tamanho, $unidade, $fullName);    &#160;&#160;&#160; Write-Host $mensagem;       }    function InstanciarFTPClient([string] $enderecoFTP, [string] $ftpUser, [string] $ftpPassword)       {        &#160;&#160;&#160; $ftp = [System.Net.WebRequest]::Create($enderecoFTP);&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160; $ftp.Credentials = New-Object System.Net.NetworkCredential($ftpUser, $ftpPassword);         &#160;&#160;&#160; &#160;&#160;&#160; return $ftp;        }    function CriarDiretorioFTP([string] $enderecoFTP, [string] $ftpUser, [string] $ftpPassword, [string] $nomeDoDiretorio)       {        &#160;&#160;&#160; $ftp = InstanciarFTPClient ($enderecoFTP+$nomeDoDiretorio) $ftpUser $ftpPassword;        &#160;&#160;&#160; $ftp.Method = [System.Net.WebRequestMethods+FTP]::MakeDirectory;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160; $ftp.GetResponse();        }    function EnviarDiretorioViaFTP([string] $diretorioOrigem, [string] $enderecoFTP, [string] $ftpUser, [string] $ftpPassword)       {        &#160;&#160;&#160; # -&gt; Define um nome do diretório que será criado no servidor FTP.        &#160;&#160;&#160; $nomeDoDiretorio = $diretorioOrigem.Substring($diretorioOrigem.LastIndexOf('\') + 1, $diretorioOrigem.Length - $diretorioOrigem.LastIndexOf('\') - 1) #(Get-Item $diretorioOrigem).Name; #(New-Object System.IO.DirectoryInfo $diretorioOrigem).Name;        &#160;&#160;&#160; $nomeDoDiretorio += (Get-Date).ToString(&quot; - dd-MM-yyyy - HH-mm-ss&quot;);        &#160;&#160;&#160; $global:diretorioCriadoNoServidor = $nomeDoDiretorio;        &#160;&#160;&#160; &#160;&#160;&#160; CriarDiretorioFTP $enderecoFTP $ftpUser $ftpPassword $nomeDoDiretorio;    &#160;&#160;&#160; $diretorioFTP += $enderecoFTP + $nomeDoDiretorio + &quot;/&quot;;       &#160;&#160;&#160; $itensDoDiretorio = Get-ChildItem $diretorioOrigem -recurse;    &#160;&#160;&#160; foreach($item in $itensDoDiretorio)       &#160;&#160;&#160; {        &#160;&#160;&#160;&#160;&#160;&#160;&#160; $nomeItem = [System.IO.Path]::GetFullPath($item.FullName).SubString($diretorioOrigem.Length + 1);        &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160; DoLogFTP $item.Length $item.FullName;        &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; if ($item.Attributes -eq &quot;Directory&quot;)        &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; {        &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; CriarDiretorioFTP $diretorioFTP $ftpUser $ftpPassword $nomeItem;         &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; continue;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; }        &#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160; $ftp = InstanciarFTPClient ($diretorioFTP+$nomeItem) $ftpUser $ftpPassword;        &#160;&#160;&#160;&#160;&#160;&#160;&#160; $ftp.Method = [System.Net.WebRequestMethods+FTP]::UploadFile        &#160;&#160;&#160;&#160;&#160;&#160;&#160; $ftp.KeepAlive = $false;        &#160;&#160;&#160;&#160;&#160;&#160;&#160; $ftp.UseBinary = $true ;        &#160;&#160;&#160;&#160;&#160;&#160;&#160; $ftp.UsePassive = $false;        &#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160; $responseStream = $ftp.GetRequestStream();&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; $bytesFile = [System.IO.File]::ReadAllBytes($item.FullName);        &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160; $responseStream.Write($bytesFile, 0, $bytesFile.Length);        &#160;&#160;&#160;&#160;&#160;&#160;&#160; $responseStream.Close();        &#160;&#160;&#160;&#160;&#160;&#160;&#160; $responseStream.Dispose();        &#160;&#160;&#160; }        }           Espero que tenham gostado da dica!