none
Powershellのスクロールバー操作について RRS feed

  • 質問

  • いつもお世話になっております。
    環境は以下の通りです。

    PS C:\Users> $psversiontable
    
    Name                           Value
    ----                           -----
    CLRVersion                     2.0.50727.5466
    BuildVersion                   6.1.7601.17514
    PSVersion                      2.0
    WSManStackVersion              2.0
    PSCompatibleVersions           {1.0, 2.0}
    SerializationVersion           1.1.0.1
    PSRemotingProtocolVersion      2.1

    powershell画面のスクロールバーを操作する方法(コマンド)はないでしょうか?

    実行したいことは、現在の入力待ちの行を一番上に移動させたいです。
    画面内でいうと「Clear-Host」のような動きで今までの内容を削除させずに画面を遷移させたいと考えています。

    (Ex)
    -----------------------------------画面ここから
    1行目:あいうえお
    2行目:かきくけこ
    3行目:さしすせそ
    4行目:■ ←ここにカーソルが点滅
    5行目:
    6行目:
    -----------------------------------画面ここまで


    ↓↓↓↓


    1行目:あいうえお
    2行目:かきくけこ
    3行目:さしすせそ
    4行目:(スクロール操作コマンド?)
    -----------------------------------画面ここから
    5行目:■ ←ここにカーソルが点滅
    6行目:
    7行目:
    8行目:
    9行目:
    A行目:
    -----------------------------------画面ここまで

    ※上にスクロールすれば内容が表示されてる


    Clear-Host関数内にヒントは隠されて・・・いないと考えています。

    $space = New-Object System.Management.Automation.Host.BufferCell
    $space.Character = ' '
    $space.ForegroundColor = $host.ui.rawui.ForegroundColor
    $space.BackgroundColor = $host.ui.rawui.BackgroundColor
    $rect = New-Object System.Management.Automation.Host.Rectangle
    $rect.Top = $rect.Bottom = $rect.Right = $rect.Left = -1
    $origin = New-Object System.Management.Automation.Host.Coordinates
    $Host.UI.RawUI.CursorPosition = $origin
    $Host.UI.RawUI.SetBufferContents($rect, $space)



    • 編集済み keeji.k 2013年5月16日 6:00
    2013年4月19日 4:30

回答

  • こんにちは。

    直接スクロールする手段は知りませんが、[Console]::SetCursorPosition()を使えば一応期待する動作は再現できます。

    手順としては

    ①一度バッファ画面の最下端まで移動

    ②直前の位置に移動

    とすることで強制的にプロンプトの位置を一番上に持ってくることができます。

    後は TabExpansion や PSHostConsoleReadLine で任意のキーを入力した時にその挙動を取るように設定しておくと楽だと思います。

    例えばこんな感じです。( Ctrl-A → TAB )

    ni -Path function:TabExpansion_old -Value $function:TabExpansion function TabExpansion ( $line, $lastword ) { if ( [char]1 -eq $lastword[-1] ) { $y = $Host.UI.RawUI.CursorPosition.Y [Console]::SetCursorPosition(0,$Host.UI.RawUI.BufferSize.Height-1) [Console]::SetCursorPosition(0, $y) [System.Windows.Forms.SendKeys]::SendWait("{Esc}")

    return;

    } TabExpansion_old $line $lastword }


    2013年4月23日 13:55

すべての返信

  • こんにちは。

    直接スクロールする手段は知りませんが、[Console]::SetCursorPosition()を使えば一応期待する動作は再現できます。

    手順としては

    ①一度バッファ画面の最下端まで移動

    ②直前の位置に移動

    とすることで強制的にプロンプトの位置を一番上に持ってくることができます。

    後は TabExpansion や PSHostConsoleReadLine で任意のキーを入力した時にその挙動を取るように設定しておくと楽だと思います。

    例えばこんな感じです。( Ctrl-A → TAB )

    ni -Path function:TabExpansion_old -Value $function:TabExpansion function TabExpansion ( $line, $lastword ) { if ( [char]1 -eq $lastword[-1] ) { $y = $Host.UI.RawUI.CursorPosition.Y [Console]::SetCursorPosition(0,$Host.UI.RawUI.BufferSize.Height-1) [Console]::SetCursorPosition(0, $y) [System.Windows.Forms.SendKeys]::SendWait("{Esc}")

    return;

    } TabExpansion_old $line $lastword }


    2013年4月23日 13:55
  • S.K. _様

    ご回答ありがとうございます。
    また返信が遅くなり申し訳ございません。

    実は、私もSetCursorPositionを用いて同じような関数を作成致しましたが、
    「概ね」良好に動作致しました。

    その概ね・・・というのは、powershellから別プログラム(EXEなど)を呼びそこがWriteなどで画面にメッセージを表示するなどした場合に、powershellは現在のY位置を正確に取得できなくなる事がわかりました。

    ですが、powershell単体での動作としては完璧だと思います。
    (スクロールバーを操作するEXEを作成し、powershellから呼ぶしかないんですかね・・・)

    > 牟田口様
    回答マークありがとうございます。

    2013年5月16日 6:17