Lingkup Desain: Gunakan unit PowerShell dan WinSCP .NET untuk mengotomatisasi pengunduhan malam dengan menggunakan cap waktu file untuk mengidentifikasi file yang akan diunduh. Server FTP yang terhubung adalah IIS sehingga tidak mendukung semua perintah seperti MLSD dalam konfigurasi saat ini dan saya tidak melihat mereka melakukan perubahan jika diminta.
Masalah: File yang memiliki 1 atau 2 digit bulan menghasilkan panjang string yang berbeda sehingga saya tidak yakin bagaimana cara menyiasatinya. Kode saya berfungsi sekarang, tetapi akan berhenti bekerja pada bulan Oktober.
misal Maret menampilkan 3 / dd / yyyy bukannya 03 / dd / yyyy
Catatan lain: Awalnya saya mencoba membuat skrip ini menggunakan WinSCP.com, tetapi saya tidak dapat menemukan cara untuk menentukan tanggal dengan benar.
misalnya Anda dapat menentukan *.zip>=1D
atau *.zip<=1D
, tetapi saat ini *.zip=1D
atau *.zip==1D
tidak didukung dengan rilis terbaru WinSCP.
Kode:
$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()
}
The $fileInfo in $directory.Files
menulis waktu terakhir menulis dan kemudian mengajukan nama ke FTPfiles.txt
untuk semua file yang terdapat pada server FTP dari folder tertentu. File teks ini kemudian dibaca dan kemudian dikurangi menjadi hanya file yang memiliki waktu tulis yang terjadi pada tanggal kemarin, yang saat ini hanya berfungsi 9 bulan dalam setahun karena format tanggal menggunakan 1 digit untuk bulan alih-alih 2 digit .
Selanjutnya file tersebut dibaca dan dihapus tanggalnya sebelum nama file sehingga nama file tersebut akan digunakan untuk mengulang untuk mengunduh. Transformasinya terlihat seperti ini:
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
Kemudian skrip menggunakan nama file tersebut untuk mengunduh file yang dibutuhkan dari hari sebelumnya.
[DateTime]::Today.AddDays(-120).ToString("M/dd/yyyy")
Mengembalikan (cca empat bulan lalu tanggal) 11/15/2016
dengan dua digit bulan. BTW, Anda tidak perlu membuat file sementara dan menggunakan findstr.exe
alat eksternal . Anda dapat mengecek $fileInfo.LastWriteTime
langsung di PowerShell menggunakan regex dan -match
operator yang sesuai ...
[datetime]::Now.AddDays(200).ToString("M/dd/yyyy")
akan memverifikasi (saat ini menempatkan Anda ke Oktober atau menggunakan format string MM untuk selalu mendapatkan 2 digit
[DateTime]::Today.AddDays(-1).ToString("M/dd/yyyy")
akan melebar ke dua digit bulan pada bulan Oktober, yang satu M berarti tidak ada yang memimpin nol?