Question Upload FTP
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
Réduire
Plus d'informations
- Messages : 226
- Remerciements reçus 0
il y a 13 ans 5 mois #9493
par Arthur
Upload FTP a été créé par Arthur
Bonjour,
Suite à un post d'un utilisateur(powershell-scripting.com/index.php?optio...;id=9180&catid=5), j'ai amélioré un script personnel pour upload des fichier vers un FTP.
Tout est expliqué dans le Man.
Voilà enjoy.
[code:1] <#
.SYNOPSIS
Upload Files to FTP
.DESCRIPTION
Enable user to upload multiple files to an FTP server
Parameters:
-Username: [String] FTP username
-Password: [String] FTP password
-Sourceuri: [String] FTP directory address
-Paths: [String[]] File Path
-UsePassive: [Switch] Use Passive Mode (by default: Active Mode)
Last Updated: 26/04/2011
Tested with: Windows 7 32bit and FileZilla Server 0.9.37 Beta
.EXAMPLE
Send-FTP -Username TestUser -Password TestPass -Sourceuri ftp://myftp.mycompany.com -Paths .\TestFile.bin
Get-ChildItem \"*.jpg\" | foreach{ $_.ToString() } | Send-FTP -Username TestUser -Password TestPass -Sourceuri ftp://myftp.mycompany.com/
#>
Function Send-FTP
{
#PARAM
param(
[string]$Username = \"\",
[string]$Password = \"\",
[Parameter(Mandatory=$true,HelpMessage=\"Enter a valid sourceuri, ex: \"\"ftp://localhost/\"\"\"«»)][string]$Sourceuri = \"\",
[Parameter(Mandatory=$true,ValueFromPipeline=$true,HelpMessage=\"Enter a valid file path, ex: \"\"D:\myDir\myFile.ps1\"\"\"«»)][string[]]$Paths = \"\",
[switch]$UsePassive
)
#Initialization
BEGIN {
$ErrorActionPreference = \"Stop\"
#Add \"/\" at the end of the Uri if user hasn't typed it.
if(!$Sourceuri.EndsWith(\"/\"«»))
{
$Sourceuri = $Sourceuri + \"/\"
}
#Tells User if using \"Passive\" or \"Active Mode\".
if($UsePassive)
{
Write-Host \"Using Passive mode for upload...\" -ForegroundColor Green
}
else
{
Write-Host \"Using Active mode for upload...\" -ForegroundColor Green
}
}
#PROCESS
PROCESS
{
foreach($Path in $Paths)
{
try
{
#Format Uri
$Uri = $Sourceuri + ($Path | Split-Path -Leaf)
}
catch
{
Write-Host \"`nError when Error while formating Uri.\" -BackgroundColor Black -ForegroundColor Yellow
Throw
}
Write-Host \"Uploading file \"\"$Path\"\" to \"\"$Uri\"\"\" -ForegroundColor Green
try
{
#Initialize FTP connection, Credentials, Uri, Active/Passive Mode.
[System.Net.FtpWebRequest]$Request = [System.Net.FtpWebRequest]::create($Uri)
$Request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$Request.Credentials = New-Object System.Net.NetworkCredential($Username,$Password)
$Request.UsePassive = $UsePassive
$Request.UseBinary = $true
$Request.KeepAlive = $false
}
catch
{
Write-Host \"`nError when creating FTP Web Request to: $Uri\" -BackgroundColor Black -ForegroundColor Yellow
Throw
}
try
{
#Retreives local file into a buffer.
$Path = $Path| Resolve-Path
[System.IO.FileStream]$Stream = [System.IO.File]::OpenRead($Path)
[byte[]]$Buffer = New-Object byte[] $Stream.Length
$Stream.Read($Buffer, 0, $Buffer.Length) >$null
$Stream.Close()
}
catch
{
Write-Host \"`nAn Error occured while retrieving file from: $Path\" -BackgroundColor Black -ForegroundColor Yellow
Throw
}
try
{
#FILE TRANFER: Sends local file to FTP
[System.IO.Stream]$Request = $Request.GetRequestStream()
$Request.Write($Buffer, 0, $Buffer.Length)
$Request.Close()
}
catch
{
Write-Host \"`nAn Error occured while uploading file to: $Uri\" -BackgroundColor Black -ForegroundColor Yellow
Throw
}
}
}
#END
END
{
Write-Host (\"`nUploaded files Successfully\"«») -ForegroundColor Green
}
}
[/code:1]<br><br>Message édité par: bilbao, à: 26/04/11 21:16
Suite à un post d'un utilisateur(powershell-scripting.com/index.php?optio...;id=9180&catid=5), j'ai amélioré un script personnel pour upload des fichier vers un FTP.
Tout est expliqué dans le Man.
Voilà enjoy.
[code:1] <#
.SYNOPSIS
Upload Files to FTP
.DESCRIPTION
Enable user to upload multiple files to an FTP server
Parameters:
-Username: [String] FTP username
-Password: [String] FTP password
-Sourceuri: [String] FTP directory address
-Paths: [String[]] File Path
-UsePassive: [Switch] Use Passive Mode (by default: Active Mode)
Last Updated: 26/04/2011
Tested with: Windows 7 32bit and FileZilla Server 0.9.37 Beta
.EXAMPLE
Send-FTP -Username TestUser -Password TestPass -Sourceuri ftp://myftp.mycompany.com -Paths .\TestFile.bin
Get-ChildItem \"*.jpg\" | foreach{ $_.ToString() } | Send-FTP -Username TestUser -Password TestPass -Sourceuri ftp://myftp.mycompany.com/
#>
Function Send-FTP
{
#PARAM
param(
[string]$Username = \"\",
[string]$Password = \"\",
[Parameter(Mandatory=$true,HelpMessage=\"Enter a valid sourceuri, ex: \"\"ftp://localhost/\"\"\"«»)][string]$Sourceuri = \"\",
[Parameter(Mandatory=$true,ValueFromPipeline=$true,HelpMessage=\"Enter a valid file path, ex: \"\"D:\myDir\myFile.ps1\"\"\"«»)][string[]]$Paths = \"\",
[switch]$UsePassive
)
#Initialization
BEGIN {
$ErrorActionPreference = \"Stop\"
#Add \"/\" at the end of the Uri if user hasn't typed it.
if(!$Sourceuri.EndsWith(\"/\"«»))
{
$Sourceuri = $Sourceuri + \"/\"
}
#Tells User if using \"Passive\" or \"Active Mode\".
if($UsePassive)
{
Write-Host \"Using Passive mode for upload...\" -ForegroundColor Green
}
else
{
Write-Host \"Using Active mode for upload...\" -ForegroundColor Green
}
}
#PROCESS
PROCESS
{
foreach($Path in $Paths)
{
try
{
#Format Uri
$Uri = $Sourceuri + ($Path | Split-Path -Leaf)
}
catch
{
Write-Host \"`nError when Error while formating Uri.\" -BackgroundColor Black -ForegroundColor Yellow
Throw
}
Write-Host \"Uploading file \"\"$Path\"\" to \"\"$Uri\"\"\" -ForegroundColor Green
try
{
#Initialize FTP connection, Credentials, Uri, Active/Passive Mode.
[System.Net.FtpWebRequest]$Request = [System.Net.FtpWebRequest]::create($Uri)
$Request.Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
$Request.Credentials = New-Object System.Net.NetworkCredential($Username,$Password)
$Request.UsePassive = $UsePassive
$Request.UseBinary = $true
$Request.KeepAlive = $false
}
catch
{
Write-Host \"`nError when creating FTP Web Request to: $Uri\" -BackgroundColor Black -ForegroundColor Yellow
Throw
}
try
{
#Retreives local file into a buffer.
$Path = $Path| Resolve-Path
[System.IO.FileStream]$Stream = [System.IO.File]::OpenRead($Path)
[byte[]]$Buffer = New-Object byte[] $Stream.Length
$Stream.Read($Buffer, 0, $Buffer.Length) >$null
$Stream.Close()
}
catch
{
Write-Host \"`nAn Error occured while retrieving file from: $Path\" -BackgroundColor Black -ForegroundColor Yellow
Throw
}
try
{
#FILE TRANFER: Sends local file to FTP
[System.IO.Stream]$Request = $Request.GetRequestStream()
$Request.Write($Buffer, 0, $Buffer.Length)
$Request.Close()
}
catch
{
Write-Host \"`nAn Error occured while uploading file to: $Uri\" -BackgroundColor Black -ForegroundColor Yellow
Throw
}
}
}
#END
END
{
Write-Host (\"`nUploaded files Successfully\"«») -ForegroundColor Green
}
}
[/code:1]<br><br>Message édité par: bilbao, à: 26/04/11 21:16
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 13 ans 5 mois #9511
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Upload FTP
Salut,
qq remarques et propositions d'améliorations :
[code:1]
#Pour le switch $UsePassive le coupler avec verbose, ou write-verbose au lieu de write-host
# Bien que l'appel de la fonction soit plus 'parlant'.
$Sourceuri[-1] -eq (\"/\"«»)
#+ Concis
$Sourceuri += \"/\"
#Dans ce cas j'ai une préférence pour +(Split-Path $Path -Leaf)
($Path | Split-Path -Leaf)
#Je n'ai pas compris la construction suivante,
#tout comme le choix des couleurs pour spécifier une erreur.
# Cela n'est pas cohérent avec les standards d'affichage de PS, mais personne ne nous oblige
# à les respecter ...
catch
{
Write-Host \"`nError when Error while formating Uri.\" -BackgroundColor Black -ForegroundColor Yellow
Throw
}
#si tu écris un wrapper, peut-être le passer en paramètre de type switch,
# enfin si le reste du code n'est pas impacté.
$Request.UseBinary = $true
#Le cast est redondant, voir la doc sur MSDN
$Stream = [System.IO.File]::OpenRead($Path)
#D'après un post de l'équipe de dev, la construction suivante est + performante.
#Bien que je préféres [void], et là je ne pas si cela l'est encore...
$null=$Stream.Read($Buffer, 0, $Buffer.Length)
# $Stream.Close(), le truc qui fâche
#Si tu utilises un bloc try catch, place cet appel dans la clause finally
# en testant auparavant si l'objet n'est pas null.
finally {
if ( $Stream -ne $null)
{$Stream.Close()}
}
#idem pour $Request.Close()
#rebelote sur le dernier catch/throw
#Dans le bloc End, il n'est pas par certains que cela soit tjr le cas,
#il peut ne pas l'être ou partiellement,
#voir l'exemple d'un gestion d'erreur par Robocopy.
#Ca marche pas, un peu, pas beaucoup, presque, tout à fait ...
#MS a inventé le Robocopy-Marguerite
END
{
Write-Host (\"`nUploaded files Successfully\"«») -ForegroundColor Green
}
#Du coup tes appels à Throw dans le bloc Process devrait être remplacés
#par des appels 'complet' à Write-Error, voir la fonction String-Replace
#dans le forum contribution.
#Et enfin pour finir
#La gestion des bloc catch doit se faire, tant que faire se peut, sur des exceptions précises.
#Si tu as une exception OutOfMemory, ton message est un peu l'ouest du framework !
# Mais je te l'accorde, ce n'est pas le plus facile à faire.
[/code:1]
Il reste le bloc Param qui pourrait être amélioré il me semble, mais cela nécessite un peu plus de temps.
Tu tiens le bon bout <br><br>Message édité par: Laurent Dardenne, à: 28/04/11 21:16
qq remarques et propositions d'améliorations :
[code:1]
#Pour le switch $UsePassive le coupler avec verbose, ou write-verbose au lieu de write-host
# Bien que l'appel de la fonction soit plus 'parlant'.
$Sourceuri[-1] -eq (\"/\"«»)
#+ Concis
$Sourceuri += \"/\"
#Dans ce cas j'ai une préférence pour +(Split-Path $Path -Leaf)
($Path | Split-Path -Leaf)
#Je n'ai pas compris la construction suivante,
#tout comme le choix des couleurs pour spécifier une erreur.
# Cela n'est pas cohérent avec les standards d'affichage de PS, mais personne ne nous oblige
# à les respecter ...
catch
{
Write-Host \"`nError when Error while formating Uri.\" -BackgroundColor Black -ForegroundColor Yellow
Throw
}
#si tu écris un wrapper, peut-être le passer en paramètre de type switch,
# enfin si le reste du code n'est pas impacté.
$Request.UseBinary = $true
#Le cast est redondant, voir la doc sur MSDN
$Stream = [System.IO.File]::OpenRead($Path)
#D'après un post de l'équipe de dev, la construction suivante est + performante.
#Bien que je préféres [void], et là je ne pas si cela l'est encore...
$null=$Stream.Read($Buffer, 0, $Buffer.Length)
# $Stream.Close(), le truc qui fâche
#Si tu utilises un bloc try catch, place cet appel dans la clause finally
# en testant auparavant si l'objet n'est pas null.
finally {
if ( $Stream -ne $null)
{$Stream.Close()}
}
#idem pour $Request.Close()
#rebelote sur le dernier catch/throw
#Dans le bloc End, il n'est pas par certains que cela soit tjr le cas,
#il peut ne pas l'être ou partiellement,
#voir l'exemple d'un gestion d'erreur par Robocopy.
#Ca marche pas, un peu, pas beaucoup, presque, tout à fait ...
#MS a inventé le Robocopy-Marguerite
END
{
Write-Host (\"`nUploaded files Successfully\"«») -ForegroundColor Green
}
#Du coup tes appels à Throw dans le bloc Process devrait être remplacés
#par des appels 'complet' à Write-Error, voir la fonction String-Replace
#dans le forum contribution.
#Et enfin pour finir
#La gestion des bloc catch doit se faire, tant que faire se peut, sur des exceptions précises.
#Si tu as une exception OutOfMemory, ton message est un peu l'ouest du framework !
# Mais je te l'accorde, ce n'est pas le plus facile à faire.
[/code:1]
Il reste le bloc Param qui pourrait être amélioré il me semble, mais cela nécessite un peu plus de temps.
Tu tiens le bon bout <br><br>Message édité par: Laurent Dardenne, à: 28/04/11 21:16
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
Réduire
Plus d'informations
- Messages : 226
- Remerciements reçus 0
il y a 13 ans 5 mois #9513
par Arthur
Réponse de Arthur sur le sujet Re:Upload FTP
Merci pour les précisions, je vais corriger tout ça dans les prochains jours.
Concernant la gestion des erreurs, je suis un peu fâché avec les try/catch sur Powershell.
Je code aussi pas mal en C++/C# et la façon dont Powershell gère les exceptions me trouble.
Par exemple il est parfois difficile de savoir quel exception Powershell va capturer avec try/catch.
Il arrive que l’exception à préciser dans le catch soit différente de celle donné sur le MSDN.
Et par flemme de les chercher(oui j’avoue.), je ne les précisent pas tout le temps.
De plus pour éviter de créer plein d'erreurs à la chaine j'utilise,
[code:1]$ErrorActionPreference = \"Stop\"
[/code:1]
Et \"Throw\", ce qui stop l’exécution du script dès la première erreur, mais je vais revoir cette partie, car si le script n'arrive pas à upload un fichier pour une raison x ou y, il s’arrête ce qui n'est pas vraiment pratique quand on upload plusieurs fichiers.
[code:1]
# Cela n'est pas cohérent avec les standards d'affichage de PS, mais personne ne nous oblige
# à les respecter ...[/code:1]
Tu touche un point sensible là.
Je n'ai pas trouvé de documentation précise et complète sur la gestion des exceptions en powershell, seulement des morceaux éparpillés sur le web...
Cependant il me semble que dans le livre il y a un chapitre dessus mais ça fais des mois que je n'ai pas pu accéder à mon livre(Je suis à l'étranger depuis plusieurs mois), et comme un c... j'ai oublié de prendre la version \"online\" offerte avec le livre.
Concernant la gestion des erreurs, je suis un peu fâché avec les try/catch sur Powershell.
Je code aussi pas mal en C++/C# et la façon dont Powershell gère les exceptions me trouble.
Par exemple il est parfois difficile de savoir quel exception Powershell va capturer avec try/catch.
Il arrive que l’exception à préciser dans le catch soit différente de celle donné sur le MSDN.
Et par flemme de les chercher(oui j’avoue.), je ne les précisent pas tout le temps.
De plus pour éviter de créer plein d'erreurs à la chaine j'utilise,
[code:1]$ErrorActionPreference = \"Stop\"
[/code:1]
Et \"Throw\", ce qui stop l’exécution du script dès la première erreur, mais je vais revoir cette partie, car si le script n'arrive pas à upload un fichier pour une raison x ou y, il s’arrête ce qui n'est pas vraiment pratique quand on upload plusieurs fichiers.
[code:1]
# Cela n'est pas cohérent avec les standards d'affichage de PS, mais personne ne nous oblige
# à les respecter ...[/code:1]
Tu touche un point sensible là.
Je n'ai pas trouvé de documentation précise et complète sur la gestion des exceptions en powershell, seulement des morceaux éparpillés sur le web...
Cependant il me semble que dans le livre il y a un chapitre dessus mais ça fais des mois que je n'ai pas pu accéder à mon livre(Je suis à l'étranger depuis plusieurs mois), et comme un c... j'ai oublié de prendre la version \"online\" offerte avec le livre.
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
Réduire
Plus d'informations
- Messages : 6302
- Remerciements reçus 68
il y a 13 ans 5 mois #9518
par Laurent Dardenne
Tutoriels PowerShell
Réponse de Laurent Dardenne sur le sujet Re:Upload FTP
bilbao écrit:
Ensuite il faut que tout le code utilisé considère ses propres cas d'erreurs, sinon ils sont propagés.
Ce qui peut être intentionnel, d'où la doc
bilbao écrit:
Dans cette optique j'avais codé cet outil , mais je devrais lui donner une forme + pratique...
bilbao écrit:
De mon côtè je m'efforce d'aborder, quelque soit le langage, de la même manière la gestion d'erreur.
bilbao écrit:
[code:1]
$Host.PrivateData
#Valeurs par défaut
# ErrorForegroundColor : Red
# ErrorBackgroundColor : Black
# WarningForegroundColor : Yellow
# WarningBackgroundColor : Black
# DebugForegroundColor : Yellow
# DebugBackgroundColor : Black
# VerboseForegroundColor : Yellow
# VerboseBackgroundColor : Black
# ProgressForegroundColor : Yellow
# ProgressBackgroundColor : DarkCyan
[/code:1]
Oui quelques fois, mais justement le bloc catch sans type d'exception est là pour les trapper et permettre de corriger le code.Par exemple il est parfois difficile de savoir quel exception Powershell va capturer avec try/catch.
Ensuite il faut que tout le code utilisé considère ses propres cas d'erreurs, sinon ils sont propagés.
Ce qui peut être intentionnel, d'où la doc
bilbao écrit:
Idem, pour des scripts sans \"importance\" ou de tests.Et par flemme de les chercher(oui j’avoue.), je ne les précisent pas tout le temps.
Dans cette optique j'avais codé cet outil , mais je devrais lui donner une forme + pratique...
bilbao écrit:
C'est une manière de faire qui se défend !De plus pour éviter de créer plein d'erreurs à la chaine j'utilise,
[code:1]$ErrorActionPreference = \"Stop\"
[/code:1]
De mon côtè je m'efforce d'aborder, quelque soit le langage, de la même manière la gestion d'erreur.
bilbao écrit:
Tu peux déjà utiliser ceci :Je n'ai pas trouvé de documentation précise et complète sur la gestion des exceptions en powershell, seulement des morceaux éparpillés sur le web...
[code:1]
$Host.PrivateData
#Valeurs par défaut
# ErrorForegroundColor : Red
# ErrorBackgroundColor : Black
# WarningForegroundColor : Yellow
# WarningBackgroundColor : Black
# DebugForegroundColor : Yellow
# DebugBackgroundColor : Black
# VerboseForegroundColor : Yellow
# VerboseBackgroundColor : Black
# ProgressForegroundColor : Yellow
# ProgressBackgroundColor : DarkCyan
[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.111 secondes
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Contributions à la communauté
- Upload FTP