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.
sumber
[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?[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 menggunakanfindstr.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 digitJawaban:
Coba fungsi ini dan berikan rentang tanggal yang Anda tentukan dalam parameter
StartDate
danEndDate
Anda dapat mengunduh contoh kode lengkap dari Cara mengunduh file terbaru di PowerShell oleh WinSCP
sumber
Anda dapat menggunakan
today
danyesterday
kata kunci untuk kendala waktu atas dan bawah dalam satu file mask WinSCP :Ini membutuhkan WinSCP 5.15 dan yang lebih baru.
Di versi WinSCP yang lebih lama, Anda dapat membuat cap waktu di kode PowerShell Anda, seperti:
*>=2017-03-15<2017-03-16
(waktu tengah malam tersirat, itu juga mengapa
*=2017-03-15
tidak, apa yang Anda inginkan; dan juga alasan mengapa itu tidak diterapkan, karena tidak akan ada gunanya)Di PowerShell, Anda bisa menerapkannya seperti:
Lihat artikel WinSCP tentang memformat stempel waktu di PowerShell .
Meskipun Anda juga dapat menggunakan sintaks WinSCP
%TIMESTAMP%
untuk implementasi yang lebih sederhana:Lihat artikel WinSCP tentang Mengunduh file terbaru .
sumber