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

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

新規登録して質問してみよう
ただいま回答率
85.50%
if

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

PowerShell

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

コマンドプロンプト

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

メニュー

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

Q&A

解決済

1回答

1848閲覧

[PowerShell]PromptForChoiceでの改行

StrawberryUncle

総合スコア14

if

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

PowerShell

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

コマンドプロンプト

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

メニュー

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

0グッド

0クリップ

投稿2017/09/08 08:02

編集2022/07/14 07:51

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] 終了する。

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

、何を聞いているのかわからない、必要情報が抜けているなど有りましたらお手数ですが教えていただけると幸いです。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

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

PowerShell

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

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

PowerShell

1function Choice { 2 param ( 3 [string]$Title = $null, 4 [string]$Message = "", 5 [string]$Default = $null, 6 [parameter(Mandatory = $true, Position = 0)] 7 [System.Collections.IDictionary]$Selections 8 ) 9 10 if ($Message -eq "" -and (-not $Default)) { $Message = " " } 11 if ($Title) { Write-Host $Title } 12 do { 13 $Selections.GetEnumerator() | 14 ForEach-Object { Write-Host ("[{0}] {1}" -f $_.key, $_.Value) ` 15 -ForegroundColor $(if ($_.Key -eq $Default) {"Yellow"} else {"White"}) } 16 17 $result = Read-Host ("{0}{1}" -f $Message, $(if ($Default) {"(規定値は'$Default')"})) 18 if ($result -eq "") { $result = $Default } 19 } while ($result -notin $Selections.Keys) 20 21 $result 22}

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

PowerShell

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

出力は以下の通りです。

PowerShell

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

投稿2017/09/08 23:39

編集2017/09/20 11:44
mitarai

総合スコア223

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

StrawberryUncle

2017/09/12 07:12

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

2017/09/12 07:22

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問