Question
PowerShell et FTP
- Pierre
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 11
- Remerciements reçus 0
Session ENI services Nantes fin février (motomag )Peux tu me donner un indice pour que je puisse t'identifier ?
Sinon pour le ftp.exe, ca ne me dérange pas de l'utiliser, mais comme j'ai vu que c'était faisable en PS .
En plus le mécanisme utilisé dans les codes 100% PS trouvés pour le moment sur internet font appel à un mécanisme de création de requête que j'aimerais bien comprendre
Connexion ou Créer un compte pour participer à la conversation.
- Pierre
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 11
- Remerciements reçus 0
après m'être arraché quasiment tous les cheveux j'ai trouvé ... le compte de test FTP que j'utilise depuis le début n'avait pas le droit d'écriture ...J'ai essayé le code de Bilbao mais j'ai une erreur sur '$request.GetRequestStream' : l'URI n'est pas reconnu par le serveur FTP (ce qui me semble normal puisque le fichier PDF n'est pas présent sur la destination, donc la construction du chemin 'ftp+nom fichier' donne un chemin qui n'existe pas )
J'ai la même erreur avec le code présent ici dans 'UPLOAD'.
...
Moralité : l'erreur est souvent juste trop évidente pour nous sauter aux yeux
Je mets tout ca en forme et vous post le code si ca intéresse ?
Connexion ou Créer un compte pour participer à la conversation.
- Pierre
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 11
- Remerciements reçus 0
[code:1]
# Définition des paramètres
#
param([string]$ParamFile, [string]$LogFile)
# Récupération des paramètres de/des BU à traiter
#
$BuParam = Import-Csv $ParamFile
foreach($BuParam.Unit in $BuParam){
$CmdFile = $BuParam.Unit + '.ftpcmd' # Fichier de commandes FTP
Write-Output \"user $($BuParam.Login) $($BuParam.Password)`nlcd `\"$($BuParam.InFolder)`\"`nprompt`nmput $($BuParam.Unit)-*`nquit\" | Out-File .\$CmdFile -encoding Default
ftp.exe -n -s:$CmdFile $BuParam.FtpServer >> \"$LogFile\" # Execution de ftp.exe avec le fichier de commandes créé à l'étape précédente
}
[/code:1]
Connexion ou Créer un compte pour participer à la conversation.
- Pierre
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 11
- Remerciements reçus 0
[code:1]Exception lors de l'appel de « Create » avec « 1 » argument(s) : « URI non valide : Impossible de déterminer le format
de l'URI. »
Au niveau de F:\Scripts Powershell\SendFtp.ps1 : 26 Caractère : 72
+ [System.Net.FtpWebRequest]$request = [System.Net.FtpWebRequest]::create <<<< ($sourceuri)
+ CategoryInfo : NotSpecified: (:«») [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
La propriété « Method » est introuvable sur cet objet ; assurez-vous qu'elle existe et qu'elle peut être définie.
Au niveau de F:\Scripts Powershell\SendFtp.ps1 : 27 Caractère : 10
+ $request. <<<< Method = [System.Net.WebRequestMethods+Ftp]::UploadFile
+ CategoryInfo : InvalidOperation: (Method:«»String) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFound
La propriété « Credentials » est introuvable sur cet objet ; assurez-vous qu'elle existe et qu'elle peut être définie.
Au niveau de F:\Scripts Powershell\SendFtp.ps1 : 28 Caractère : 10
+ $request. <<<< Credentials = New-Object System.Net.NetworkCredential($username,$password)
+ CategoryInfo : InvalidOperation: (Credentials:«»String) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFound
La propriété « UsePassive » est introuvable sur cet objet ; assurez-vous qu'elle existe et qu'elle peut être définie.
Au niveau de F:\Scripts Powershell\SendFtp.ps1 : 29 Caractère : 10
+ $request. <<<< UsePassive = $true
+ CategoryInfo : InvalidOperation: (UsePassive:«»String) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFound
La propriété « UseBinary » est introuvable sur cet objet ; assurez-vous qu'elle existe et qu'elle peut être définie.
Au niveau de F:\Scripts Powershell\SendFtp.ps1 : 30 Caractère : 10
+ $request. <<<< UseBinary = $true
+ CategoryInfo : InvalidOperation: (UseBinary:«»String) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFound
La propriété « KeepAlive » est introuvable sur cet objet ; assurez-vous qu'elle existe et qu'elle peut être définie.
Au niveau de F:\Scripts Powershell\SendFtp.ps1 : 31 Caractère : 10
+ $request. <<<< KeepAlive = $false
+ CategoryInfo : InvalidOperation: (KeepAlive:«»String) [], RuntimeException
+ FullyQualifiedErrorId : PropertyNotFound
Exception lors de l'appel de « OpenRead » avec « 1 » argument(s) : « Impossible de trouver une partie du chemin d'accès
'C:\Windows\system32\test\016-09300219.pdf'. »
Au niveau de F:\Scripts Powershell\SendFtp.ps1 : 32 Caractère : 59
+ [System.IO.FileStream]$stream = [System.IO.File]::OpenRead <<<< ($Path)
+ CategoryInfo : NotSpecified: (:«») [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
New-Object : Constructeur introuvable. Impossible de trouver un constructeur approprié pour le type byte[].
Au niveau de F:\Scripts Powershell\SendFtp.ps1 : 33 Caractère : 29
+ [byte[]]$buffer = New-Object <<<< byte[] $stream.Length
+ CategoryInfo : ObjectNotFound: (:«») [New-Object], PSArgumentException
+ FullyQualifiedErrorId : CannotFindAppropriateCtor,Microsoft.PowerShell.Commands.NewObjectCommand
Vous ne pouvez pas appeler de méthode sur une expression ayant la valeur Null.
Au niveau de F:\Scripts Powershell\SendFtp.ps1 : 34 Caractère : 13
+ $stream.Read <<<< ($buffer, 0, $buffer.Length)
+ CategoryInfo : InvalidOperation: (Read:«»String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Vous ne pouvez pas appeler de méthode sur une expression ayant la valeur Null.
Au niveau de F:\Scripts Powershell\SendFtp.ps1 : 35 Caractère : 14
+ $stream.Close <<<< ()
+ CategoryInfo : InvalidOperation: (Close:«»String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Vous ne pouvez pas appeler de méthode sur une expression ayant la valeur Null.
Au niveau de F:\Scripts Powershell\SendFtp.ps1 : 36 Caractère : 57
+ [System.IO.Stream]$reqStream = $request.GetRequestStream <<<< ()
+ CategoryInfo : InvalidOperation: (GetRequestStream:«»String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Vous ne pouvez pas appeler de méthode sur une expression ayant la valeur Null.
Au niveau de F:\Scripts Powershell\SendFtp.ps1 : 37 Caractère : 17
+ $reqStream.Write <<<< ($buffer, 0, $buffer.Length)
+ CategoryInfo : InvalidOperation: (Write:«»String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
Vous ne pouvez pas appeler de méthode sur une expression ayant la valeur Null.
Au niveau de F:\Scripts Powershell\SendFtp.ps1 : 38 Caractère : 17
+ $reqStream.Close <<<< ()
+ CategoryInfo : InvalidOperation: (Close:«»String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull[/code:1]
Une idée .. ? parce que là je sèche !
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
- Messages : 6300
- Remerciements reçus 68
il faut ajouter un bloc try catch sur l'appel du constructeur statique .
[code:1]Try{
[System.Net.FtpWebRequest]$request = [System.Net.FtpWebRequest]::create($sourceuri)
#suite
#...
} Catch {
# $_ = exception
#fait qq chose
}[/code:1]
Tutoriels PowerShell
Connexion ou Créer un compte pour participer à la conversation.
- Pierre
- Auteur du sujet
- Hors Ligne
- Nouveau membre
- Messages : 11
- Remerciements reçus 0
[code:1]
# Définition des paramètres
#
param([string]$ParamFile)
# Récupération des paramètres
#
$BuParam = Import-Csv $ParamFile
# Nom du fichier de log
#
$LogFile = 'FactMBftp' + (get-date -uformat \"%m_%Y\"«») + '.log'
# Suppression des fichiers de log de plus de 6 mois
#
Get-ChildItem .\* -include FactMBftp*.log | where{$_.CreationTime -le ((get-date).AddMonths(-6))} | ForEach-Object {Remove-Item $_}
# Entête de log pour cette session
#
Write-Output \"`n*******************************************************\" | Out-File $LogFile -encoding Unicode -append
Write-Output \"* Start ftp process $(Get-Date) \" | Out-File $LogFile -encoding Unicode -append
Write-Output \"*******************************************************\" | Out-File $LogFile -encoding Unicode -append
# Traitement pour chaque ligne de paramètres
#
foreach($BuParam.Unit in $BuParam){
$CmdFile = $BuParam.Unit + '.ftpcmd' # Fichier de commandes FTP
Write-Output \"`nProcess division $($BuParam.Unit) with ftp account $($BuParam.Login)`n\"| Out-File $LogFile -encoding Unicode -append
# Création du fichier de commandes FTP avec les paramètres de la ligne en cours
#
Write-Output \"user $($BuParam.Login) $($BuParam.Password)`nlcd `\"$($BuParam.InFolder)`\"`nprompt`nmput $($BuParam.Unit)-*`nquit\" | Out-File .\$CmdFile -encoding Default
# Exécution de ftp.exe avec le fichier de commandes
#
ftp.exe -n -s:$CmdFile $BuParam.FtpServer 2>tmp.err >> \"$LogFile\" # Execution de ftp.exe avec le fichier de commandes créé à l'étape précédente
# On test le nombre de caractères présent dans le fichier d'erreur
#
$NbCharErr = get-content .\tmp.err | measure-object -Character
if ($NbCharErr.Characters -ne 0)
{
# Il y'a des caractères dans le fichier d'erreur, donc il y'a une erreur sur ftp.exe ; on indique l'erreur avec la variable $Error
#
Write-Output \"`n!!!!!!Une erreur s'est produite : `n$($Error[0])!!!!!!!`n\" | Out-File $LogFile -encoding Unicode -append
}
else
{
# Pas de caractères dans le fichier d'erreur, on peut déplacer les PDF de InFolder à OutFolder
#
Write-Output \"user $($BuParam.Login) $($BuParam.Password)`ndir`nquit\" | Out-File .\$CmdFile -encoding Default
ftp.exe -n -s:$CmdFile $BuParam.FtpServer > tmp.log
Write-Output \"Transfert OK`nPDF sur serveur après transfert :\"(get-content .\tmp.log | Where-Object{$_.Contains(\"$($BuParam.Unit)-\"«»)}) | Out-File $LogFile -encoding Unicode -append
# Suppression du fichier temporaire utilisé pour lister les PDF présents sur le serveur
#
Remove-Item .\tmp.log
# Déplacement des PDF du InFolder vers le OutFolder
#
Move-Item \"$($BuParam.InFolder)\$($BuParam.Unit)-*\" $BuParam.OutFolder
}
# Suppression des éléments temporaires utilisés dans le script
#
Remove-Item .\tmp.err, .\*.ftpcmd
}
# Pied de log pour cette session
#
Write-Output \"`n*******************************************************\" | Out-File $LogFile -encoding Unicode -append
Write-Output \"* End ftp process $(Get-Date) \" | Out-File $LogFile -encoding Unicode -append
Write-Output \"*******************************************************\" | Out-File $LogFile -encoding Unicode -append
[/code:1]
Sachant que mon fichier csv de paramètres est de cette forme là :
[code:1]
Unit,Login,Password,FtpServer,InFolder,OutFolder
[/code:1]
A vos commentaires, je sais qu'il y'a des petites choses que je ne fais pas bien, j'aimerais savoir lesquelles
En tout cas, après quelques tests, ca marche bien
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
- Accueil
- forum
- PowerShell
- Entraide pour les débutants
- PowerShell et FTP