Использование командлета read-host при выполнении файла сценария powershell в MSBuild

Все, я пытаюсь выполнить файл сценария оболочки внешнего питания в MSBuild. Но каждый раз при запуске PS командлет Read-Host. MSBuild кажется остановленным. и не предлагает мне ввести данные. Я не знаю, что с этим случилось. Вроде консоль в тупике .. спасибо.

введите описание изображения здесь

Код testloop.ps1 показан ниже.

$ErrorActionPreference = 'Stop'
$error.clear()


function GetAzureSubScription()
{
    read-host "please input something :"
} 

write-host "Get into script"

GetAzureSubScription

Код MSBuild приведен ниже (для ясности обернут):

<Exec WorkingDirectory="$(MSBuildProjectDirectory)" 
    Command="$(windir)\system32\WindowsPowerShell\v1.0\powershell.exe -f
    E:\Work\AutoDeploy\testloop.ps1" />

person Joe.wang    schedule 03.01.2014    source источник


Ответы (2)


Итак, да, окно консоли (просто второстепенный момент - powershell.exe не запускается под cmd.exe - это отдельные процессы, но они оба используют окно консоли) окно скрыто, поэтому при запросе ввода оно будет зависать. Самый простой вариант здесь - переопределить функцию чтения-хоста версией, которая будет запрашивать в графическом окне. Добавьте начало вашего скрипта, добавьте следующую функцию:

# override the built in prompting, just for this script
function read-host($prompt) {
    $x = 0; $y = 0;
    add-type -assemblyname microsoft.visualbasic
    [Microsoft.VisualBasic.Interaction]::InputBox($prompt,
        "Interactive", "(default value)", $x, $y)
}

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

person x0n    schedule 05.01.2014
comment
Идеально! Я не думал делать это в PowerShell. Спасибо. - person Joe.wang; 08.01.2014

Задачи MSBuild Exec запускают cmd.exe и позволяют ему выполнить команду. MSbuild должен направлять записи в консоль, поскольку само окно cmd.exe невидимо. Кажется, что записи проходят, а чтения - нет. Вы можете увидеть тот же эффект, если вместо вызова powershell вы выполните команду типа «del c: \ temp \ somefile.txt / p», которая запрашивает подтверждение. Хотя таким образом он не блокируется, но и нет возможности дать ответ.

То, что он не обрабатывает чтение должным образом, не так уж странно. Это сценарий сборки, поэтому он должен просто создавать, а не задавать вопросы. Я советую запускать сценарий MSBuild, не задавая вопросов. Если вам действительно нужно задать вопросы, задайте их, прежде чем звонить в MSBuild.

person Lars Truijens    schedule 03.01.2014
comment
окна cmd.exe нет - просто окно консоли;) - person x0n; 05.01.2014
comment
MSBuild действительно порождает cmd.exe. См. Примечания: msdn.microsoft.com/en-us/library/x8zx72cd. aspx Я также подтвердил это с помощью диспетчера задач - person Lars Truijens; 05.01.2014
comment
хорошо, в этом случае это родительский процесс. Многие до сих пор считают, что все консольные процессы - это окна cmd.exe. - person x0n; 05.01.2014
comment
If you really need to ask questions, then ask them before calling MSBuild.. да. Я согласен. Собственно я и собираюсь это сделать. - person Joe.wang; 08.01.2014