WinSCP XML log с PowerShell для подтверждения загрузки нескольких файлов

powershell winscp

766 просмотра

1 ответ

46 Репутация автора

С моим сценарием я пытаюсь сканировать каталог на наличие подкаталога, который автоматически создается каждый день и содержит дату в имени каталога. Как только он находит дату вчерашнего дня (так как мне нужно загрузить предыдущий день), он ищет другой подкаталог, а затем любые файлы, которые содержат «JONES». Как только он находит эти файлы, он делает foreachцикл загрузки, используя winscp.com.

Моя проблема в том, что я пытаюсь использовать .xml журнал, созданный из winscp, для отправки пользователю для подтверждения загрузки. Проблема в том, что файл .xml содержит только последний загруженный файл.

Вот мой сценарий:

# Set yesterday's date (since uploads will happen at 2am)
$YDate = (Get-Date).AddDays(-1).ToString('MM-dd-yyyy')

# Find Directory w/ Yesterday's Date in name
$YesterdayFolder = Get-ChildItem -Path "\\Path\to\server" | Where-Object {$_.FullName.contains($YDate)}

If ($YesterdayFolder) {

    #we specify the directory where all files that we want to upload are contained 
    $Dir= $YesterdayFolder

    #list every sql server trace file
    $FilesToUpload = Get-ChildItem -Path (Join-Path $YesterdayFolder.FullName "Report") | Where-Object {$_.Name.StartsWith("JONES","CurrentCultureIgnoreCase")}

    foreach($item in ($FilesToUpload))
    { 
          $PutCommand = '& "C:\Program Files (x86)\WinSCP\winscp.com" /command "open ftp://USERNAME:PASSWORD@ftps.hostname.com:21/dropoff/ -explicitssl" "put """"' + $Item.FullName + '""""" "exit"' 
          Invoke-Expression $PutCommand         
    } 
} Else {
    #Something Else will go here
}

Я чувствую, что все мои $PutCommandстроки содержатся в ForEachцикле, и он просто перезаписывает XML-файл каждый раз, когда он подключается / выходит, но мне не повезло разбить этот скрипт.

Автор: jms2k Источник Размещён: 18.07.2016 03:20

Ответы (1)


2 плюса

105564 Репутация автора

Решение

Вы запускаете WinSCP снова и снова для каждого файла. Каждый прогон перезаписывает журнал предыдущего прогона.

Вызовите WinSCP только один раз. Это даже лучше, поскольку вы избегаете повторного подключения для каждого файла.

$FilesToUpload = Get-ChildItem -Path (Join-Path $YesterdayFolder.FullName "Report") |
    Where-Object {$_.Name.StartsWith("JONES","CurrentCultureIgnoreCase")}

$PutCommand = '& "C:\Program Files (x86)\WinSCP\winscp.com" /command "open ftp://USERNAME:PASSWORD@ftps.hostname.com:21/dropoff/ -explicitssl" '

foreach($item in ($FilesToUpload))
{ 
      $PutCommand += '"put """"' + $Item.FullName + '""""" '
} 
$PutCommand += '"exit"'

Invoke-Expression $PutCommand 

Хотя все, что вам действительно нужно сделать, это проверить код завершения WinSCP. Если это 0, все прошло нормально. Не нужно иметь журнал XML в качестве доказательства.


И что еще лучше, используйте сборку WinSCP .NET из скрипта PowerShell вместо запуска WinSCP из командной строки. Он выполняет всю проверку ошибок для вас (вы получаете исключение, если что-то пойдет не так). И вы избегаете всех неприятных вещей командной строки (например, экранирование специальных символов в учетных данных и именах файлов).

try
{
    # Load WinSCP .NET assembly
    Add-Type -Path "WinSCPnet.dll"

    # Setup session options
    $sessionOptions = New-Object WinSCP.SessionOptions -Property @{
        Protocol = [WinSCP.Protocol]::Ftp
        FtpSecure = [WinSCP.FtpSecure]::Explicit
        TlsHostCertificateFingerprint = "xx:xx:xx:xx:xx:xx..."
        HostName = "ftps.hostname.com"
        UserName = "username"
        Password = "password"
    }

    $session = New-Object WinSCP.Session

    try
    {
        # Connect
        $session.Open($sessionOptions)

        # Upload files
        foreach ($item in ($FilesToUpload))
        {
            $session.PutFiles($Item.FullName, "/dropoff/").Check()
            Write-Host "Upload of $($Item.FullName) succeeded"
        }
    }
    finally
    {
        # Disconnect, clean up
        $session.Dispose()
    }

    exit 0
}
catch [Exception]
{
    Write-Host "Error: $($_.Exception.Message)"
    exit 1
}
Автор: Martin Prikryl Размещён: 18.07.2016 03:42
Вопросы из категории :
32x32