2

Google Apps API と連携し、Oauth2 認証を必要とするコマンドレットを作成しています。ユーザーが認証されずにコマンドレットを実行しようとすると、トークンを更新するだけではなく、ブラウザーから提供されたアクセス コードを入力する必要があります。(これですべて解決しました。) 必要に応じてコマンドレットを一時停止し、入力を待ってから、確認が済んだら続行したいと思います。

ただし、現在これを行うには、エラーをスローして現在のコマンドレットを終了し、ユーザーにアクセス コードを引数として別のコマンドレットに渡すように指示する必要があります (不格好です)。

私は C# の Console.Readline のようなものを呼び出す方法を探していました (これはコマンドレットの実行時にスキップされます)、またはRead-Host コマンドレットを呼び出そうとしています。ユーザーからアクセスコードを取得すると、コードは通常どおり実行し続けることができます。必ずしも「Powershell 方式」ではないことは承知していますが、これらのツールのために、それがユーザーにとって最良の選択肢であると感じています。

この方法を試してみると:

ReadHostCommand read = new ReadHostCommand();
read.prompt = "Access Code";
foreach (string s in read.Invoke<string>()) {
    WriteObject(s);
}

エラーが表示されます: PSCmdlet から派生したコマンドレットを直接呼び出すことはできません。

そのエラーを検索して、次のように新しい Host オブジェクトを作成しようとしましたが、別のエラーが発生しました (これも次のとおりです)。

PowerShell ps = PowerShell.Create();
ps.AddCommand("Read-Host");
foreach (PSObject result in ps.Invoke()) {
    WriteObject(result);
}

Read-Host : ホスト プログラムまたはコマンド タイプがユーザーの操作をサポートしていないため、ユーザーにプロンプ​​トを表示するコマンドが失敗しました。Windows PowerShell コンソールや Windows PowerShell ISE などのユーザー操作をサポートするホスト プログラムを試し、Windows PowerShell ワークフローなどのユーザー操作をサポートしないコマンド タイプからプロンプト関連のコマンドを削除します。

ユーザーから文字列を取得するためにコマンドレットを一時停止する方法はありますか?

編集:明確にするために、PowershellコンソールまたはISEなどから実行するコマンドレットを作成しており、コマンドレットの実行中にユーザーから入力を取得する必要があります。

4

2 に答える 2

5

コマンドレットが PSCmdlet から派生している場合は、を使用しthis.InvokeCommand.InvokeScript()てコマンドレットを呼び出しRead-Hostます。または、メソッドを使用することもできますthis.Host.UI.Prompt*/Read*()

于 2013-04-04T15:58:09.597 に答える
0

実際に PSHost を (PSHostUserInterface および PSHostRawUserInterface クラスと共に) 実装する必要があるようです。そうすることで、read-host と write-host を使用して (おそらく console.readline を使用して) ユーザーと対話する機能を実装します。

于 2013-03-27T20:10:04.517 に答える