У меня есть скрипт, который считывает данные из двух 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
].
Issue
Вместо заполнения списка, скрипт завершается и возвращается к началу.Он показывает правильные сайты, но вместо завершения цикла ForEach
и компиляции сайтов с ошибками он возвращается на первый сайт и бесконечно повторяет весь список.
Примечание: я адаптировал это из скрипта Iнаписал для одного пользователя.Эта версия предназначена для того, чтобы иметь один главный список для всех пользователей, и в начале есть выбор пользователя [исключено из этого вопроса].Кажется, я не могу найти то, что сделал неправильно, хотя у меня тоже есть свой оригинальный сценарий.
Полный сценарий выглядит следующим образом:
$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
для этого сайта в качестве переменных.