微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决在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:\script\Rapport.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()
}

提前感谢,祝你有美好的一天

解决方法

根据您现有的代码,我认为您使用的是错误的包含

包含用于确认数组中是否包含匹配值 您的代码正在尝试检查“ True”字符串是否包含在文件中,这是由您先前对文件进行过滤所导致的。这是行不通的。

根据您的过滤器,您可以使用 count 来代替包含,它应该会产生更好的结果:

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 Client Module看起来非常友好。

,

您想要这样的东西:

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

有关其他实现,请参见WinSCP示例 Watching for changes in SFTP/FTP server

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。