$ 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
的该网站的电子邮件地址作为变量。
答案 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提供帮助。