Question PowerShell et FTP

Plus d'informations
il y a 13 ans 1 semaine #9205 par Pierre
Réponse de Pierre sur le sujet Re:PowerShell et FTP
Arnaud écrit:

Peux tu me donner un indice pour que je puisse t'identifier ? :)

Session ENI services Nantes fin février ;) (motomag :lol: )

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 :dry:

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 13 ans 1 semaine #9209 par Pierre
Réponse de Pierre sur le sujet Re:PowerShell et FTP
Iiabz écrit:

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 :unsure: )
J'ai la même erreur avec le code présent ici dans 'UPLOAD'.
...

:blush: 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 ...

Moralité : l'erreur est souvent juste trop évidente pour nous sauter aux yeux :dry:

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.

Plus d'informations
il y a 13 ans 1 semaine #9212 par Pierre
Réponse de Pierre sur le sujet Re:PowerShell et FTP
Voilà ce que ca donne pour le moment, sans traitement des erreurs ... , à vos commentaires :;)

[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.

Plus d'informations
il y a 13 ans 6 jours #9231 par Pierre
Réponse de Pierre sur le sujet Re:PowerShell et FTP
Bon je reviens vers vous car la gestion d'erreur avec l'appel à un exe est un peu fastidieuse :unsure:. Du coup j'aimerais utiliser le code que m'avait donné Bilbao mais j'ai des erreurs en l'utilisant :
[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.

Plus d'informations
il y a 13 ans 6 jours #9232 par Laurent Dardenne
Réponse de Laurent Dardenne sur le sujet Re:PowerShell et FTP
Salut,
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.

Plus d'informations
il y a 13 ans 4 jours #9266 par Pierre
Réponse de Pierre sur le sujet Re:PowerShell et FTP
Alors voici la dernière version de mon script (j'ai arrêté de me battre avec le code \"ftp powershell\", je suis resté avec ftp.exe) :
[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.

Temps de génération de la page : 0.105 secondes
Propulsé par Kunena