質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

91.00%

  • PowerShell

    274questions

    Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

  • コマンドプロンプト

    252questions

    コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

  • if

    167questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

  • メニュー

    19questions

    メニューは、UIにおける仕組みであり、ユーザに機能の表示と実行する手段を与えます。

[PowerShell]PromptForChoiceでの改行

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 1
  • VIEW 354

PowerShellでユーザ選択で処理を分岐させたく、PromptForChoiceを用いて書きました。

$type = "System.Management.Automation.Host.ChoiceDescription"
$one = new-object $type("通常処理を行う。(&1)","1")
$two  = new-object $type("処理1を挟む。(&2)","2")
$three  = new-object $type("処理1のみで終了させる。(&3)","3")
$four  = new-object $type("終了する。(&4)","4")

$asbl= $one.getType().AssemblyQualifiedName
$collect = new-object "System.Collections.ObjectModel.Collection``1[[$asbl]]"
$collect.add($one)
$collect.add($two)
$collect.add($three)
$collect.add($four)

#表示
$ans = $host.ui.PromptForChoice("<メニュー選択>","MENUを選択してください->:",$collect,0)

[1] 通常処理を行う。
[2] 処理1を挟む
[3] 処理1のみで終了させる。
[4] 終了する。

のように表示させたかのたのですが、実行すると以下のように表示されてしまいます。

[1] 通常処理を行う。
[2] 処理1を挟む[3] 処理1のみで終了させる。
[4] 終了する。

これを書き方で希望通り表示させるにはどのような書き方をしたら良いのでしょうか。

入社してから間もないもので、業界の常識がまだ身についておらず聞き方が下手でしたら申し訳ありません。
また、何を聞いているのかわからない、必要情報が抜けているなど有りましたらお手数ですが教えていただけると幸いです。

以上です。よろしくお願いいたします。

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

+1

PromptForChoiceで選択肢が縦に並べて表示されるのは複数選択の時だけではないかと思います。
試しに以下のようにすると縦に表示されると思います。

[int[]]$DefaultChoice = @(0)
$ans = $host.ui.PromptForChoice("<メニュー選択>", "MENUを選択してください->:", $collect, $DefaultChoice)


ですがこれだとご希望の動作にならないでしょう。
なので自分で作るしかないと思います。以下のような関数でどうでしょうか。

function Choice {
    param (
        [string]$Title = $null,
        [string]$Message = "",
        [string]$Default = $null,
        [parameter(Mandatory = $true, Position = 0)]
        [System.Collections.IDictionary]$Selections
    )

    if ($Message -eq "" -and (-not $Default)) { $Message = " " }
    if ($Title) { Write-Host $Title }
    do {
        $Selections.GetEnumerator() |
            ForEach-Object { Write-Host ("[{0}] {1}" -f $_.key, $_.Value) `
                -ForegroundColor $(if ($_.Key -eq $Default) {"Yellow"} else {"White"}) }

        $result = Read-Host ("{0}{1}" -f $Message, $(if ($Default) {"(規定値は'$Default')"}))
        if ($result -eq "") { $result = $Default }
    } while ($result -notin $Selections.Keys)

    $result
}

使い方は以下のようになります。

$selections = [Ordered]@{ 1 = "通常処理を行う。"; 2 = "処理1を挟む"; 3 = "処理1のみで終了させる。"; 4 = "終了する。" }
$ans = Choice -Title "-Menu-" -Message "番号を選択してください" $selections -Default 4


出力は以下の通りです。

-Menu-
[1] 通常処理を行う。
[2] 処理1を挟む
[3] 処理1のみで終了させる。
[4] 終了する。
番号を選択してください (規定値は'4'): 

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/09/12 16:12

    はじめまして。こんにちは。
    この度はソースまで提供していただきとても助かりました。
    とても丁寧なご回答に感謝しています。ありがとうございました。

    キャンセル

  • 2017/09/12 16:22

    肝心なことを伝え忘れてしまいました。
    いただいたソースを元に期待した動作を行うことができました。
    mitarai様のお力添えがあったことで無事解決致しました。
    ありがとうございました。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 91.00%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • PowerShell

    274questions

    Windows PowerShellはコマンドラインインターフェースであり、システム管理を含むWindowsタスク自動化のためのスクリプト言語です。

  • コマンドプロンプト

    252questions

    コマンドプロンプト(cmd.exe)はMicrosoftによって提供されているコマンドラインインタプリタです。OS/2・Windows CE・Windows NTで使用可能です。

  • if

    167questions

    if文とは様々なプログラミング言語で使用される制御構文の一種であり、条件によって処理の流れを制御します。

  • メニュー

    19questions

    メニューは、UIにおける仕組みであり、ユーザに機能の表示と実行する手段を与えます。