5

すべて、MSBuild で外部の Power Shell スクリプト ファイルを実行しようとしています。ただし、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" />
4

2 に答える 2

3

そうです、コンソール (マイナーな点 - powershell.exe は cmd.exe の下では実行されません - これらは別のプロセスですが、どちらもコンソール ウィンドウを使用します) ウィンドウは非表示になっているため、入力を求めるとフリーズするように見えます。ここでの最も簡単なオプションは、グラフィカル ウィンドウを使用してプロンプトを表示するバージョンで read-host 関数をオーバーライドすることです。スクリプトの開始を追加し、次の関数を追加します。

# 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ただし、上記の機能が機能しなくなることはありません。

于 2014-01-05T16:30:47.120 に答える
2

MSBuild Exec タスクは cmd.exe を開始し、コマンドを実行させます。cmd.exe ウィンドウ自体が非表示であるため、MSbuild はコンソールへの書き込みをチャネルする必要があります。書き込みは通過するようですが、読み取りは通過しません。powershell を呼び出す代わりに、確認を求める "del c:\temp\somefile.txt /p" のようなコマンドを実行すると、同じ効果が得られます。そうすればブロックされませんが、答えを出す方法もありません。

読み取りを適切に処理しないことは、それほど奇妙ではありません。これはビルド スクリプトなので、ビルドするだけで、質問をする必要はありません。私のアドバイスは、質問をせずに MSBuild スクリプトを実行することです。本当に質問する必要がある場合は、MSBuild を呼び出す前に質問してください。

于 2014-01-03T13:58:45.763 に答える