残念ながら、Windows 7(およびVistaもそうだと思います)は、プロンプトの先頭の空白を無視しSET /P
ます。空白文字には、スペース、タブ、および改行なしスペース(0xFF)が含まれます。
解決策は直感的ではありませんが、簡単です。プロンプトの前にバックスペース(0x08)文字を付けるだけです。以下のコードは、バックスペース文字を含む変数をプログラムで定義します。そうすれば、必要に応じてそれを任意のプロンプトに簡単に含めることができます。
@echo off
setlocal
::Define a BS variable containing a backspace (0x08) character
for /f %%A in ('"prompt $H & echo on & for %%B in (1) do rem"') do set "BS=%%A"
echo x 1. Enter x
echo x 2. Leave x
echo xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
echo:
set /p Menu=%BS% Enter number {1,2}:
通常、バックスペースを使用すると、行カーソルが1つの位置をバックアップし、次の文字がそこにあったものを上書きします。ただし、プロンプトは常に最初の位置から開始されるため、プロンプトをバックアップする余地はありません。バックスペースは事実上、プロンプトの先頭の空白を許可するものを何も受け入れません:-)
必要に応じて、バックスペースの前に別の文字を配置できますが、必須ではありません。バックスペースはラインカーソルを1位置上に戻し、目的のプロンプトが不要な文字を上書きします。
set /p Menu=x%BS% Enter number {1,2}:
編集-FOR /F
これはBS変数を定義する行の説明です
このPROMPT
コマンドは、ECHOがオンのときに出力の各行のプレフィックスとして表示されるテキストを制御します。デフォルトでは、現在のディレクトリの後に>
文字が続きます。
を使用するPROMPT $H
と、プロンプトがになります<backspace><space><backspace>
。したがって、次のようなコマンドを実行REM
すると、が出力されます<backspace><space><backspace>REM
。
実行される1行に一連のコマンドがあります。通常、コマンドがECHO ONを発行するのと同じ行に表示されている場合、コマンドはエコーされません。この規則の例外は、FORDO句の一部として表示されるコマンドがエコーされることです。これが、REMコマンドがFORループ内で「実行」される理由です。つまり、REMコマンドの出力を取得します。
コマンドの文字列全体が外部FOR /F
ループ内で実行されます。FOR /F
文字列は、コマンドを実行するように指示するために一重引用符で囲まれています。一重引用符内では、文字列は二重引用符で囲まれています。&
二重引用符は、コマンド連結演算子を保護します。通常、コマンドの文字列を二重引用符で囲むことはできません。しかし、この場合、どのように機能するかによってFOR /F
機能します。コマンドは、を介して暗黙的に実行されますCMD /C "command string"
。したがって、この場合、二重引用符を使用することは完全に許容されます。
二重引用符を使用しない場合は、&
文字を次のようにエスケープする必要があります^
。
('prompt $H ^& echo on ^& for %%B in (1) do rem')
最後に、デフォルトFOR /F DELIMS
は<tab><space>
であるため、REMコマンドの出力はトークンに解析され、最初のトークンのみが保持されます。最終結果は、単一の<backspace>
文字で構成されるBS値です。