Powershell foreach относительно нескольких коллекций - PullRequest
0 голосов
/ 01 ноября 2018

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

С учетом сказанного, вот что я пытаюсь сделать:

при увеличении как служб, так и типов запуска:

  • остановка службы A ($ services) на сервере X ($ rebootingServer)

  • Отключить службу A ($ services) на сервере X ($ rebootingServer)

    Учитывая: мы знаем, что служба A отключена на сервере Y до запуска сценария

  • Включить службу A на сервере Y на основе списка текстовых файлов $ startuptypes

  • Запуск службы A на сервере Y
  • Промывать и повторять, пока $ services и $ startuptypes не будут в конце каждого списка

Итак, предположим, что $ services имеет:
bits appmgmt

и $ startuptypes имеет:

Automatic Manual

я хочу, чтобы они применялись соответственно (биты> автоматическое приложение> руководство)

Вот что у меня есть:

$services = Get-Content "C:\TEMP\services.txt"
$Startuptypes = Get-Content "C:\TEMP\StartupTypes.txt"
$RebootingServer = Read-Host 'Name of the server that you are bringing down'
$FailoverServer = Read-Host 'Name of the server it is failing over to'


#foreach ($service in $services && $Startuptype in $Startuptypes) {

Invoke-Command -ComputerName $RebootingServer -ArgumentList $service - ScriptBlock {param($service) Stop-Service $service}
Start-Sleep -s 3
Invoke-Command -ComputerName $RebootingServer -ArgumentList $service - ScriptBlock {param($service) set-service $service -StartupType Disabled}
Start-Sleep -s 10
Invoke-Command -ComputerName $FailoverServer -ArgumentList $service $StartupType -ScriptBlock {param($service,$startuptype) Set-Service $service -StartupType $startuptype}
Start-Sleep -s 3
Invoke-Command -ComputerName $FailoverServer -ArgumentList $service - ScriptBlock {param($service) Start-Service $service}
Start-sleep -s 10
}

Оператор 'for each' - это псевдокод того, что я хочу, но пока не уверен, существует ли он или как его написать соответствующим образом. Я даже не знаю, как это будет правильно называться. Несколько условий? Кроме того, как бы я правильно написал, что я пытаюсь достичь? Спасибо за любую помощь в продвинутом.

1 Ответ

0 голосов
/ 01 ноября 2018

Звучит так, будто вы хотите перечислить элементы 2 коллекций в соответствующих парах : на итерации 1 обрабатывать элемент 1 из коллекции A вместе с элементом 1 из коллекции B,. ..

# Sample collections.
# Note that their counts must match.
$services     = 'serviceA', 'serviceB', 'serviceC'
$startupTypes = 'automatic', 'manual', 'disabled '

$i = 0 # helper index var.
foreach ($service in $services) { # enumerate $services directly

   # Using the index variable, find the corresponding element from 
   # the 2nd collection, $startupTypes, then increment the index.
   $startupType = $startupTypes[$i++]

   # Now process $service and $startupType as needed.
}
...