Для цикла в Powershell для выполнения x различных перезапусков сервера - PullRequest
0 голосов
/ 30 августа 2018

Я пытался выполнить x различных перезапусков сервера с помощью скрипта PowerShell, но как только он запускает цикл for, он просто заканчивается, и я не знаю, где я допустил ошибку.

Код:

$x = Read-Host "How much you want to restart"

for ($i=0; $i -eq $x; $i++)
{
    $name = read-host "Enter Servername" $i "to restart"
    Restart-Computer -ComputerName $name -wait
    write-host "Server" $name "restarded"
}

Редактировать: спасибо за ответ. Я исправил $i++, но он все равно заканчивается сразу после ввода номера.

Ответы [ 3 ]

0 голосов
/ 30 августа 2018

Используйте @ ответ Михаила Б. , чтобы улучшить свой код, но ниже вы найдете объяснение, почему ваш код не работает должным образом.


Ваш скрипт никогда не войдет в цикл for из-за неверного условия.

Здесь вы ожидаете выполнить командный блок, когда $i равно $x:

for ($i=0; $i -eq $x; $i++)

Когда вы инициализируете $i значением 0, он проверит, что условие ложно и никогда не выполнит блок команд.

Если вы хотите, чтобы командный блок выполнялся x раз, ваш цикл должен выглядеть следующим образом:

for ($i=0; $i -lt $x; $i++) {
  # command block
}

Кроме того, вы можете использовать -ne вместо -lt.

Примеры для проверки:


Рабочая версия

$x = 5
for ($i=0; $i -lt$x; $i++) {$i}

Выход:

0
1
2
3
4

нерабочая версия

$x = 5
for ($i=0; $i -eq $x; $i++) {$i}

Вывод пуст

0 голосов
/ 30 августа 2018

Может быть полезно инкапсулировать код перезагрузки отдельно от набора COMPUTERNAME. Это позволило бы создать список компьютеров из сценария, запрашивающего имена, или любого другого метода.

Если вы уверены, что нужные компьютеры будут перезагружены, удалите -WhatIf из командлета Restart-Computer.

=== Do-Reboot.ps1

[cmdletbinding()]
Param (
    [Parameter(Mandatory = $true, Position = 0)]
    [string[]]$ComputerName
)

foreach ($Computer in $ComputerName) {
    Write-Information "reboot $Computer"
    Restart-Computer -ComputerName $Computer -Wait -WhatIf
}

Тогда его можно использовать:

Do-Reboot -ComputerName SERVER1,SERVER2,SERVER3

Если вы хотите видеть что-то на консоли для каждой перезагрузки, используйте:

Do-Reboot -ComputerName SERVER1,SERVER2,SERVER3 -InformationAction Continue

Если у вас есть список серверов в текстовом файле, это можно использовать.

Do-Reboot -ComputerName $(Get-Content -Path '.\rebootlist.txt')
0 голосов
/ 30 августа 2018

arco444 ответ должен решить вашу проблему. Тем не менее, может быть, интереснее написать свой код так:

$serverList = @()

Do {
    $name = read-host "Enter Servername to restart"
    if ($name) {
        $serverList += $name
    }
} While ($name)

Foreach ($server in $serverList) {
    Restart-Computer -ComputerName $server -wait
    write-host "Server $server restarded"
}

Это будет продолжать запрашивать имя сервера, пока вы не предоставите ни одного. Затем он перезапустит серверы.

Или:

Do {
    $name = read-host "Enter Servername to restart"
    if ($name) {
        Restart-Computer -ComputerName $name -wait
        write-host "Server $name restarded"
    }
} While ($name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...