Я использую приведенную ниже команду Power Shell для копирования файла с сервера "SFTP" на сервер Windows. по какой-то причине скрипт не работает, не могли бы вы помочь

# Scriptname.ps1
# send the files to Win-Server server F:\data\in
# Source files are deleted after transfer
# Local Path is the source path
# RemotePath is the flies destination path

Function Scriptname {
    Param(
        [Parameter(Mandatory=$true)]
        [ValidateNotNull()]
        [string] $Username = $(throw "Username parameter is required"),
        [Parameter(Mandatory=$true)]
        [ValidateNotNull()]
        [string] $Password = $(throw "Password parameter is required"),
        [Parameter(Mandatory=$true)]
        [ValidateNotNull()]
        [string] $HostName = $(throw "HostName parameter is required"),
        [Parameter(Mandatory=$true)]
        [ValidateNotNull()]
        [string] $RemotePath = $(throw "RemotePath parameter is required"),
        [Parameter(Mandatory=$true)]
        [ValidateNotNull()]
        [string] $LocalPath = $(throw "LocalPath parameter is required"),
        [Parameter(Mandatory=$true)]
        [ValidateNotNull()]
        [string] $SshHostKeyFingerprint = $(throw "SshHostKeyFingerprint parameter is required"),
        $Remove=$true

    )
    if( -not (Test-Path $LocalPath)) {
        throw("ERROR: Unable to locate LocalPath (path=${LocalPath})")
    }

    $Invocation = (Get-Variable MyInvocation -Scope 1).Value
    $SftpModuleDirectory = Split-Path $Invocation.MyCommand.Path

    [Reflection.Assembly]::LoadFrom("${SftpModuleDirectory}\WinSCPnet.dll") | Out-Null

    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions
    $sessionOptions.Protocol = [WinSCP.Protocol]::Sftp
    $sessionOptions.HostName = $HostName
    $sessionOptions.UserName = $Username
    $sessionOptions.Password = $Password
    $sessionOptions.SshHostKeyFingerprint = $SshHostKeyFingerprint #"ssh-rsa 1024 xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx"

    $session = New-Object WinSCP.Session

    # connect to FTP session
    try {

        $session.Open($sessionOptions)
        $session.GetFiles($remotePath, $localPath,$remove).Check() 

    } catch {

        if($_.Exception.ToString().Contains("Host key wasn't verified!")) {
            throw("invalid SshHostKeyFingerprint, unable to open session to FTP (host=${HostName}, SshHostKeyFingerprint=${SshHostKeyFingerprint})")
        }       
        elseif($_.Exception.ToString().Contains("No supported authentication methods available")) {
            throw("Unable to open session to FTP (host=${HostName}, username=${Username})")
        }       
    }

    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    } 
}

$UserName = GetEnvironmentConfigValue "Scriptname.UserName"
$Password = GetEnvironmentConfigValue "Scriptname.Password"
$HostName = GetEnvironmentConfigValue "Scriptname.HostName"
$RemotePath = GetEnvironmentConfigValue "Scriptname.RemotePath"
$LocalPath = GetEnvironmentConfigValue "Scriptname.LocalPath"
$SshHostKeyFingerprint = GetEnvironmentConfigValue "Scriptname.SshHostKeyFingerprint"
$Remove=$true

Write-host "values: ${Username} ${Password} ${HostName} ${RemotePath} ${LocalPath} ${SshHostKeyFingerprint}"

SFTPUploadFiles $Username $Password $HostName $RemotePath $LocalPath $SshHostKeyFingerprint 

1 ответ1

2

Хорошо, кроме выяснения, что имя функции было неправильным, что привело к тому, что скрипт не копировал ваши файлы, я хотел бы показать вам сплиты Powershell:

$UserName = GetEnvironmentConfigValue "Scriptname.UserName"
$Password = GetEnvironmentConfigValue "Scriptname.Password"
$HostName = GetEnvironmentConfigValue "Scriptname.HostName"
$RemotePath = GetEnvironmentConfigValue "Scriptname.RemotePath"
$LocalPath = GetEnvironmentConfigValue "Scriptname.LocalPath"
$SshHostKeyFingerprint = GetEnvironmentConfigValue "Scriptname.SshHostKeyFingerprint"
$Remove=$true

Write-host "values: ${Username} ${Password} ${HostName} ${RemotePath} ${LocalPath} ${SshHostKeyFingerprint}"

SFTPUploadFiles $Username $Password $HostName $RemotePath $LocalPath $SshHostKeyFingerprint 

Следующее то же самое, но с брызгами. Он использует хеш-таблицу, которую можно передать функции, если все ключи хеш-таблицы (строки перед знаком =) соответствуют именам параметров функции:

$Parameters = @{
   "UserName" = GetEnvironmentConfigValue "Scriptname.UserName"
   "Password" = GetEnvironmentConfigValue "Scriptname.Password"
   "HostName" = GetEnvironmentConfigValue "Scriptname.HostName"
   "RemotePath" = GetEnvironmentConfigValue "Scriptname.RemotePath"
   "LocalPath" = GetEnvironmentConfigValue "Scriptname.LocalPath"
   "SshHostKeyFingerprint" = GetEnvironmentConfigValue "Scriptname.SshHostKeyFingerprint"
}


$Parameters

SFTPUploadFiles @Parameters -Remove:$false

Так как ваша функция по умолчанию устанавливает Remove в true, указывать его излишне. Мой пример показывает, что вы можете смешивать и сопоставлять нормальные параметры с хеш-таблицей, которая используется для сплаттинга.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .