批量菜单概述和设计

时间:2016-01-24 15:20:57

标签: windows batch-file

前一段时间我正在谷歌上搜索我如何制作一个具有更“专业外观”的批处理菜单,而不是使用如下符号:

|=====|
|-----|
|_____|

批量生成菜单。 但我没有运气。 今天我随机找到了这个网站:

http://http-server.carleton.ca/~dmcfet/menu.html

它解释说通过使用ms-dos(edit.com)我可以做到这一点。 但是因为我的电脑是64位的胜利10.我点了edit.com所以....我怎么能用手工制作这种菜单? (printing special characters shown on left side of the header "STEP 3, Lines, Lines, Lines.")

4 个答案:

答案 0 :(得分:2)

这是我一直在研究的批处理+ PowerShell菜单制作工具。设置批处理部分中的值,PowerShell内容将根据需要自动调整大小并重新定位。进行选择后,控制台缓冲区将恢复其以前的内容,从而有效地消除了菜单。

看起来像这样:

arrow navigated menu

这是代码。用.bat扩展名保存。

<# : Batch portion
@echo off & setlocal enabledelayedexpansion

set "menu[0]=Format C:"
set "menu[1]=Send spam to boss"
set "menu[2]=Truncate database *"
set "menu[3]=Randomize user password"
set "menu[4]=Download Dilbert"
set "menu[5]=Hack local AD"

set "default=0"

powershell -noprofile "iex (gc \"%~f0\" | out-string)"
echo You chose !menu[%ERRORLEVEL%]!.

goto :EOF
: end batch / begin PowerShell hybrid chimera #>

$menutitle = "=== MENU ==="
$menuprompt = "Use the arrow keys.  Hit Enter to select."

$maxlen = $menuprompt.length + 6
$menu = gci env: | ?{ $_.Name -match "^menu\[\d+\]$" } | %{
    $_.Value.trim()
    $len = $_.Value.trim().Length + 6
    if ($len -gt $maxlen) { $maxlen = $len }
}
[int]$selection = $env:default
$h = $Host.UI.RawUI.WindowSize.Height
$w = $Host.UI.RawUI.WindowSize.Width
$xpos = [math]::floor(($w - ($maxlen + 5)) / 2)
$ypos = [math]::floor(($h - ($menu.Length + 4)) / 3)

$offY = [console]::WindowTop;
$rect = New-Object Management.Automation.Host.Rectangle `
    0,$offY,($w - 1),($offY+$ypos+$menu.length+4)
$buffer = $Host.UI.RawUI.GetBufferContents($rect)

function destroy {
    $coords = New-Object Management.Automation.Host.Coordinates 0,$offY
    $Host.UI.RawUI.SetBufferContents($coords,$buffer)
}

function getKey {
    while (-not ((37..40 + 13 + 48..(47 + $menu.length)) -contains $x)) {
        $x = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown').VirtualKeyCode
    }
    $x
}

# http://goo.gl/IAmdR6
function WriteTo-Pos ([string]$str, [int]$x = 0, [int]$y = 0,
    [string]$bgc = [console]::BackgroundColor, [string]$fgc = [Console]::ForegroundColor) {
    if($x -ge 0 -and $y -ge 0 -and $x -le [Console]::WindowWidth -and
        $y -le [Console]::WindowHeight) {
        $saveY = [console]::CursorTop
        $offY = [console]::WindowTop       
        [console]::setcursorposition($x,$offY+$y)
        Write-Host $str -b $bgc -f $fgc -nonewline
        [console]::setcursorposition(0,$saveY)
    }
}

function center([string]$what) {
    $what = "    $what  "
    $lpad = " " * [math]::max([math]::floor(($maxlen - $what.length) / 2), 0)
    $rpad = " " * [math]::max(($maxlen - $what.length - $lpad.length), 0)
    WriteTo-Pos "$lpad   $what   $rpad" $xpos $line blue yellow
}

function menu {
    $line = $ypos
    center $menutitle
    $line++
    center " "
    $line++

    for ($i=0; $item = $menu[$i]; $i++) {
        # write-host $xpad -nonewline
        $rtpad = " " * ($maxlen - $item.length)
        if ($i -eq $selection) {
            WriteTo-Pos "  > $item <$rtpad" $xpos ($line++) yellow blue
        } else {
            WriteTo-Pos " $i`: $item  $rtpad" $xpos ($line++) blue yellow
        }
    }
    center " "
    $line++
    center $menuprompt
    1
}

while (menu) {

    [int]$key = getKey

    switch ($key) {

        37 {}   # left or up
        38 { if ($selection) { $selection-- }; break }

        39 {}   # right or down
        40 { if ($selection -lt ($menu.length - 1)) { $selection++ }; break }

        # number or enter
        default { if ($key -gt 13) {$selection = $key - 48}; destroy; exit($selection) }
    }
}

答案 1 :(得分:1)

根本不必担心代码页或文件编码。

在Windows 10上,您可以使用Character Set - DEC Line Drawing Mode
它使用ansi-escape序列显示边框。
边框字符由字符jklmnqtuvwx表示。

for /F "delims=#" %%E in ('"prompt #$E# & for %%E in (1) do rem"') do set "\e=%%E"

REM *** Enable DEC Line Drawing Mode
echo %\e%(0

echo lqqk
echo x  x
echo x  x
echo mqqnqqk
echo    x  x
echo    mqqj

REM *** Enable ASCII Mode (Default)
echo %\e%(B

输出为

┌──┐
│  │
│  │
└──┼──┐
   │  │
   └──┘

答案 2 :(得分:0)

FIX: 为了创建这样的菜单。你需要使用记事本++等编辑器 打开一个新的记事本++文件。然后转到格式并选择西欧OEM-US字符集。

然后只需到这里:https://en.wikipedia.org/wiki/Box-drawing_character
并在记事本++中复制粘贴所需菜单符号并保存。

例如: 显示在记事本++中:

echo                                   ÉÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ»
echo                                   ºBill register/database Menu º
echo                                   ÌÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ͹
echo                                   º   1. -Register a bill      º
echo                                   º   2. -Check Bill Info      º
echo                                   º   3. Set payment           º
echo                                   ÈÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍͼ

显示在普通记事本中:

create table article (
   id integer primary key,
   body nvarchar(max) not null,
   -- Allow six versions. (Original plus five revisions.)
   revisions integer not null
      check (revisions between 0 and 5)
);

insert into article values (1, 'a', 0);

update article 
set body = 'b', revisions = 1 
where id = 1;

update article 
set body = 'c', revisions = 2 
where id = 1;

-- Other updates . . .

-- This update will *always* fail with an error.
update article
set body = 'f', revisions = 6 
where id = 1;

所以你可以看到。它也适用于普通的记事本。但它更容易在notepad ++中使用它,因为它显示它实际上的样子。

答案 3 :(得分:0)

对于记事本, ASCII CHCP 1250 / CHCP 1252 字符为:

<强> É Í » ş Č Ľ