在PowerShell

时间:2018-05-16 14:49:59

标签: powershell

我有一个脚本,可以读取两个CSV中的数据,如下所示:

$ SORT变量:CSV文档

Auditor Mnemonic Start
Nate     BLDG1    0400
Nate     BLDG2    0430
Roger    BLDG3    0400

$ SiteTML变量:CSV文档

SITE    tech1          tech2         tech3          supervisor
BLDG1   me@work.com    you@work.com  tom@work.com   dick@work.com
BLDG2   me@work.com    you@work.com  harry@work.com dick@work.com
BLDG3   roger@work.com sam@work.com  mike@work.com  dick@work.com

想法

每个助记符都会显示一个弹出窗口,询问该网站是否已解析。如果选择是,则转到下一个。如果选择“否”,则提供粘贴错误消息的选项,然后它将自动转到下一个错误消息。

一旦审核员问题列表完成,该网站将在弹出窗口中报告未通过审核的所有网站的列表(实际审核通过网页完成,并且运行审核的必要数据收集在$site|clip功能)。之后,该脚本会显示一个单独的网站,其中显示哪些网站成功与失败[START $THORSite]的列表。

实施例

如果选择Nate,脚本应显示一个弹出窗口,上面写着“BLDG1是否成功完成?”并且“是”和“否”按钮可用。如果用户选择“是”,脚本将转到BLDG2并执行相同的操作。如果选择“否”,脚本将要求用户粘贴错误消息并按ENTER,此时它会将电子邮件发送给与$SiteTML中的助记符相关联的用户并继续提出BLDG2的问题。

由于BLDG3的审核员列为Roger,并且当前选择了Nate,因此会忽略BLDG3并且列表已完成。该脚本现在应该编译所有选择“否”的站点的列表,并显示一个弹出窗口,显示那些助记符[$FailSite部分]。

问题

脚本没有完成列表,而是循环回到开头。它显示正确的站点,但不是终止ForEach循环并编译错误站点,而是返回到第一个站点并无限期地重复整个列表。

注意:我是根据我为单个用户编写的脚本改编的。此版本旨在为所有用户提供一个主列表,并且在开头有一个用户选择[从此问题中排除]。我似乎无法找到我做错的事情,即使我也有原始剧本。

完整脚本如下:

$FHApage = "INTERNAL WEBPAGE"
$wshell = New-Object -ComObject Wscript.Shell
$SiteTML = Import-Csv $PSScriptRoot\Site_Tech_Master_List.csv
$Date = (Get-Date).ToString('MM/dd/yyyy')
$ThorSite = "INTERNAL WEBPAGE"
$wshell = New-Object -ComObject Wscript.Shell
$Data = Import-Csv $env:USERPROFILE\Documents\myFHA.csv
$FailSites = @()

$CurrentUser = ([adsi]"WinNT://$env:userdomain/$env:username,user").fullname
$Surname,$GivenName,$ADID=($CurrentUser).split(" ")
$TechName = $GivenName + " " + "$Surname"
$self = (([adsisearcher]"samAccountName=$env:USERNAME").FindOne().Properties.mail).replace('\W',"")
$smtpServer = "SMTP SERVER"
Add-PSSnapin Microsoft.Exchange.Management.Powershell.Admin -erroraction silentlyContinue


#Load the FHA webpage
START $FHApage

#Select Sort
$SortChoice = Read-Host "1.Preload
2.Day
3.Twilight
4.Night
5.Saturday
Select sort, press <ENTER>"
If($SortChoice -eq '1'){$Sort = Import-Csv $PSScriptRoot\GenData\presort.csv}
If($SortChoice -eq '2'){$Sort = Import-Csv $PSScriptRoot\GenData\daysort.csv}
If($SortChoice -eq '3'){$Sort = Import-Csv $PSScriptRoot\GenData\twisort.csv}
If($SortChoice -eq '4'){$Sort = Import-Csv $PSScriptRoot\GenData\nightsort.csv}
If($SortChoice -eq '5'){$Sort = Import-Csv $PSScriptRoot\GenData\satsort.csv}

#Select Technician
$TechChoice = Read-Host "1.Nate
2.Roger
Select technician, press <ENTER>"

If($TechChoice -eq '1'){$technician = "Nate"}
If($TechChoice -eq '2'){$technician = "Roger"}
ForEach($a in $SiteTML){

    ForEach($s in $Sort){
        $tech = $s.Auditor
        $site = $s.Mnemonic
        $time = $s.Start

        If($tech -eq "$technician"){
            $site|clip
            $intAnswer = $wshell.popup($site+" at "+$time+"
            Did "+$site+" complete successfully?", ` 
            0,$site+" status",4) 
            If ($intAnswer -ne 6) {
                $reason = Read-Host "Paste error here"
                $Today = (Get-Date).ToString('dd MMMM, yyyy, hh:mm tt')
                $msg = new-object Net.Mail.MailMessage
                $smtp = new-object Net.Mail.SmtpClient($smtpServer)
                $msg.From = ($self)
                $msg.To.Add($a.tech1)
                $msg.CC.Add($a.tech2)
                $msg.CC.Add($a.tech3)
                $msg.CC.Add($a.supervisor)
                $msg.CC.Add($self)
                $msg.Subject = "Remediation Required:  "+$site
                $msg.IsBodyHTML = $true
                $msg.Body = 'BODY DATA'
                $smtp.Send($msg)
                $FailSites += $site+"
                "
            }
        }
    }
}
If($FailSites -like '*'){
    $wshell.Popup("Remediation Email sent for the following sites:
    $FailSites")
}
START $THORSite

这必须与我的右括号或ForEach语句的顺序有关,但我找不到问题。

感谢任何帮助。

更新

ForEach($a in $SiteTML)是导致连续循环的原因。如果我删除该循环,系统可以正常工作,但这就是存储每个站点的电子邮件地址的地方。

我需要找到一种方法让脚本引用$SiteTML,其SITE列与$SORT CSV的mnemonic列匹配,如果匹配,则捕获来自$SiteTML的该网站的电子邮件地址作为变量。

1 个答案:

答案 0 :(得分:0)

ForEach($a in $SiteTML)是罪魁祸首,导致它多次循环。

我能够通过消除循环并用以下代码来解决它:

$SiteVars = $SiteTML | Where{$_.Site -match $site}

然后,只要$SiteTML.SITE条目与$site条目($Sort.mnemonic)匹配,我就可以捕获$SiteTML中的相关条目(电子邮件地址)和在这里使用它们:

$msg.To.Add($SiteVars.tech1)
If($SiteVars.tech2 -ne "NONE"){$msg.CC.Add($SiteVars.tech2)}
If($SiteVars.tech3 -ne "NONE"){$msg.CC.Add($SiteVars.tech3)}
$msg.CC.Add($SiteVars.supervisor)

现在我收到技术人员/主管在报告问题时接收电子邮件的预期结果。

感谢Dave和EBGreen提供帮助。