Повтор всех позиций в PowerShell - PullRequest
0 голосов
/ 16 мая 2018

У меня есть скрипт, который считывает данные из двух 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 для этого сайта в качестве переменных.

1 Ответ

0 голосов
/ 17 мая 2018

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)

Теперь я получаю ожидаемый результат, когда технические специалисты / руководители получают электронные письма для своего сайта, когда сообщается о проблеме.

Спасибо Дейву и EBGreen за помощь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...