我正在尝试编写一个代码,它将从 HELP 输出的所有行中获取第一个单词并回显该变量。这是我的代码:
@echo off
set a=
for /F "tokens=1,*" %%i in ('help') do (
set a=%a% %%i
)
echo %a%
但它仅从最后一行返回第一个单词。为什么?
我正在尝试编写一个代码,它将从 HELP 输出的所有行中获取第一个单词并回显该变量。这是我的代码:
@echo off
set a=
for /F "tokens=1,*" %%i in ('help') do (
set a=%a% %%i
)
echo %a%
但它仅从最后一行返回第一个单词。为什么?
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%
您需要在for
循环中使用延迟扩展
@echo off
setlocal enabledelayedexpansion
set a=
for /F "tokens=1,*" %%i in ('help') do (
set a=!a! %%i
)
echo %a%
不是在变量%
周围使用 's ,而是使用's 来使用延迟扩展。a
!
因为回声在do之外(......)
@echo off
for /F "tokens=1,*" %%i in ('help') do (
echo %%i
)
并且不需要打印a,可以直接使用%%i。
另一个非常简单的例子可能是这样的批处理保存为 help1.cmd
@echo off
for /F "tokens=1,*" %%i in ('help') do (
if /I "%%i" EQU "%1" echo %%j
)
你把这批叫做
help1 MKDIR
获取 MKDIR 命令的简短帮助文本