Escopo do projeto: use o PowerShell e o WinSCP .NET assembly para automatizar os downloads noturnos usando o registro de data e hora do arquivo para identificar os arquivos a serem baixados. O servidor FTP que está sendo conectado é o IIS, então ele não suporta todos os comandos como o MLSD em sua configuração atual e eu não os vejo fazendo uma alteração se solicitado.
Problema: os arquivos com um mês de 1 ou 2 dígitos retornam comprimentos de string diferentes que não sei como contornar isso. Meu código funciona agora, mas vai parar de funcionar em outubro.
por exemplo. Março exibe 3 / dd / aaaa em vez de 03 / dd / aaaa
Outras observações: No começo, tentei criar scripts usando o WinSCP.com, mas não consegui encontrar uma maneira de especificar a data corretamente.
por exemplo. você pode especificar *.zip>=1D
ou *.zip<=1D
, mas *.zip=1D
ou *.zip==1D
não são suportados atualmente com a última versão do WinSCP.
Código:
$yesterday = [DateTime]::Today.AddDays(-1).ToString("M/dd/yyyy")
# OR I have to use ToString("MM/dd/yyyy") for months 10-12,
# but I need both formats to work.
#delete the temporary file
del .\FTPfiles.txt
# Load WinSCP .NET assembly
Add-Type -Path "C:\Program Files (x86)\WinSCP\WinSCPnet.dll"
# Setup session options
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Ftp
HostName = "server.com"
UserName = "joe"
Password = "smith"
}
$session = New-Object WinSCP.Session
try
{
# Connect
$session.Open($sessionOptions)
$directory = $session.ListDirectory("/Folder")
foreach ($fileInfo in $directory.Files)
{
Write-Output ("{1} {0}" -f
$fileInfo.Name, $fileInfo.LastWriteTime) >> FTPfiles.txt
}
$fileList = get-content .\FTPfiles.txt | findstr $yesterday
$stripped = $fileList -creplace '^.*Z12', 'Z12'
# Download files
$remotePath = "/Folder/"
$transferOptions = New-Object WinSCP.TransferOptions
$transferOptions.TransferMode = [WinSCP.TransferMode]::Binary
$lines = $stripped
foreach ($line in $lines)
{
Write-Host ("Downloading {0} ..." -f $line)
$session.GetFiles($remotePath+$line, "C:\Downloads\").Check()
}
}
catch [Exception]
{
Write-Host ("Error: {0}" -f $_.Exception.Message)
exit 1
}
finally
{
# Disconnect, clean up
$session.Dispose()
}
O $fileInfo in $directory.Files
escreve o último horário de gravação e, em seguida, o nome do arquivo em FTPfiles.txt
para todos os arquivos contidos no servidor FTP da pasta especificada. Este arquivo de texto é então lido e depois reduzido para apenas os arquivos que têm um tempo de gravação que ocorreu na data de ontem, que atualmente funciona apenas 9 meses do ano por causa do formato de data usando 1 dígito para o mês em vez de 2 dígitos .
Em seguida, o arquivo é lido e retirado das datas anteriores aos nomes dos arquivos, para que os nomes dos arquivos sejam usados para fazer o loop para download. A transformação é assim:
FROM:
3/14/2017 2:04:00 AM Z1234_20170314050001_1.zip
3/14/2017 3:04:00 AM Z1234_20170315060002_1.zip
3/14/2017 4:04:00 AM Z1234_20170316070001_1.zip
3/14/2017 5:04:00 AM Z1234_20170317080001_1.zip
TO:
Z1234_20170314050001_1.zip
Z1234_20170315060002_1.zip
Z1234_20170316070001_1.zip
Z1234_20170317080001_1.zip
Em seguida, o script usa esses nomes de arquivos para fazer o download dos arquivos necessários do dia anterior.