Powershell завершается рано после выхода из цикла do-before - PullRequest
0 голосов
/ 29 июня 2018

Я работаю над сценарием Powershell и пытаюсь принять пользовательский ввод из списка параметров. Проблема, с которой я сталкиваюсь, заключается в том, что при выполнении условия выхода (ввод символа «d») сценарий завершается и не выполняет оставшийся код (который должен копировать ярлыки на основе определенного пользователем массива, $ OfficeProgramNames)

#OfficeShortcuts -- Creates shortcuts for the main four Office 2016 applications.

#Optional command-line parameters that can be passed to create icons for All (-a) icons, or a CUSTOM set of icons (-c)
param([switch] $a, [switch] $c)

#Creates a shortcut on the desktop that copies from the start menu shortcuts.
function CreateOfficeDesktopShortcut([string] $ShortcutName)
{
    Copy-Item -Path "C:\ProgramData\Microsoft\Windows\Start Menu\Programs\$ShortcutName.lnk" "$env:USERPROFILE\Desktop"
}

function Show-Menu
{
     Clear-Host
     Write-Host "Select which items you would like placed on the desktop:"

     Write-Host "1: Word"
     Write-Host "2: Excel"
     Write-Host "3: PowerPoint"
     Write-Host "4: Outlook"
     Write-Host "5: Access"
     Write-Host "6: OneNote"
     Write-Host "7: Publisher"
     Write-Host "D: Press 'D' when done."
}

function GetCustomUserSelection($OfficeProgramNames)
{
    $OfficeProgramNames = @()
    do
    {
        Clear-Host
        Show-Menu
        Write-Host "You have selected: $OfficeProgramNames"
        $foo = Read-Host "Please make a selection:"
        switch($foo)
        {
            '1'{
                $OfficeProgramNames += "Word*"
            }
            '2'{
                $OfficeProgramNames += "Excel*"
            }
            '3'{
                $OfficeProgramNames += "PowerPoint*"
            }
            '4'{
                $OfficeProgramNames += "Outlook*"
            }
            '5'{
                $OfficeProgramNames += "Access*"
            }
            '6'{
                $OfficeProgramNames += "OneNote*"
            }
            '7'{
                $OfficeProgramNames += "Publisher*"
            }
            '8'{
                $OfficeProgramNames += "Skype*"
            }
            'd'{
                return
            }
        }
    }
    until ($foo -eq 'd')
    Write-Host "Now do something else"
}

#Loop through the array of Shortcut names, and create a shortcut with a matching alias
function SelectOfficeShortcuts($arg1, $arg2)
{
    [string[]] $OfficeProgramNames = @("Word", "Excel", "PowerPoint", "Outlook")

    if ($a -eq $True)
    {
        $OfficeProgramNames += "Access", "OneNote*", "Publisher"
    }
    elseif($c -eq $True)
    {
        $OfficeProgramNames = @()
        GetCustomUserSelection $OfficeProgramNames
    }
    for ($i=0; $i -lt $OfficeProgramNames.Length; $i++)
    {
        CreateOfficeDesktopShortcut $OfficeProgramNames[$i]
    }
}

SelectOfficeShortcuts($a, $c)

Я попытался вставить пару команд «Write-Host» для отладки и посмотреть, где код перестает завершаться. Я немного сбит с толку, и мне трудно понять, где находится поток управления, поэтому, если кто-то сможет помочь мне с некоторыми разъяснениями, это будет очень цениться!

Для большей наглядности вывод выглядит следующим образом (слегка изменен, поскольку есть некоторые команды Clear-Host):

PS C:\Users\atroach\Documents\GitHub\OfficeShortcuts> .\OfficeShortcuts.ps1 -c

...

Select which items you would like placed on the desktop:
1: Word
2: Excel
3: PowerPoint
4: Outlook
5: Access
6: OneNote
7: Publisher
D: Press 'D' when done.
You have selected: Excel PowerPoint
Please make a selection: d
PS C:\Users\username\Documents\GitHub\OfficeShortcuts>

«SelectOfficeShortcuts ($ a, $ c)» вызывается в конце скрипта, где $ a и $ c - параметры переключения для скрипта.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...