Question WinSCP + Powershell
- Arthur
- Auteur du sujet
- Hors Ligne
- Membre elite
-
Réduire
Plus d'informations
- Messages : 226
- Remerciements reçus 0
il y a 15 ans 7 mois #7468
par Arthur
WinSCP + Powershell a été créé par Arthur
Voilà ca matin on m'a demandé de réaliser des transferts de gros fichiers/dossier(récursif) depuis une machine Windows vers une autre machine(linux, Windows etc..), sans trop utiliser de technologies propriétaires et gratuit bien sûr. 
Bref j'ai pas cherché longtemps je suis direct aller voir du coté de WinSCP et j'ai vus des exemples d'utilisation de WinSCP avec Dotnet avec du C# ou du VB.net mais pas de Powershell !
Bref tous ca pour dire que j'ai adapté le script à Powershell.
Je pense qu'il doit exister une autre version utilisant Powershell mais je ne l'ai pas trouvé.
Et puis adaptation n'est pas très difficile donc j'ai pas trop cherché.
(Quand même WinSCP c'est connus !
Tonnerre de Brest )
[code:1]<#
.SYNOPSIS
Script permettant d'éxécuter des commandes via WinSCP
.DESCRIPTION
Ce script nécessite l'installation de WinSCP ou la version portable de WinSCP
.EXAMPLE
Transfer-File -Username MonLogin -Password MonMotDePasse -Server Monserveur -cmd \"put C:\toto.txt /etc/test/toto.txt\",\"cd /etc/test\",\"ls\"
#>
function Transfer-File {
param([String]$Username,[String]$Password,[String]$Server,[string[]]$cmd)
[reflection.assembly]::loadwithpartialname(\"System\"«») | Out-Null
[reflection.assembly]::loadwithpartialname(\"System.Diagnostics\"«») | Out-Null
[reflection.assembly]::loadwithpartialname(\"System.Xml\"«») | Out-Null
[reflection.assembly]::loadwithpartialname(\"System.Xml.XPath\"«») | Out-Null
#Il est nécéssaire de mettre le chemin COMPLET du fichier de log et du fichier WinSCP.com
New-Variable logname -Option \"ReadOnly\" -Value \"C:\test\log.xml\"
New-Variable WinSCP_Path -Option \"ReadOnly\" -Value \"C:\test\WinSCP.com\"
[string]$Connexion = \"open $($Username):$($Password)@$($Server)\"
$winscp = New-Object \"System.Diagnostics.Process\"
$winscp.StartInfo.FileName = $WinSCP_Path
$winscp.StartInfo.Arguments = \"/log=\" + $logname
$winscp.StartInfo.UseShellExecute = $false
$winscp.StartInfo.RedirectStandardInput = $true
$winscp.StartInfo.RedirectStandardOutput = $true
$winscp.StartInfo.CreateNoWindow = $true
$winscp.Start()
$winscp.StandardInput.WriteLine(\"option batch abort\"«»)
$winscp.StandardInput.WriteLine(\"option confirm off\"«»)
$winscp.StandardInput.WriteLine($Connexion)
$cmd | foreach {
$winscp.StandardInput.WriteLine($_)
}
$winscp.StandardInput.Close()
[string]$output = $winscp.StandardOutput.ReadToEnd()
$winscp.WaitForExit()
$log = new-object -typename System.Xml.XPath.XPathDocument -ArgumentList $logname
$table = New-Object System.Xml.NameTable
$ns = New-Object -TypeName System.Xml.XmlNamespaceManager -ArgumentList $table
$ns.AddNamespace(\"w\", \"winscp.net/schema/session/1.0\"«»)
[System.Xml.XPath.XPathNavigator]$nav = $log.CreateNavigator()
if ($winscp.ExitCode -ne 0)
{
[System.Console]::WriteLine(\"Error occured\"«»)
foreach ($message in ($nav.Select(\"//w:message\", $ns)))
{
[System.Console]::WriteLine($message.Value)
}
}
else
{
[System.Xml.XPath.XPathNodeIterator]$files = $nav.Select(\"//w:file\", $ns)
[System.Console]::WriteLine(\"There are $($files.Count) files and subdirectories:\"«»)
foreach ($file in $files)
{
[System.Console]::WriteLine(($file.SelectSingleNode(\"w:filename/@value\",$ns)).Value)
}
}
}[/code:1]
EDIT : j'ai oublié de préciser il faut une version à jour de WinSCP je me suis personnellement fait avoir et WinSCP ne voulait pas créer de fichier xml (C'est ce qui m'a pris le plus de temps
)
<br><br>Message édité par: bilbao, à: 27/07/10 14:07
Bref j'ai pas cherché longtemps je suis direct aller voir du coté de WinSCP et j'ai vus des exemples d'utilisation de WinSCP avec Dotnet avec du C# ou du VB.net mais pas de Powershell !
Bref tous ca pour dire que j'ai adapté le script à Powershell.
Je pense qu'il doit exister une autre version utilisant Powershell mais je ne l'ai pas trouvé.
Et puis adaptation n'est pas très difficile donc j'ai pas trop cherché.
(Quand même WinSCP c'est connus !
[code:1]<#
.SYNOPSIS
Script permettant d'éxécuter des commandes via WinSCP
.DESCRIPTION
Ce script nécessite l'installation de WinSCP ou la version portable de WinSCP
.EXAMPLE
Transfer-File -Username MonLogin -Password MonMotDePasse -Server Monserveur -cmd \"put C:\toto.txt /etc/test/toto.txt\",\"cd /etc/test\",\"ls\"
#>
function Transfer-File {
param([String]$Username,[String]$Password,[String]$Server,[string[]]$cmd)
[reflection.assembly]::loadwithpartialname(\"System\"«») | Out-Null
[reflection.assembly]::loadwithpartialname(\"System.Diagnostics\"«») | Out-Null
[reflection.assembly]::loadwithpartialname(\"System.Xml\"«») | Out-Null
[reflection.assembly]::loadwithpartialname(\"System.Xml.XPath\"«») | Out-Null
#Il est nécéssaire de mettre le chemin COMPLET du fichier de log et du fichier WinSCP.com
New-Variable logname -Option \"ReadOnly\" -Value \"C:\test\log.xml\"
New-Variable WinSCP_Path -Option \"ReadOnly\" -Value \"C:\test\WinSCP.com\"
[string]$Connexion = \"open $($Username):$($Password)@$($Server)\"
$winscp = New-Object \"System.Diagnostics.Process\"
$winscp.StartInfo.FileName = $WinSCP_Path
$winscp.StartInfo.Arguments = \"/log=\" + $logname
$winscp.StartInfo.UseShellExecute = $false
$winscp.StartInfo.RedirectStandardInput = $true
$winscp.StartInfo.RedirectStandardOutput = $true
$winscp.StartInfo.CreateNoWindow = $true
$winscp.Start()
$winscp.StandardInput.WriteLine(\"option batch abort\"«»)
$winscp.StandardInput.WriteLine(\"option confirm off\"«»)
$winscp.StandardInput.WriteLine($Connexion)
$cmd | foreach {
$winscp.StandardInput.WriteLine($_)
}
$winscp.StandardInput.Close()
[string]$output = $winscp.StandardOutput.ReadToEnd()
$winscp.WaitForExit()
$log = new-object -typename System.Xml.XPath.XPathDocument -ArgumentList $logname
$table = New-Object System.Xml.NameTable
$ns = New-Object -TypeName System.Xml.XmlNamespaceManager -ArgumentList $table
$ns.AddNamespace(\"w\", \"winscp.net/schema/session/1.0\"«»)
[System.Xml.XPath.XPathNavigator]$nav = $log.CreateNavigator()
if ($winscp.ExitCode -ne 0)
{
[System.Console]::WriteLine(\"Error occured\"«»)
foreach ($message in ($nav.Select(\"//w:message\", $ns)))
{
[System.Console]::WriteLine($message.Value)
}
}
else
{
[System.Xml.XPath.XPathNodeIterator]$files = $nav.Select(\"//w:file\", $ns)
[System.Console]::WriteLine(\"There are $($files.Count) files and subdirectories:\"«»)
foreach ($file in $files)
{
[System.Console]::WriteLine(($file.SelectSingleNode(\"w:filename/@value\",$ns)).Value)
}
}
}[/code:1]
EDIT : j'ai oublié de préciser il faut une version à jour de WinSCP je me suis personnellement fait avoir et WinSCP ne voulait pas créer de fichier xml (C'est ce qui m'a pris le plus de temps
La pièce jointe Module_WinSCP.zip est absente ou indisponible
Pièces jointes :
Connexion ou Créer un compte pour participer à la conversation.
Temps de génération de la page : 0.050 secondes
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Contributions à la communauté
- WinSCP + Powershell