0

HELP の出力のすべての行から最初の単語を変数に取得し、この変数をエコーするコードを作成しようとしています。これが私のコードです:

@echo off
set a=
for /F "tokens=1,*" %%i in ('help') do (
set a=%a% %%i 
)
echo %a%

ただし、最後の行からのみ最初の単語を返します。なんで?

4

3 に答える 3

3

Bali C は前述のとおり問題を解決しましたが、HELP で見つかったコマンドのリストを取得しようとしているように見えます。

一部のコマンドは複数行に渡って表示されるため、無関係な単語が表示されます。また、英語のマシンには「For」で始まる先頭行と末尾行がありますが、これは望ましくありません。

コマンドのリストを作成する英語のマシンの短いスクリプトを次に示します。FINDSTR コマンドは、言語ごとに変更する必要があります。

@echo off
setlocal enableDelayedExpansion
set "cmds="
for /f "eol= delims=." %%A in ('help^|findstr /bv "For"') do (
  for /f %%B in ("%%A") do set "cmds=!cmds! %%B"
)
set "cmds=%cmds:~1%"
echo %cmds%


編集

Ansgar Wiechers は、 https://stackoverflow.com/a/12733642/1012053でコマンド名だけを抽出するためのより効率的なアルゴリズムを思いつきました。これは、すべての言語で動作するはずです。以下のコードを単純化するために、彼のアイデアを使用しました。

@echo off
setlocal enableDelayedExpansion
set "cmds="
for /f %%A in ('help^|findstr /brc:"[A-Z][A-Z]*  "') do set "cmds=!cmds! %%A"
set "cmds=%cmds:~1%"
echo %cmds%
于 2012-10-04T12:14:34.753 に答える
2

forループで遅延展開を使用する必要があります

@echo off
setlocal enabledelayedexpansion
set a=
for /F "tokens=1,*" %%i in ('help') do (
set a=!a! %%i 
)
echo %a%

変数%の前後に 'sを使用する代わりに、's を使用して遅延展開を使用します。a!

于 2012-10-04T09:38:41.953 に答える
1

エコーはド外だから(……)

@echo off
for /F "tokens=1,*" %%i in ('help') do (
echo %%i
)

a を印刷する必要はありません。%%i を直接使用できます。
もう 1 つの非常に単純な例は、help1.cmd として保存されたこのようなバッチです。

@echo off
for /F "tokens=1,*" %%i in ('help') do (
if /I "%%i" EQU "%1" echo %%j
)

このバッチを次のように呼び出します

help1 MKDIR 

MKDIR コマンドの短いヘルプ テキストを取得するには

于 2012-10-04T09:23:38.613 に答える