Windows CMD FOR循环

Windows CMD FOR循环,windows,batch-file,cmd,Windows,Batch File,Cmd,我正在尝试编写一个代码,该代码将从帮助的所有输出行中获取第一个单词,并将其返回到一个变量。这是我的密码: @echo off set a= for /F "tokens=1,*" %%i in ('help') do ( set a=%a% %%i ) echo %a% 但它只返回最后一行的第一个单词。为什么?因为回声在do之外(……) 无需打印,您可以直接使用%%i. 另一个非常简单的示例是保存为help1.cmd的批处理 @echo off for /F "tokens=1,*" %%i

我正在尝试编写一个代码,该代码将从帮助的所有输出行中获取第一个单词,并将其返回到一个变量。这是我的密码:

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

但它只返回最后一行的第一个单词。为什么?

因为回声在do之外(……)

无需打印,您可以直接使用%%i.
另一个非常简单的示例是保存为help1.cmd的批处理

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

help1 MKDIR 

获取MKDIR命令的简短帮助文本

,因为回音在do(……)之外

无需打印,您可以直接使用%%i.
另一个非常简单的示例是保存为help1.cmd的批处理

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

help1 MKDIR 

要获取MKDIR命令的简短帮助文本,需要在
for
循环中使用延迟扩展

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

不要在
变量周围使用
%
,而是使用
使用延迟扩展。

您需要在
for
循环中使用延迟扩展

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

不要在
变量周围使用
%
,而是使用
,以使用延迟扩展。

巴厘岛C解决了上述问题,但在我看来,您正在尝试获取帮助中找到的命令列表

有些命令出现在多行上,因此会出现一些无关的单词。在英语机器上还有一个以“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提出了一种更有效的算法,只提取当时的命令名,我认为这种算法适用于所有语言。我用他的想法简化了下面的代码

@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%

巴厘岛C解决了您的问题,如前所述,但在我看来,您正在尝试获取帮助中找到的命令列表

有些命令出现在多行上,因此会出现一些无关的单词。在英语机器上还有一个以“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提出了一种更有效的算法,只提取当时的命令名,我认为这种算法适用于所有语言。我用他的想法简化了下面的代码

@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%

我试过了。只有行“ECHO现在关闭”只会回显所有单词,它不会将其放入可以再次使用的变量中。这与设置变量并使用它一次的结果相同,但OP可能有其他用途。我们不知道OP的要求是什么。只需重复这个变量。我们甚至不知道OP是想要一个包含所有文本的字符串,还是一行一行的打印。试过了。只有行“ECHO现在关闭”只会回显所有单词,它不会将其放入可以再次使用的变量中。这与设置变量并使用它一次的结果相同,但OP可能有其他用途。我们不知道OP的要求是什么。只需重复这个变量。我们甚至不知道OP想要一个包含所有文本的字符串还是逐行打印。+1,我知道这是OP的问题,但不需要
“tokens=1,*”
,因为只使用了第一个token。+1,我知道这是OP的问题,但不需要
“tokens=1,*”
因为只使用了第一个令牌。