Powershell: сбои в окне сообщений делают цикл while - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть этот простой скрипт, который просто получает путь и проверяет, существует ли он.

function getPaths(){

        $pathFromCMS = Read-Host "Please set the path for the copy files"
        $pathToCMS = Read-Host "Please set the path to your CMS application"

        if ((Test-Path -Path $pathFromCMS ) -and (Test-Path -Path $pathToCMS )){
            Return $True
        }
        else{
            [System.Windows.MessageBox]::Show('You have provided wrong path!')
            Return $False
        }
}
do{}while (! (getPaths) -eq $True)

echo "Hello there"

Проблема с функцией MessageBox :: Show. Это как-то заставляет цикл останавливаться при вводе неправильных путей. Когда я изменяю это только для Write-Host "Вы указали неверный путь!" все отлично работает Может кто-нибудь объяснить, почему это происходит, пожалуйста?

Ответы [ 3 ]

0 голосов
/ 26 апреля 2018

MessageBox может иметь разные кнопки (например, ДА / НЕТ) и поэтому отображается синхронно, чтобы вы могли фиксировать то, что пользователь нажимает. Например:

$preference = [System.Windows.MessageBox]::Show('Do you like MessageBoxes?', "MessageBox Preference", [System.Windows.MessageBoxButton]::YesNo)

В вашем случае, даже если вы хотите только «ОК», все же неплохо бы подождать, поскольку пользователю всегда нужно вручную отклонять его, в отличие от вывода из Write-Host.

0 голосов
/ 26 апреля 2018

Метод [System.Windows.MessageBox]::Show возвращает значение, и это нарушает ваше условие цикла. Вы можете подавить возвращаемое значение, отправив на Out-Null:

[System.Windows.MessageBox]::Show('You have provided wrong path!') | Out-Null
0 голосов
/ 26 апреля 2018

Это потому, что в вашем блоке do {} нет ничего для выполнения, пока выполняется условие.

То, что вы хотите:

do{(getPaths)}while ((getPaths) -ne $True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...