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

因为回声在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 命令的简短帮助文本

于 2012-10-04T09:23:38.613 回答