4

これは私のTXTです:

echo         x  1.   Enter               x  
echo         x  2.   Leave               x
echo         xxxxxxxxxxxxxxxxxxxxxxxxxxxxx
echo:

set /p Menu=               Enter number {1,2}: 

if not '%Menu%'=='' set Menu=%Menu:~0,1%
if '%Menu%'=='1' goto ConvM

私のtxtは自宅で*.batに変換され、バッチが実行されると、「Enter number {1,2}:」というフレーズの中央部分が区切り文字「x」の真ん中に配置されます。以下に示す結果:

     x  1.   Enter               x  
     x  2.   Leave               x
     xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

          Enter number {1,2}:

私のtxtは、私が働いている会社で* .batに変換され、バッチを実行すると、次のようにオフセットが表示されます。

     x  1.   Enter               x  
     x  2.   Leave               x
     xxxxxxxxxxxxxxxxxxxxxxxxxxxxx

Enter number {1,2}:


txtもCMDに変換しましたが、結果は同じです。自宅にはWindowsXPがあり、職場にはWindows 7があります。

どのコンピューターでも「Enternumber{1,2}:」を「x」で一元化するにはどうすればよいですか。

4

1 に答える 1

4

残念ながら、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値です。

于 2012-08-06T15:57:13.290 に答える