2014-10-17 6 views
0

Я работаю над скриптом powershell, который ищет определенный файл на удаленном компьютере и передает (сохраняет) их в файл xx.txt, и отправляет электронное письмо с прикрепленным файлом, если сканирование было ОК, если бы оно не было просто отправьте сообщение с сообщением об ошибке. (У меня 70 компьютеров в домене)Обработка 2 списков одновременно

Теперь, что мне нужно сделать, это присоединить имя компьютера с именем пользователя. (Я все еще очень новое с Powershell сценариев)

это скрипт:

$people = Get-Content "D:\Script\people.txt" # list of people. One user per line. 
$computers = Get-Content "D:\Script\list.txt" # list of computers is stored in list.txt file. One coputer name per line 
$day = (get-date).DayOfWeek # day of week 
$time = get-date -Format "HH:mm:ss" # time 
$date = get-date -Format "dd.MM.yyyy" # date 

foreach ($a in $people){}  

foreach ($i in $computers) 

    {$i + $a + "`n" + 
       "=================================================" 
       "|   " + $time + " - " + $day + " - " + $date+"  |"   # 14:57:54 - Friday - 17.10.2014 
       "=================================================" 
       "|  Testing connection on computer $i |" 
       "=================================================" 

       $test_connect = Test-Connection -ComputerName $i -Count 2 -ErrorAction SilentlyContinue # Ping computer with 2 counts and don't dispay errors 

      if ($test_connect -ne $null) # if ping OK, continue with searching for files 
       { 
        "=================================================" 
        "|   Testing connection PASSED   |" 
        "|  Scan started on $i at $a    |" 
        "=================================================" 

        $RemoteSB = $executioncontext.invokecommand.NewScriptBlock("get-childitem c:\*,d:\* -include *.xls,*.xlsx,*.mobi,*.avi,*.mp3,*.mp4,*.csv,*.aif,*.iff,*.mid,*.ra,*.wav,*.wma,*.mov,*.mpg,*.rm,*.wmv,*.epub -exclude *.xlm -recurse") 
        invoke-command -computername $i -scriptblock $RemoteSB -ErrorAction SilentlyContinue > X:\$i.txt 

       $smtpTo = "[email protected]" 
       "=================================================" 
       "|    Search done on $i    |" 
       "|   Continuing to next computer   |" 
       "|  email report sent to $smtpTo  |" 
       "|   !!!! SCAN COMPLETE !!!    |" 
       "=================================================" 
       "        " 
       $file = "X:\$i.txt" # file name list of computers and their destination PATH$ 
       $smtpServer = "smtp.gmail.com" # enter your SMTP server 
       $smtpFrom = "[email protected]" # send email FROM address 
       $smtpTo = "[email protected]" # send email TO address 
       $messageSubject = "Scan Done for computer $i on $date" # SUBJECT line 
       $messagebody = "Scan for computer $i is done on $day $date at $time, continuing to next one. This computer belongs to $a." #email BODY text 
       Send-MailMessage -SmtpServer $smtpServer -To $smtpTo -From $smtpFrom -Subject $messageSubject -Body $messagebody -attachment $file # Sendmail command 

       } 

      else # if PING fails send email with error 
       { 
        "=================================================" 
        "|    !!!! ERROR !!!     |" 
        "=================================================" 
        "=================================================" 
        "|  Testing connection on $i FAILED  |" 
        "=================================================" 
        " " 

       $smtpServer = "smtp.gmail.com" # enter your SMTP server 
       $smtpFrom = "[email protected]" # send email FROM address 
       $smtpTo = "[email protected]" # send email TO address 
       $messageSubjectError = "!!!ERROR!!! Scan for computer $i failed" # SUBJECT line 
       $messagebodyError = "Error Scan for computer $i at $day $date on $time, continuing to next one." # email BODY text 
       Send-MailMessage -SmtpServer $smtpServer -To $smtpTo -From $smtpFrom -Subject $messageSubjectError -Body $messagebodyError # Sendmail command 

       } 
     } 

