Назад | Перейти на главную страницу

Запрос PowerShell для продолжения выполнения кода

У меня есть сценарий, который я использую для автоматизации WSUS процессы, и на последнем этапе удаляются все старые / ненужные файлы / объекты.

Я хотел бы предложить «Нажмите« Enter », чтобы продолжить удаление, или любую другую клавишу, чтобы остановить» перед этапом очистки, чтобы дать людям возможность не запускать его.

Код, который у меня сейчас есть в конце скрипта, находится здесь:

Get-WsusServer 10.1.1.25 -PortNumber 8530 | Get-WsusUpdate -Classification All -Approval Unapproved -Status FailedOrNeeded | Approve-WsusUpdate -Action Install -Target $ComputerTarget -Verbose

Write-Host "Updates have been approved!"
Write-Host "Preparing to clean WSUS Server of obsolete computers, updates, and content files."

#Part2 - WSUS Server Cleanup

##Run Cleanup Command
Get-WsusServer $WSUS_Server -PortNumber $PortNumber | Invoke-WsusServerCleanup -CleanupObsoleteComputers -CleanupObsoleteUpdates -CleanupUnneededContentFiles

Непосредственно перед # Part2 я хотел бы получить подсказку: «Нажмите Enter, чтобы продолжить, или любую другую клавишу, чтобы прервать»

Есть простой способ сделать это?

Все, что я видел, похоже, включает в себя вложение всего сценария внутри блока кода, чего я бы предпочел не делать. знак равно

Еще одно простое решение - использовать:

Read-Host -Prompt "Press any key to continue or CTRL+C to quit" 

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

Просто добавьте -confirm в команду Invoke-WsusServerCleanup. Он встроен.

Вы можете использовать опцию предупреждения о записи. довольно гладкий:

Write-Warning "This is only a test warning." -WarningAction Inquire
WARNING: This is only a test warning.
Confirm
Continue with this operation?
 [Y] Yes  [A] Yes to All  [H] Halt Command  [S] Suspend  [?] Help (default is "Y"):

Видеть Приостановка скрипта до тех пор, пока пользователь не нажмет клавишу

Соответствующие строки сценария:

Write-Host "Press enter to continue and CTRL-C to exit ..."
$x = $host.UI.RawUI.ReadKey("NoEcho,IncludeKeyDown")

Вы можете добавить проверку ввода и обернуть это циклом, если вам действительно нужна всего одна клавиша для продолжения. Вы также можете добавить else для выхода из скрипта, но я бы рекомендовал просто напомнить пользователю, что ctrl-c выйдет. Зачем кодировать что-то встроенное.

На любом этапе, на котором вы хотите, чтобы PowerShell задержался, напишите Pause в вашем коде. PowerShell будет сидеть на «Нажмите Enter, чтобы продолжить ...:», пока вы не нажмете Войти или закрыть оболочку /ISE.

Вы можете вставить Read-Host командлет, а затем обработайте входное значение нужным образом.

$userInput = Read-Host 

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

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

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

Итак, как пример, вот простая функция, которая вызывает себя, чтобы повторно сформулировать вопрос, когда ввод не такой, как ожидалось.

function Get-SomeInput {
    $input = read-host "Please write yes or no and press Enter"

    switch ($input) `
    {
        'yes' {
            write-host 'You wrote yes'
        }

        'no' {
            write-host 'You wrote no'
        }

        default {
            write-host 'You may only answer yes or no, please try again.'
            Get-SomeInput
        }
    }
}

Get-SomeInput