使用PowerShell中的WinSCP.NET程序集监视FTP服务器上上载的文件



我试图编写PowerShell脚本,当一个新文件放到FTP上时,他可以发送电子邮件(我不是FTP的所有者,所以我不能做cron工作(。

我遇到了一个错误,因为我使用的是Contains方法,经过一些研究,Contains无法通过FTP工作。

我不知道做这项工作的其他方法。有人能帮我摆脱无知吗?

这是我写的剧本:

# Charger l'ensemble .NET de WinSCP
Add-Type -Path "WinSCPnet.dll"
# Configurer les options de session
$sessionOptions = New-Object WinSCP.SessionOptions -Property @{
Protocol = [WinSCP.Protocol]::Ftp
HostName = "xxxxxx"
UserName = "xxxxxx"
Password = "xxxxxx"
}
$sessionOptions.AddRawSettings("ProxyHost", "xxxxxx")
$sessionOptions.AddRawSettings("ProxyPort", "xxxxxx")
$sessionOptions.AddRawSettings("FtpProxyLogonType", "xxxxxx")
$session = New-Object WinSCP.Session
try
{
# Connecter
$session.Open($sessionOptions)
# Votre code
### FONCTION ENVOI DE MAIL ###
Function SendMail
{
$EXPEDITEUR = "xxxxxx"
$DESTINATAIRE = "xxxxxx","xxxxxx"
$SUJET = "xxxxxx"
$SERVEUR_SMTP = "xxxxxx" 
$CORPS_MAIL = "xxxxxx"
#$PJ = 'c:scriptRapport.txt' # si Pièce jointe
#$attachment = New-Object System.Net.Mail.Attachment($PJ) #Pour la Pièce jointe
$Mail_Message = New-Object System.Net.Mail.MailMessage #on créé l'objet
$Mail_Message.From = $EXPEDITEUR
$Mail_Message.Subject = $SUJET
$Mail_Message.Body = $CORPS_MAIL
#$Mail_Message.Attachments.Add($PJ)
$Mail_Adresses = $Mail_Message.To
if ($DESTINATAIRE -is "System.Array") #Si plusieurs adresses
{
foreach ($Adr in $DESTINATAIRE) #on rajoute chaque adresse
{
$Mail_Adress = New-Object System.Net.Mail.MailAddress $Adr
$Mail_Adresses.Add($Mail_Adress)
}
}
else
{
$Mail_Adress = New-Object System.Net.Mail.MailAddress $DESTINATAIRE
$Mail_Adresses.Add($Mail_Adress)
}
$SMTPClient = New-Object Net.Mail.SmtpClient($SERVEUR_SMTP, 25) #serveur SMTP et Port
$SMTPClient.EnableSsl = $false #si SSL activé ou non - Importer le certificat avant?
$SMTPClient.Credentials = New-Object System.Net.NetworkCredential("xxxxxx", "xxxxxx"); #ICI Login et password du compte mail
$SMTPClient.Send($Mail_Message) #l'envoi du mail
}
### Déclaration variables ###
$log="xxxxxx" #
$dateverif = get-date -format "yyyy_MM_dd_-_HH_mm_ss"
### VERIFICATION DES COMMANDES EN ATTENTE ###
$Date=(Get-Date).AddMinutes(-2)
#$remotePath = "xxxxxx"
#$H =Dir $remotePath
#$path='xxxxxx'
#$H=Dir $Path |
$H=$session.Open
Where-Object {! $_.PsIsContainer}|
Group-Object -Property {$_.LastWriteTime -ge $date} -AsHashTable -AsString
$oldOfs,$ofs=$ofs,' , '
if ($H -eq $null) # Aucun fichier dans le répertoire à surveiller
{
echo "$dateverif Aucun fichier trouvé" >> $log
exit 0
}
if ($H.Contains('True')) # Présence de fichiers de moins de 1 jour (1440 minutes)
{
Write-Warning "Nouveau rapport d'intervention TowerCast"
"$($H.True)"
echo "$dateverif NEW : Nouveau rapport d'intervention de Towercast" >> $log
echo $H >>$log
SendMail #Envoi du mail d'alerte
exit 0
}
if ($H.Contains('False')) # Présence de fichiers de plus de 1 jour (1440 minutes)
{
Write-Warning "Pas de nouveau rapport"
"$($H.False)"
echo "$dateverif Aucun nouveau rapport" >> $log
exit 0
}
$ofs=$oldOfs
}
finally
{
$session.Dispose()
}

提前感谢,祝一天愉快

您想要这样的东西:

$H = $session.ListDirectory($path) |
Where-Object {! $_.IsDirectory} |
Group-Object ...

有关另一个实现,请参阅WinSCP示例正在监视SFTP/FTP服务器中的更改。

从您现有的代码来看,我认为您使用contains的方式是错误的。

contains用于确认是否在数组中包含匹配值您的代码正在尝试检查";真"字符串包含为一个文件,该文件是由您以前对文件的筛选产生的。这是行不通的。

根据您的过滤器,您可以使用计数而不是包含,它应该会给出更好的结果:

if (($H).Count -gt 0")
{
# There are at least 1 new file in your filter
}
else
{
# No new files in your filter
}

让我建议转移到一个更容易的模块来连接和播放FTP文件:

TechNet PowerShell库中的PowerShell FTP客户端模块看起来非常友好。

最新更新