Скрипт работает отлично, если я не ставлю первый Еогеасп ($ а в $ людей) {} Я думаю, что-то отсутствует ($ a в $ people) {XXXXXXXXX} или аналогично, но я до сих пор не понимаю, что.

Если кто-нибудь может помочь, я буду более чем ценен.

рассматривает

Neven Gotovac

UPDATE:

Пробовал с ответом ниже, но это не сработало, или я положил его в неправильной линии. вывод скрипта выглядит так. Если вы проверите, вы увидите, что имя «augustin» повторяется всегда. Вместо этого он должен быть изменен как имя компьютера.

PS C:\Users\Administrator> D:\Script\run3.ps1 
    c04 - augustin 
    ================================================= 
    |   17:44:29 - Friday - 17.10.2014  | 
    ================================================= 
    |  Testing connection on computer c04 | 
    ================================================= 
    ================================================= 
    |    !!!! ERROR !!!     | 
    ================================================= 
    ================================================= 
    |Testing connection on c4 for augustin FAILED | 
    ================================================= 

    C37 - augustin 
    ================================================= 
    |   17:44:29 - Friday - 17.10.2014  | 
    ================================================= 
    |  Testing connection on computer C37  | 
    ================================================= 
    ================================================= 
    |    !!!! ERROR !!!     | 
    ================================================= 
    ================================================= 
    |Testing connection on C37 for augustin FAILED | 
    ================================================= 

    C51 - augustin 
    ================================================= 
    |   17:44:29 - Friday - 17.10.2014  | 
    ================================================= 
    |  Testing connection on computer C51  | 
    ================================================= 
    ================================================= 
    |    !!!! ERROR !!!     | 
    ================================================= 
    ================================================= 
    |Testing connection on C51 for augustin FAILED | 
    ================================================= 

Я @ Matt поставили скобки, как вы сказали, но он все еще повторяет имя пользователя :(это проблема, если имя пользователя есть точка в середине firstname.lastname в people.txt файле

+0

Должны ли быть отношения между человеком и компьютером? Как сказал Мэтт, ваш текущий код перечисляет каждого человека для каждого компьютера. –

+0

Да, это должно быть отношения.Пример: c01 - augustin –

ответ

3

Я до сих пор проверить весь код, но один вопрос, который я вижу, если эта линия

foreach ($a in $people){} 

в то время как это будет работать выражение, присваиваемое пусто {}. Вы должны переместить закрывающей скобки в конце сценария.

foreach ($a in $people){}  
foreach ($i in $computers) 

    {$i + $a + "`n" + 
       "=================================================" 
       "|   " + $time + " - " + $day + " - " + $date+"  |"   
       "=================================================" 
       #truncated to save space    
    } 

Должно быть вместо

foreach ($a in $people){  
foreach ($i in $computers) 

    {$i + $a + "`n" + 
       "=================================================" 
       "|   " + $time + " - " + $day + " - " + $date+"  |"   
       "=================================================" 
       #truncated to save space    
    } 
} 

Логика у вас есть слышать whould обрабатывать каждый человек $a для каждого компьютера $i

Обновление от вопроса редактировать

Я думаю, что вам нужно проверить каждый компьютер с соответствующим пользователем, правильно? Если это так, вы можете повторить через один индексный цикл. Существует лучший способ сделать это, но это будет хорошо сочетаться с вашим текущим кодом.

For($index=0;$index -lt $people.Count; $index++){ 
    $a = $people[$index] 
    $i = $computers[$index] 

    $i + $a + "`n" + 
    #... Process Stuff Here 

} 

Используйте это вместо циклов for в вашем текущем коде.

+0

Он меняет имя пользователя, когда скрипт заканчивается (проверяет все компьютеры) –

+0

Код работает так, как я это сделал, и теперь из вашего обновления я думаю, что вижу то, что вы хотели. Вы хотите объединить содержимое файлов? Т.е. пользователь в первой строке '$ people' соответствует первой строке в' $ computers'. Вам показалось, что вы хотите проверить всех пользователей на всех компьютерах. Оба текстовых файла имеют такую ​​же длину? – Matt

+0

Да, я хочу объединиться. Как вы это понимаете. Да, они такие же. –

Смежные вопросы