1. ホーム
  2. powershell

[解決済み] powershellスクリプトで、最後に改行を入れずにWrite-Warningすることはできますか?

2022-03-03 21:02:05

質問

PowerShellでWarningをプロンプトとして表示し、同じ行で答えを読みたい。問題点は Write-Warning はメッセージの末尾に改行を表示し、1つの選択肢となります。 Read-Host -Prompt は、プロンプトを警告ストリームに出力しません(または黄色で出力します)。私が見たのは Write-Warning -WarningAction Inquire しかし、これは少し冗長で、私が必要としないオプションを提供しているように思います。

私が行ったことのあるベストは

  $warningMsg= "Something is wrong. Do you want to continue anyway Y/N? [Y]:"
  Write-Host -ForegroundColor yellow -NoNewline $warningMsg
  $cont = Read-Host

黄色のプロンプトが表示され、同じ行に入力が読み込まれるという素晴らしい仕組みです。 Write-Host もし、改行せずに警告ストリームにプリントする方法を見つけた方が適切であれば、教えてください。そのような方法はあるのでしょうか?私が気づいたのは Write-Host は Info ストリームに書き込むためのラッパーであるようですが、改行せずに警告に書き込む方法はないようです ( [Console]::Warning.WriteLine() は存在しないなど)。

どのように解決するのですか?

でやりたいことができない。 Write-Warning .

そこで、もう一つのご懸念についてお答えします。 Write-Host は、PowerShell 5+のスクリプトで使用しても全く問題ありません。

その使用を推奨している記事を見ると、(すべてではないにしても)その大半がPowerShell 5の導入前に書かれたものであることに気づくでしょう。

現在では Write-Host のラッパーです。 Write-Information .

公式ドキュメント を確認することができます。

Windows PowerShell 5.0 で起動します。 Write-Host のラッパーです。 Write-Information これにより Write-Host に出力することができます。 情報ストリームに を捕捉または抑制することができます。 を使用して書き込まれたデータは Write-Host 後方互換性を維持しながら 互換性があります。

$InformationPreference プリファレンス変数と -InformationAction 共通パラメータは Write-Host のメッセージを表示します。ただし、例外として このルールは
-InformationAction Ignore を効果的に抑制することができます。 Write-Host を出力します。

を使った情報ストリームへの書き込み Write-Host と/または Write-information は、出力文字列に問題を生じさせません。

Stream #    Description          Introduced in
1           Success Stream       PowerShell 2.0
2           Error Stream         PowerShell 2.0
3           Warning Stream       PowerShell 3.0
4           Verbose Stream       PowerShell 3.0
5           Debug Stream         PowerShell 3.0
6           Information Stream   PowerShell 5.0
*           All Streams          PowerShell 3.0

ボーナス

また、高度な機能を使用する場合は、情報ストリームの可視性を -InformationAction パラメータにバインドしている場合、与えられたパラメータ値を Write-Host ステートメントを関数内で使用します。

例えば、特に要求がない限り、情報ストリームをデフォルトで無効にしたい場合。

function Get-Stuff {
     [CmdletBinding()]
     param ()

     if (!$PSBoundParameters.ContainsKey('InformationAction')) {
        $InformationPreference = 'Ignore'
     }
     Write-Host 'This is the stuff'  -InformationAction $InformationPreference -ForegroundColor Green
}

# Hidden by default
Get-Stuff
# Force it to show
Get-Stuff -InformationAction Continue


備考

技術的には Write-Warning -NoNewLine カーソル位置を操作して、前の行の末尾にリセットすることで、同じことができます。

しかし、私はその経験が少なく、このテーマに関して私が見たところ、一部のコンソール環境の制限に準拠するために例外を作成する必要が出てくるかもしれません。私見ですが、これは少しやりすぎだと思います...。

追加リファレンス リダイレクトについて